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;
完畢!