Mysql 多主一从即多源复制

环境信息

  • Mysql 5.7 之后版本支持多主一从

配置步骤

分别在 Master_1 和 Master_2 上导出需要同步的数据库

分别在 Master_1 和 Master_2 上执行以下命令,导出需要同步的数据库备份

Master_1
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases  --add-drop-database  db1  > db1.sql
Master_2
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases  --add-drop-database  db2  > db2.sql

备份完成后,将备份数据拷贝到从库服务器上面

在 Master_1 和 Master_2 上创建复制账号

如果已有复制账号,跳过此步骤

分别在 Master_1 和 Master_2 上执行以下命令,创建复制账号

Master_1 Master_2
grant replication slave on *.* to 'repl'@'%' identified by '123456';

更改 slave 配置以支持多主一从

mysql 支持多主一从(多源复制)的关键配置。
要配置 mysql 支持多源复制,必须配置 mysql 存储同步信息的方式,主要有以下 2 种方式 [1]

  • FILE 默认配置,此时同步信息存储在文件 master.info 和 relay-log.info
  • TABLE 同步信息存储在 mysql.slave_master_info 和 mysql.slave_relay_log_info

更改 mysql 配置文件(默认/etc/my.cnf),配置存储同步信息的方式

/etc/my.cnf
master_info_repository=TABLE
relay_log_info_repository=TABLE

更改配置后,重启 mysql 生效

slave 上恢复 Master_1 和 Master_2 的备份数据

slave
mysql -uroot -p  < db1.sql
mysql -uroot -p < db2.sql

因为在 mysqldump 备份时,使用了选项 --add-drop-database ,slave 导入备份时,无需指定 db

slave 上配置多源复制

找到配置主从需要的 binlog 位置和 Pos 位置

分别在 Master_1 和 Master_2 的备份数据中,查找以下内容,找到需要的 binlog 位置和 Pos 位置

slave
cat db1.sql |grep " CHANGE MASTER"
cat db2.sql |grep " CHANGE MASTER"

这些信息是由 mysqldump 的选项 --master-data=2 提供 [2]
结果中包含以下类似内容:

CHANGE MASTER TO MASTER_LOG_FILE=’log-bin.000001’, MASTER_LOG_POS=1539;

登录 salve 数据库配置多源复制

登录 slave 数据库,分别执行以下命令,创建到 Master_1 和 Master_2 的复制

slave
CHANGE MASTER TO MASTER_HOST='Master_1',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000001',MASTER_LOG_POS=1539 FOR CHANNEL 'Master_1';
CHANGE MASTER TO MASTER_HOST='Master_2',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000001',MASTER_LOG_POS=1539 FOR CHANNEL 'Master_2';

不同的主从复制以最后的 FOR CHANNEL 来区分

启动主从复制

在 slave 数据库中执行以下命令分别启动复制

slave
start slave for channel "Master_1";
start slave for channel "Master_1";

也可以通过 start slave; 启动所有的复制

可以通过以下命令查看启动复制后的状态

slave
SHOW SLAVE STATUS FOR CHANNEL 'Master_1'\G
SHOW SLAVE STATUS FOR CHANNEL 'Master_2'\G
SHOW SLAVE STATUS\G

参考链接

Mysql 官网

脚注