MySQL5.7多源複製配置過程

MySQL5.7多源複製配置過程

~
~
MySQL多源複製使Slave可以並行接收來自多個直接Master的事務。多源複製可用於將多個服務器備份到單個服務器、合併表分片並將數據從多個服務器合併到單個服務器。在應用事務時,多源複製不會實現任何衝突檢測或解決方案,如果需要則這些任務將由應用程序。

在多源複製拓撲中,Slave會爲其接收事務的每個Master創建一個複製通道。

角色 IP
M1 192.168.75.132
M2 192.168.75.130
S 192.168.75.131

一、基礎配置說明

1)服務器設置
多源複製拓撲至少需要配置兩個主服務器和一個從屬服務器。在這裏假設兩個主服務器爲master1和master2,以及一個從服務器slavehost。從服務器將從每個主機複製一個數據庫,即從master1複製db1,從master2複製db2。

2)binlog設置
多源複製拓撲中Master端可以配置爲基於GTID的複製或基於二進制日誌位置的複製,但不運行混用。

Master配置:
log_bin =/data/mysql_5.7.22/mysql-bin
binlog_format =ROW

3)複製信息存儲設置
在多源複製拓撲中的Slave需要設置master_info_repository和relay_log_info_repository爲TABLE方式來存儲庫master信息日誌和中繼日誌信息,多源複製與FILE方式不兼容。

Slave配置:
master_info_repository =TABLE
relay_log_info_repository =TABLE

4)用戶設置
需要在每個Master上爲Slave創建一個可用得賬戶,以便獲取日誌信息;該賬戶在各個Master上可以是不同名的。如果僅出於複製目的創建帳戶,則該帳戶僅需要REPLICATION SLAVE特權:

Master1配置:

mysql> CREATE USER 'rpl_1'@'192.168.75.131' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rpl_1'@'192.168.75.131' ;
mysql> flush privileges;

Master2配置:

mysql> CREATE USER 'rpl_2'@'192.168.75.131' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rpl_2'@'192.168.75.131' ;
mysql> flush privileges;

二、基於GTID的多源複製

1、Master和Slave配置GTID:

gtid_mode =ON
enforce_gtid_consistency =ON
備註:以上2個參數,從MySQL5.7.6開始可以動態調整,之前爲靜態參數。

2、同步基礎數據

如果多源複製拓撲中的Master上的目標庫已經有數據了(不是空庫),則爲Slave進行基礎數據創建的最好方式爲使用mysqldump在每個Master導出目標庫數據並使用mysql導入Slave中(注意:開啓GTID的主庫執行dump時需要--set-gtid-purged=OFF,否則Slave上無法導入第2個庫的dump數據)。

1)Master1導出數據

mysqldump --single-transaction --default-character-set=utf8 --master-data=2 --add-drop-trigger \
--hex-blob --compress --set-gtid-purged=ON --max-allowed-packet=67108864 --opt --complete-insert \
--skip-add-drop-table -vv -E -R --database db1 -uroot -p -S /tmp/mysql_5.7.22.sock > db1.sql 

獲取備份時間點GTID信息

cat db1.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\''
79ba450d-f62c-11e9-9cea-000c29af475b:1-18

從數據文件中去除GTID信息

sed '/GTID_PURGED/d' db1.sql > db1_nopurge.sql

傳到Slave端

scp db1_nopurge.sql [email protected]:/root

2)Master2導出數據

mysqldump --single-transaction --default-character-set=utf8 --master-data=2 --add-drop-trigger \
--hex-blob --compress --set-gtid-purged=ON --max-allowed-packet=67108864 --opt --complete-insert \
--skip-add-drop-table -vv -E -R --database db2 -uroot -p -S /tmp/mysql_5.7.22.sock > db2.sql 

獲取備份時間點GTID信息

cat db2.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\''
0fa9f99e-f8a2-11e9-b5dc-000c29af475b:1

從數據文件中去除GTID信息

sed '/GTID_PURGED/d' db2.sql > db2_nopurge.sql

傳到Slave端

