MySQL5.7多源复制配置过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL5.7多源复制配置过程相关的知识,希望对你有一定的参考价值。

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@192.168.75.131:/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@192.168.75.131:/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_statusG;

完毕!

以上是关于MySQL5.7多源复制配置过程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.7的多源复制

MySQL5.7多源复制

MySQL5.7多源复制的实验

Mysql5.7.12多源复制 xtrabackup

Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法

MySQL多源复制