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 :/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 :/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;
完毕!