本文是滴滴云开源框架教程系列文章的一篇。
一、多源复制概述
MySQL多源复制使复制从库能够同时从多个源接收事务。多源复制可用于将多个服务器备份到单个服务器,合并表分片,以及将来自多个服务器的数据合并到单个服务器。
二、多源复制的配置
多源复制拓扑中的主设备可以配置为使用基于全局事务标识符(GTID)的复制或二进制日志基于位置的复制。多源复制拓扑中的从库需要基于TABLE存储,多源复制与基于FILE存储不兼容。
1、配置先决条件,从库必须是基于表的存储
#salve my.cnf
master-info-repository=TABLE
relay-log-info-repository=TABLE
#动态设置
STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
2、多源复制从库
基于Binlog的多源复制
`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';`
基于GTID的多源复制
`CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \ MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';`
3、启动多源复制
启动所有复制源
`START SLAVE thread_types;`
启动单个复制源
`START SLAVE thread_types FOR CHANNEL channel;`
4、停止多源复制
启动所有复制源
`stop slave thread_types;`
启动单个复制源
`stop slave thread_types FOR CHANNEL channel;`
5、重置多源复制从库
要重置所有当前配置的复制通道:
RESET SLAVE;
要仅重置一个指定通道,请使用一个子句: FOR CHANNEL channel
RESET SLAVE FOR CHANNEL channel;
三、多源复制的监控
通过性能表监控
`mysql> use performance_schema;`
`Reading table information for completion of table and column names`
`You can turn off this feature to get a quicker startup with -A`
`Database changed`
`mysql> SELECT * FROM replication_connection_status\G;`
`*************************** 1. row ***************************`
`CHANNEL_NAME: master-1-63-3306`
`GROUP_NAME:`
`SOURCE_UUID: 24e8b84c-b568-11e7-b71d-44a842404e72`
`THREAD_ID: 50`
`SERVICE_STATE: ON`
`COUNT_RECEIVED_HEARTBEATS: 11418`
`LAST_HEARTBEAT_TIMESTAMP: 2018-03-27 18:20:11`
`RECEIVED_TRANSACTION_SET: 24e8b84c-b568-11e7-b71d-44a842404e72:17-19`
`LAST_ERROR_NUMBER: 0`
`LAST_ERROR_MESSAGE:`
`LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00`
`*************************** 2. row ***************************`
`CHANNEL_NAME: master-1-65-3306`
`GROUP_NAME:`
`SOURCE_UUID: b472e7b0-2dc7-11e8-880c-90b11c50d684`
`THREAD_ID: 52`
`SERVICE_STATE: ON`
`COUNT_RECEIVED_HEARTBEATS: 11416`
`LAST_HEARTBEAT_TIMESTAMP: 2018-03-27 18:19:48`
`RECEIVED_TRANSACTION_SET: 24e8b84c-b568-11e7-b71d-44a842404e72:17-19,`
`b472e7b0-2dc7-11e8-880c-90b11c50d684:4-6`
`LAST_ERROR_NUMBER: 0`
`LAST_ERROR_MESSAGE:`
`T_ERROR_TIMESTAMP: 0000-00-00 00:00:00`
`2 rows in set (0.00 sec)`
四、多源复制的限制
1、多源复制拓扑中的一个从库的最大通道数为256
2、每个复制通道必须具有唯一(非空)名称
每个复制通道都有一个唯一的名称,该名称是最长为64个字符的字符串,并且不区分大小写。由于通道名称用于从表,因此用于这些字符集的字符集始终为UTF-8
3、每个通道的中继日志文件和索引文件都被命名 ,其中是使用该选项指定的基本名称,并且是记录到此文件的通道的名称。
relay_log_basename-channel.xxxxxxrelay_log_basename
总结:
多源复制可以解决多个分片合并、关联查询的问题,但是也有其自身的缺点;
缺点:
1、日常维护难度增大
2、采用基于Binlog的复制,故障转移复杂(建议基于GTID)
3、随着源增加,从库压力越来越大
参考资料:
https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source-tutorials.html
滴滴云架构和数据库技术团队在实战方面积累了丰富的经验,敬请关注本系列文章的后续分享。
本文作者:陈俊川