本文是滴滴云开源框架教程系列文章的一篇。
一、多源复制概述
MySQL多源复制使复制从库能够同时从多个源接收事务。多源复制可用于将多个服务器备份到单个服务器,合并表分片,以及将来自多个服务器的数据合并到单个服务器。
二、多源复制的配置
多源复制拓扑中的主设备可以配置为使用基于全局事务标识符(GTID)的复制或二进制日志基于位置的复制。多源复制拓扑中的从库需要基于TABLE存储,多源复制与基于FILE存储不兼容。
1、配置先决条件,从库必须是基于表的存储
1 2 3 4 5 6 7 8 9 |
#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的多源复制
1 2 |
`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的多源复制
1 2 |
`CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \ MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';` |
3、启动多源复制
启动所有复制源
1 2 |
`START SLAVE thread_types;` |
启动单个复制源
1 2 |
`START SLAVE thread_types FOR CHANNEL channel;` |
4、停止多源复制
启动所有复制源
1 2 |
`stop slave thread_types;` |
启动单个复制源
1 2 |
`stop slave thread_types FOR CHANNEL channel;` |
5、重置多源复制从库
要重置所有当前配置的复制通道:
1 2 |
RESET SLAVE; |
要仅重置一个指定通道,请使用一个子句: FOR CHANNEL channel
1 2 |
RESET SLAVE FOR CHANNEL channel; |
三、多源复制的监控
通过性能表监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
`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、每个通道的中继日志文件和索引文件都被命名 ,其中是使用该选项指定的基本名称,并且是记录到此文件的通道的名称。
1 2 |
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
滴滴云架构和数据库技术团队在实战方面积累了丰富的经验,敬请关注本系列文章的后续分享。
本文作者:陈俊川