scp db2_nopurge.sql [email protected]:/root

3)Slave導入2個庫的數據

/usr/local/mysql_5.7.22/bin/mysql -uroot -p -S /tmp/mysql_5.7.22.sock < db1_nopurge.sql
/usr/local/mysql_5.7.22/bin/mysql -uroot -p -S /tmp/mysql_5.7.22.sock < db2_nopurge.sql

4)Slave配置GTID啓點

mysql> RESET MASTER;
mysql> SET @@GLOBAL.gtid_purged = "79ba450d-f62c-11e9-9cea-000c29af475b:1-18,0fa9f99e-f8a2-11e9-b5dc-000c29af475b:1" 

備註:設置GTID也可以在後面START SLAVE時指定。

如果是傳統複製,這使用如下配置:

mysql> CHANGE MASTER TO MASTER_HOST="master1", MASTER_USER="ted", MASTER_PASSWORD="password", \
MASTER_LOG_FILE='master1-bin.000006', MASTER_LOG_POS=628 FOR CHANNEL "master_1";

mysql> CHANGE MASTER TO MASTER_HOST="master2", MASTER_USER="ted", MASTER_PASSWORD="password", \
MASTER_LOG_FILE='master2-bin.000018', MASTER_LOG_POS=104 FOR CHANNEL "master_2";

3、爲Salve設置多源Master

在Slave上使用CHANGE MASTER TO FOR CHANNEL語句來爲每個Master配置獨享通道。如果是基於GTID的複製,則需要爲通道啓用自動尋
找同步點MASTER_AUTO_POSITION=1 。

Slave配置

mysql> CHANGE MASTER TO MASTER_HOST="192.168.75.132", MASTER_USER="rpl_1", \
       MASTER_PASSWORD="123456", MASTER_AUTO_POSITION=1 FOR CHANNEL "master_1";

mysql> CHANGE MASTER TO MASTER_HOST="192.168.75.130", MASTER_USER="rpl_2", \
MASTER_PASSWORD="123456", MASTER_AUTO_POSITION=1 FOR CHANNEL "master_2";

備註:設置鏈接的用戶信息也可以在後面START SLAVE時指定。

4、設置通道複製範圍

在5.7.29前,只能在整個Slave級別設置同步過濾範圍,如下爲只同步db1、db2兩個庫:

Slave配置

CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.%','db2.%');

從5.7.29開始,可以針對channel(通道)級別來爲每個通道指定複製過:
如,要使Slave僅複製master1中的數據庫db1,並僅複製master2中的數據庫db2,則需要使用CHANGE REPLICATION FILTER語句來做限制:

Slave配置

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.%') FOR CHANNEL "master_1";
mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db2.%') FOR CHANNEL "master_2";

5、啓動多源複製

mysql> START SLAVE FOR CHANNEL "master_1";
mysql> START SLAVE FOR CHANNEL "master_2";

備註:可以在START SLAVE時指定GTID啓點、用戶連接信息等。

6、查看各通道狀態

1)查看所有通道的複製狀態

mysql> SHOW SLAVE STATUS \G

2)查看指定的通道複製狀態

mysql> SHOW SLAVE STATUS FOR CHANNEL "master_1"\G
mysql> SHOW SLAVE STATUS FOR CHANNEL "master_2"\G

7、停止多源複製

1)停止所有通道的複製

mysql> STOP SLAVE;

2)停止指定的通道複製

mysql> STOP SLAVE FOR CHANNEL "master_1";
mysql> STOP SLAVE FOR CHANNEL "master_2";

三、多源複製維護

1、重置Slave上的主從複製信息

1)重置所有通道的主從複製信息

RESET SLAVE;

2)重置指定的通道主從複製信息

RESET SLAVE FOR CHANNEL "master_1";

備註:
RESET SLAVE只對Slave配置的主從複製信息有效,如果想重置服務器的GTID則應該用 RESET MASTER。

2、使用performance_schema庫下的表監控複製狀態

mysql> SELECT * FROM performance_schema.replication_connection_status\G;

完畢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章