MySQL5.7多源主从复制
MySQL在5.7.2上面添加了多源复制(Multi-Source)功能,意味着一个从库可以连
多个主库,从而同时进行同步,但是如果是同一个表的话,会存在主键和唯一索引冲突的风险,需要提前做好规划
MySQL多源复制的原理
个人认为MySQL能实现多源复制的关键有两点
1. MySQL5.7中的从库进行同步的SQL_THREAD,IO_THREAD可以并发执行,这使得使多数据源的binlog同时同步变为可能。
2. MySQL5.7中添加了channel(通道)来判别不同的数据源,这样slave可以非常简单的进行多数据源的配置与区分。
大概的多源复制过程
每个通道都是一个slave去拉去masters的连接,每个通道对应一个IO_THEAD,我们运行不同的“changemaster”命令, 对于每一个主服务器。我们需要用到“for channel”这个参数来提供通信链接的名字。
筛选复制数据源
配置栗子
slave 192.168.60.22:3306
master1 192.168.60.22:3307
master2 192.168.60.22:3308
主库授权:
grant all on *.*to rep@'%' identified by '123456';
从库:
配置多通道复制
#只需在原有的复制命令加 for channel ‘channel name’
change master tomaster_host='192.168.60.22',master_port=3307,master_user='rep',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154for channel 'master1';
change master tomaster_host='192.168.60.22',master_port=3308,master_user='rep',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154for channel 'master2';
GTID下进行配置多源复制
change master tomaster_host='192.168.60.22', MASTER_USER='rep', MASTER_PORT=3307,
MASTER_PASSWORD='123456',MASTER_AUTO_POSITION= 1 FOR CHANNEL 'master1';
相关通道命令
show slavestatus
show slavestatus for channel 'master1';
reset slave;
reset slave forchannel 'master1';
stop slave forchannel 'master1';
start slave forchannel 'master1';
复制实验
多源复制实验:
master1
create databasetest1;
master2
create databasetest2;
此时查看slave,发现test1和test2已经同步到slave
复制冲突实验
master1
create databasetest3;
master2
create databasetest3;
会报错!!!复制直接出错,所以,多源复制还是要进行差异化插入,如果相同数据进行操作,slave会直接出现复制异常,错误代码1007
异常解决:
stop slave;
set globalsql_slave_skip_counter=1;
使用上述参数后,只能单独开启通道,只执行startslave会报错
start slavefor channel 'master2';
start slavefor channel 'master1';
结论
MySQL5.7的多源复制,是在MySQL可以多线程同步后,依靠多线程所采取的复制模式,但是无法在master端对binlog进行筛选,所以相同操作的binlog进入slave后,slave因为无法应用而报错,在MySQL分表分库后,此模式的使用可以非常简单的merge各data shards.或者备份多个节点数据库的数据到单独的机器。
By DBTomato