程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> centosamoeba+mysql主從集群分離

centosamoeba+mysql主從集群分離

編輯:MySQL綜合教程

centosamoeba+mysql主從集群分離


配置主從之前最好不要填寫同步的數據庫,默認都同步所有數據庫就行。
mysql 本機自帶的,java 本機自帶的。 1、登錄Master服務器,修改my.cnf,添加如下內容;
server-id = 1 //數據庫ID號, 為1時表示為Master,其中master_id必須為1到232–1之間的一個正整數值;
log-bin=mysql-bin //啟用二進制日志;
binlog-do-db=data //需要同步的二進制數據庫名; (最好不要寫,默認就同步所有數據庫了)
log=/usr/local/log/mysql.log 日志位置。需要創建目錄和改變權限chmod、chown命令
{上邊配置主庫已經夠用了,下邊我列出一些東西可以根據自己需要添加
default-storage-engine=innodb –默認的存儲引擎,現在Mysql的主打存儲引擎
innodb_data_home_dir =/data –innodb的數據家目錄
innodb_data_file_path =ibdata1:50M:autoextend –innodb的數據存儲文件,當寫絕對路徑時,innodb_data_home_dir要為空,這樣可以指定多個存儲文件,使用分號隔開
server-id = 1 –mysql服務器的id號:(1-2^32),id號越小優先級越高
log-bin = /dblog/mysqld-bin –二進制日志
max-binlog-size = 10M –mysqlbinlog的單個文件最大是10M
expire_logs_days = 10 –日志最大存儲日期
#logs
slow_query_log = /dblog/slow.log –慢日志,在生產環境一定要記得開啟
long_query_time = 2 –定義超過2秒的查詢屬於慢查詢
log-queries-not-using-indexes=1
log-error = /dblog/mysqld.err –錯誤日志
查詢日志不要開,因數據大,影響I/O,排錯才使用。
log-bin:每次重啟Mysql都會產生一個新的文件
# mkdir /data –建立數據存放目錄
# mkdir /dblog –建立日志存放目錄
# chmod 700 /data/ /dblog –修改權限
# chown mysql.mysql /data /dblog/ -R
# mysql_install_db –datadir=/data –user=mysql –進行初始化
# service mysql start –啟動服務,如出現找不到PID,請檢查selinux,iptables是否開啟
}
2、建立復制所要使用的用戶;
(先說登錄,登錄不進去就沒法授權和建立用戶) 本機自帶的mysql 登錄 第一次沒有密碼 為空 直接登錄就可以
設置密碼的命令如下:mysqladmin -uroot -p(舊密碼,沒有就不寫) password 新密碼 然後回車
會提示輸入密碼,不用輸入密碼,直接回車就可以了,密碼就設置了。
建立復制用戶命令 mysql>grant replication slave on *.* to 'slave'@'%' IDENTIFIED BY '888888'
3、重啟mysql;
service mysqld restart
4 、(如果同步的主庫有數據,則需要備份,沒有則略過這一步)現在備份Master上的數據;
鎖定後我直接tar.gz data這個庫文件;
mysql>FLUSH TABLES WITH READ LOCK;
cd /var/lib/mysql
tar data.tar.gz data
接著直接執行了遠程scp;
scp ./data.tar.gz root@ip地址:/var/lib/mysql
主庫解鎖命令是 mysql>unlock tables;
5、授權以後,查看主庫狀態,
登錄mysql 授予登錄權限,給遠程ip賦予登錄權限mysql>grant all privileges on *.* to 'root'@'%'identified by '888888'with grant option;單獨給IP賦予遠程管理權限是mysql>grant all privileges on *.* to 'root'@'遠程的ip'identified by '888888'with grant option;給本地賦予權限是 grant
all privileges on *.* to 'root'@'localhost' identified by 'root' with grant option)
查看狀態:mysql>show master status\G
記錄pos和第一個文件名稱。從庫同步需要用(同第9步一樣)
查看了主庫狀態,就不要在主庫上做任何操作,否則file攔文件會改變。
6 slave 設置
登錄Slave數據庫服務器,修改my.cnf;
server-id = 3 //2已經被用在另一個服務器上了,如果以後要再加Slave號接著往後數就OK了;
log-bin=mysql-bin
master-host = 主庫ip
master-user = slave
master-password = 888888
master-port = 3306
master-connect-retry=60 //如果發現主服務器斷線,重新連接的時間差;
replicate-do-db=data //需要備份的數據庫
7 解壓剛才從Master scp過來的文件,此處不用改權限、屬主,默認沒有改變,可以根據實際情況進行修改;


8、上述完成後,可以啟動slave了;查看slave狀態;
mysql>slave start;
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.1
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: updatelog.000001
Read_Master_Log_Pos: 106
Relay_Log_File: onlinevc-relay-bin.000013
Relay_Log_Pos: 1069
Relay_Master_Log_File: updatelog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: data
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 1681
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)

9、查看Master上面的狀態;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| updatelog.000012 | 15016 | data | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

由此可見兩者的File、Position存在問題,所要要去Slave上設置對應主庫的Master_Log_File、Read_Master_Log_Pos;執行如下語句;
mysql>slave stop;
mysql>CHANGE MASTER TO MASTER_HOST='主庫ip',MASTER_USER='slave', MASTER_PASSWORD='******',MASTER_LOG_FILE='updatelog.000012',MASTER_LOG_POS=15016;
確保 Slave_IO_Running: Yes 、Slave_SQL_Running: Yes都要為YES才能證明Slave的I/O和SQL進行正常


