MySQL多源复制实战

135 阅读5分钟
原文链接: blog.didiyun.com

本文是滴滴云开源框架教程系列文章的一篇。

一、多源复制概述

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';
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的多源复制

`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';`
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的多源复制

`CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \ MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';`
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、启动多源复制

启动所有复制源

`START SLAVE thread_types;`
1
2
`START SLAVE thread_types;`
 

启动单个复制源

`START SLAVE thread_types FOR CHANNEL channel;`
1
2
`START SLAVE thread_types FOR CHANNEL channel;`
 

4、停止多源复制

启动所有复制源

`stop slave thread_types;`
1
2
`stop slave thread_types;`
 

启动单个复制源

`stop slave thread_types FOR CHANNEL channel;`
1
2
`stop slave thread_types FOR CHANNEL channel;`
 

5、重置多源复制从库

要重置所有当前配置的复制通道:

RESET SLAVE;
1
2
RESET SLAVE;
 

要仅重置一个指定通道,请使用一个子句: FOR CHANNEL channel

RESET SLAVE FOR CHANNEL channel;
1
2
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
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、每个通道的中继日志文件和索引文件都被命名 ,其中是使用该选项指定的基本名称,并且是记录到此文件的通道的名称。

relay_log_basename-channel.xxxxxxrelay_log_basename
1
2
relay_log_basename-channel.xxxxxxrelay_log_basename
 

总结:

多源复制可以解决多个分片合并、关联查询的问题,但是也有其自身的缺点;

缺点:

1、日常维护难度增大

2、采用基于Binlog的复制,故障转移复杂(建议基于GTID)

3、随着源增加,从库压力越来越大

参考资料:

dev.mysql.com/doc/refman/…

滴滴云架构和数据库技术团队在实战方面积累了丰富的经验,敬请关注本系列文章的后续分享。

本文作者:陈俊川