MySQL在5.7.2上面添加了多源复制(Multi-Source)功能,意味着一个从库可以连多个主库,从而同时进行同步,但是如果是同一个表的话,会存在主键和唯一索引冲突的风险,需要提前做好规划
MySQL5.7中的从库进行同步的SQL_THREAD,IO_THREAD可以并发执行,这使得使多数据源的binlog同时同步变为可能。我们只需要对每一个Master执行Change Master 语句,只需要在每个语句最后使用For Channel来进行区分。
MySQL5.7中添加了channel(通道)来判别不同的数据源,这样slave可以非常简单的进行多数据源的配置与区分。
开始操作
前提:本次使用的binlog日志方式。手动指定binlog日志名称以及位置的方式;
# cat /etc/hosts
192.168.19.22 master1
192.168.19.21 master2
192.168.19.14 slave1
192.168.19.21 slave2
为4台虚拟机配置host解析(可做可不做)
修改4台mysql的配置文件
打开/etc/my.cnf,在[mysqld]标签下添加内容
server-id=1
log-bin=mylog
master-info-repository=TABLE
relay-log-info-repository=TABLE
#### 重新启动MySQL
[root@mysql-master1 ~]# systemctl restart mysqld
mysql-master1节点操作
[root@mysql-master1 ~]# mysql -uroot -p1
mysql> grant replication slave,replication client on *.* to 'master1'@'%' identified by '1'; --创建同步使用的用户
mysql> flush privileges;
mysql-master2操作如同mysql-master1一样步骤
双主配置
查看mysql-master2的binlog日志名称和位置:
在mysql-master1上指定操作:
mysql> change master to --设置mysql-mastre2为自己的主节点
master_host='192.168.194.199',
master_user='master2',
master_password='1',
master_log_file='mylog.000001',
master_log_pos=612 for channel 'zhu2';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
mysql> show slave status\G
查看mysql-master1的binlog日志名称和位置:
在mysql-master2上指定操作:
mysql> change master to --设置mysql-mastre1为自己的主节点
master_host='192.168.194.130',
master_user='master1',
master_password='1',
master_log_file='mylog.000001',
master_log_pos=612 for channel 'zhu1';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
mysql> show slave status\G
2台分别查看同步的io线程和sql线程是否为YES
mysql> show slave status\G
mysql> show slave status\G
常用操作:
# 查看单个channel的状态
mysql> show slave status for channel 'mysql-master2'\G
# 停止单个channel同步
mysql> stop slave for channel 'mysql-master2';
# 开启单个channel同步
mysql> start slave for channel 'mysql-master2';
# 重置单个channel
mysql> reset slave for channel 'mysql-master2';
# 查看所有channel
mysql> show slave status\G
# 开启所有channel
mysql> start slave;
双从配置
mysql-slave1
[root@mysql-slave1 ~]# systemctl start mysqld
[root@mysql-slave1 ~]# mysql -uroot -p'1'
mysql> change master to --设置mysql-mastre1为自己的主节点
master_host='192.168.194.130',
master_user='master1',
master_password='1',
master_log_file='mylog.000001', --我这里不一样,根据你自己的名称和位置去写
master_log_pos=154 for channel 'zhu1';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> change master to --设置mysql-mastre2为自己的主节点
master_host='192.168.194.199',
master_user='master2',
master_password='1',
master_log_file='mylog.000001', --我这里不一样,根据你自己的名称和位置去写
master_log_pos=612 for channel 'zhu2';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave for channel 'zhu1';
Query OK, 0 rows affected (0.00 sec)
mysql> start slave for channel 'zhu2';
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
mysql-slave2同样操作
[root@mysql-slave1 ~]# systemctl start mysqld
[root@mysql-slave1 ~]# mysql -uroot -p'1'
mysql> change master to --设置mysql-mastre1为自己的主节点
master_host='192.168.194.130',
master_user='master1',
master_password='1',
master_log_file='mylog.000001', --我这里不一样,根据你自己的名称和位置去写
master_log_pos=154 for channel 'zhu1';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> change master to --设置mysql-mastre2为自己的主节点
master_host='192.168.194.199',
master_user='master2',
master_password='1',
master_log_file='mylog.000001', --我这里不一样,根据你自己的名称和位置去写
master_log_pos=612 for channel 'zhu2';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave for channel 'zhu1';
Query OK, 0 rows affected (0.00 sec)
mysql> start slave for channel 'zhu2';
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
最后查看验证。