10、在這期間登錄mysql經常會用到一些語句,我寫下來。
show databases;
show tables;
create database 庫明
create table 表明(id int, name varchar(100));
insert into values(a,tom)
create table 表明(id int)
insert into 表明 values(1)
drop table 表明
delete from user where user='刪除用戶'
select * from user,host from user; 查看用戶和登錄權限的
use 庫明


MySQL插入100萬條記錄測試 存儲過程
BEGIN
#Routine body goes here...
DECLARE i INT DEFAULT 0;
WHILE i < 1000000 DO
INSERT INTO test values(i, concat('zhangsan',i));
SET i = i + 1;
END WHILE;
END



裝amoeba之前,要把amoeba連接數據庫的用戶名和密碼一定要授權,命令如下:
建立amoeab用戶賦予權限命令:grant all on *.* to 'amoebauser'@'%'identified by 'amoebapassword'
注:在mysql主庫上邊授權.
10、Amoeba的安裝
Amoeba下載地址:http://sourceforge.net/projects/amoeba/
mkdir /usr/local/amoeba
wget http://softlayer.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
tar xzf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
配置全局環境變量
vi /etc/profile
export PATH=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/
export AMOEBA_HOME=/usr/local/amoeba
export PATH=/usr/local/amoeba/bin:$PATH
說一下java的變量,可以用which java 和whereis java去查找,找不到就用 find / -name java 查找,不要被連接文件糊弄了。要看清楚。
我這裡就用 find / -name java 查找的。
然後 讓環境變量生效
source /etc/profile


11、Amoeba for mysql配置

配置Amoeba for mysql的讀寫分離主要涉及兩個文件:
1、/usr/local/amoeba/conf/dbServers.xml
此文件定義由Amoeba代理的數據庫如何連接,比如最基礎的:主機IP、端口、Amoeba使用的用戶名和密碼等等。
2、/usr/local/amoeba/conf/amoeba.xml
此文件定義了Amoeba代理的相關配置。

dbServers.xml文件配置

abstractServer配置:
<dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>


<!-- mysql port -->
<property name="port">3306</property>


<!-- mysql schema -->
<property name="schema">dbname</property>


<!-- mysql user -->
<property name="user">root</property>


<!-- mysql password -->
<property name="password">root</property>


</factoryConfig>


<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>

此部分定義真實mysql服務器的端口,數據庫名稱,mysql用戶及密碼。

主從數據庫定義:

<dbServer name="Master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.1</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.2</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.3</property>
</factoryConfig>
</dbServer>
<dbServer name="virtualSlave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>


<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">Slave1,Slave2</property>
</poolConfig>
</dbServer>

此部分定義主服務器,從服務器,及從服務器連接池。這裡只定義數據庫地址,它們的用戶及密碼就是上面的abstractServer裡的設置。注意用來連接真實mysql服務器的用戶必須擁有遠程連接權限。

amoeba.xml配置

amoeba連接驗證配置:

<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">


<property name="user">root</property>


<property name="password">root</property>


<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>

這裡定義連接amoeba時用來驗證的用戶及密碼。

讀寫分離配置:

<property name="defaultPool">Master</property>
<property name="writePool">Master</property>
<property name="readPool">virtualSlave</property>

defaultPool:配置了默認的數據庫節點,一些除了SELECTUPDATEINSERTDELETE的語句都會在defaultPool執行。

writePool :配置了數據庫寫庫,通常配為Master,如這裡就配置為之前定義的Master數據庫。

readPool :配置了數據庫讀庫,通常配為Slave或者Slave組成的數據庫池,如這裡就配置之前的virtualSlave數據庫池。

amoeba啟動

啟動命令:

amoeba start (前台啟動可以查看報錯信息

 

執行:/usr/local/amoeba/bin/amoeba可能會遇到以下錯誤:
The stack size specified is too small, Specify at least 160k Could not create the Java virtual machine.

修改 amoeba 文件,vi /usr/local/amoeba/bin/amoeba,找到如下的文件:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
將其修改為:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k

再次執行/usr/local/amoeba/bin/amoeba,如果出現amoeba start|stop 就可以啟動amoeba了
# /usr/local/amoeba/bin/amoeba start

此命令以前台的方式啟動,會輸出啟動時的信息,檢查沒有錯誤信息後,中斷,並後台運行:

nohup amoeba start &(後台啟動命令)

 

進行mysql操作的時候查看nohup日志發現Could not create a validated object, cause: ValidateObject failed

無法連接,主要可能是:

dbServer.xml中的數據庫密碼配置 是否出錯

數據庫名稱是否出錯 scheme

還有一些錯誤我列出來,

比如 我想把mysql從庫改為主庫,這時候你更改完所有配置文件,你在主庫上邊mysql> show master status查看時候,可以看到以前打的連接狀態,怎麼辦?

需要登錄mysql 執行以前命令

mysql> slave stop;

mysql>change master to master_host=' '; 就可以了

 

mysql 主從集群做好了後,這時候一不小心從主庫上刪掉一個數據庫數據,從庫沒有這個數據庫,這時候 Slave_SQL_Running: NO,會變成NO,解決方法有兩種如下

記錄File和Position對應的值。

mysql> show master status;

+------------------+-----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+-----------+--------------+------------------+

| mysql-bin.000013 | 330748356| | |

+------------------+-----------+--------------+------------------+

1 row in set (0.00 sec)

到slave服務器上執行手動同步:

mysql> slave stop;

mysql> change master to

> master_log_file='mysql-bin.000013',

> master_log_pos=330748356;

1 row in set (0.00 sec)

mysql> slave start;

1 row in set (0.00 sec)

再次查看slave狀態發現:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

...

Seconds_Behind_Master: 0

解決辦法二:

mysql> slave stop;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> slave start;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved