MySQL 5.7 多源复制
一、概述
MySQL的多源复制允许备机从多个源同时接收事务。多源复制用于备份多个服务器的数据到一台服务器,迁移表碎片、从多个源合并数据到一台服务器。多源复制并不实现任何在应用事务时的冲突检测和解决办法,如果有需要这项任务是留给应用程序的。在多源复制过程中备机会为每个服务器建立一条复制通道。
二、配置多源复制
配置多源复制至少需要两台主服务器一台备用服务器。
多源复制的主服务器可以使用基于GTID的复制,也可以使用基于binary log位置的复制。
多源复制的备用服务器需要基于表的资源库(repository),多源复制是不兼容基于文件的资源库(repository)的。MySQL的资源库(repository)可以在启动时配置也可以动态分配。
在启动时配置:
--master-info-repository=TABLE --relay-log-info-repository=TABLE
修改已经存在的复制使用TABLE资源库,动态的修改方法如下:
STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
1、添加基于GTID的主服务器到多源服复制中
这节假定已经开始了基于GTID事务的主从复制(主服务器上开始了gtid_mode=ON),设置了复制用户,并且确定了备机使用了基于TABLE的资源库。使用CHANGE_MASTER_TO语句的FOR CHANNEL channel子句添加新的主服务器到通道中。
例如,添加一个新的主服务器,它的名字是master1,使用3451端口到一个名为master-1的通道中:
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \
MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';
多源复制兼容auto-position选项。
重复这一步用于每一个想添加到某一通道的额外的主服务器,根据情况调节主机名,端口和通道。
2、添加基于binary log的主服务器到多源复制中
这一节假定你在主服务器上使用–log-bin参数,已经开始了基于binary log的主从复制,设置了复制用户,记录了当前binary log位置,并且确定了备用服务器使用基于TABLE复制的资源库。你需要知道当前的 MASTER_LOG_FILE
和 MASTER_LOG_POSITION
。使用 CHANGE MASTER TO
的FOR CHANNEL channel子句,添加新的主服务器到通道中。例如,添加一个新的主服务器,名字是master1,端口是3451,到一个名为master-1的通道中去:
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='' \
MASTER_LOG_FILE='master1-bin.000006', MASTER_LOG_POS=628 FOR CHANNEL 'master-1';
重复这一步用于每一个想添加到某一通道的额外的主服务器,根据情况调节主机名,端口和通道。
3、开始多源复制
一旦你添加了所有要添加的主服务器后,使用START SLAVE thread_types语句开始复制。当你在备机上已经开启了多通道时,你能选择开始所有通道或选择指定通道。
- 开始当前配置的所有复制通道:
START SLAVE thread_types;
- 使用FOR CHANNEL channel子句开始指定通道:
START SLAVE thread_types FOR CHANNEL channel;
使用thread_types选项指定想使用的线程,在备机上开始。See Section 13.4.2.6, “START SLAVE Syntax” for more information.
4、停止多源复制
使用 STOP SLAVE
语句停止多源复制。默认情况, STOP SLAVE
语句停止所有的通道。使用 FOR CHANNEL
子句停止指定的通道。
channel
- 停止当前所有的复制通道:
STOP SLAVE thread_types;
- 停止指定的复制通道:
STOP SLAVE thread_types FOR CHANNEL channel;
使用thread_types选项指定想使用的线程,在备机上开始。See Section 13.4.2.6, “START SLAVE Syntax” for more information.
5、重启多源复制
使用 RESET SLAVE
语句停止多源复制。默认情况, RESET SLAVE
语句停止所有的通道。使用 FOR CHANNEL
子句停止指定的通道。
channel
- 停止当前所有的复制通道:
RESET SLAVE;
- 停止指定的复制通道:
STOP SLAVE FOR CHANNEL channel;
三、多源复制监控
监控当前存在的复制通道状态:
- 使用replication Performance Schema表。表的第一列Channel_Name。允许你基于Channel_Name作为关键字写一个复合查询。See Section 25.11.11, “Performance Schema Replication Tables”.
- 使用
SHOW SLAVE STATUS FOR CHANNEL
。默认情况下,如果没有使用FOR CHANNEL channel子句,这句显示备用服务器的状态(所有通道,每个通道一行)。标示符Channel_name做为一列显示在结果中。如果添加了FOR CHANNEL channel子句,只显示指定的通道。
channel
注意: SHOW VARIABLES
语句不能工作在多复制通道中。相关的变量信息已经移植到 replication performance表中。在多通道中使用 SHOW VARIABLES
语句,只能显示默认通道状态。
1、使用Performance Schema表监控通道
这节解释如何使用replication Performance Schema表监控通道。你可以选择所有通道或某几个通道。
监控所有通道的链接状态:
mysql> SELECT * FROM replication_connection_status\G;
*************************** 1. row ***************************
CHANNEL_NAME: master1
GROUP_NAME:
SOURCE_UUID: 046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID: 24
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET: 046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
*************************** 2. row ***************************
CHANNEL_NAME: master2
GROUP_NAME:
SOURCE_UUID: 7475e474-a223-11e4-a978-0811960cc264
THREAD_ID: 26
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET: 7475e474-a223-11e4-a978-0811960cc264:4-6
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
2 rows in set (0.00 sec)
上面输出了两个开启的通道,并且 CHANNEL_NAME
字段的内容是master1和master2。
另外可通过指定CHANNEL_NAME字段的值来查询指定的通道。如:
mysql> SELECT * FROM replication_connection_status WHERE CHANNEL_NAME='master1'\G
*************************** 1. row ***************************
CHANNEL_NAME: master1
GROUP_NAME:
SOURCE_UUID: 046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID: 24
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET: 046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
1 row in set (0.00 sec)
For more information, see Section 25.11.11, “Performance Schema Replication Tables”.
四、多源复制的错误信息
在多源复制结构中遇到的错误代码和错误信息,这些信息只有在多源复制开启后才会产生,并且这些信息是和通道绑定的。如:
Slave is already running and Slave is already stopped have been replaced with Replication thread(s) for channel channel_name
are already running and Replication threads(s) for channel channel_name
are already stopped respectively.
日志信息已经被标示到相关的通道。这更易于debug和跟踪问题。