多源复制(Multi-Source Replication)最初由阿里云数据库RDS团队提出并实现的,主要在 MySQL 基于 Binary Log 单向一对多复制的基础上,实现了节点之间的多对多的复制,使数据可以在多个节点上自由聚合和拆分。在 MySQL 5.7.6 版本被官方收录并正式发布。
提问:如果现有业务数据库(trade)已经基于买家(buyerId)作为拆分键实施了db sharding,意味这你所有的查询必须基于buyerId,那对于有基于卖家(sellerId)的查询需要怎么办?
是的,这确实是个难题!
一般而言能想到的方法:
这些确实比较凑合的方案,难道就没有别的方式了吗?
有的,我在之前已经分享数据库主从复制,它更多呈现的是对称复制(主从的数据与结构一致,见下图1),其实mysql最新的版本也支持非对称复制(而多源复制就是其中一种表现形态,见下图2)。
1. 配置多源复制
多源复制拓扑至少需要配置两个主设备和一个从设备。
Master
多源复制拓扑中的主服务器可以配置为使用基于两种方式:
1. 基于全局事务标识符(GTID)的复制
可参阅 Section 16.1.3.4, “Setting Up Replication Using GTIDs”,启用配置 gtid_mode=ON
,启用一个用于复制用户,并确保slave使用基于TABLE的复制存储库。
使用端口3451将主机名为master1的新主机添加到名为master-1的管道中
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \
MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';
2. 基于二进制日志位置的复制
“Setting the Replication Master Configuration” 中有使用基于文件位置的复制的配置,启用配置--log-bin
,启用一个用于复制用户,记录在当前二进制日志位置,并确保slave使用基于TABLE的复制存储库。
使用端口3451将主机名为master1的新主机添加到名为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';
slave
多源复制拓扑中的从服务器需要基于TABLE的存储库。多源复制与基于FILE的存储库不兼容。mysqld使用的存储库类型可以在启动时配置,也可以动态配置。请使用以下选项启动mysqld:--master-info-repository=TABLE --relay-log-info-repository=TABLE
#也可以动态调整命令为:
STOP SLAVE; #如果主从复制正在进行,需要先停掉
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
设置完Master源后,启动slave进行复制
START/STOP SLAVE; //启动或停止所有线程所有管道的复制
START/STOP SLAVE SQL_THREAD; //启动或停止所有管道的SQL_THREAD线程
START/STOP SLAVE IO_THREAD; //启动或停止所有管道的IO_THREAD线程
RESET SLAVE; //重置所有管道
RESET SLAVE FOR CHANNEL CHANNELNAME; //重置单一管道
SHOW SLAVE STATUS //检查复制状态
比如:
START SLAVE FOR CHANNEL 'master_3306';
START SLAVE SQL_THREAD FOR CHANNEL 'master_3306';
START SLAVE IO_THREAD FOR CHANNEL 'master_3306';
更多参阅官方文档
它提供了使用复制性能模式表来监视管道(channel)。您可以选择监视所有管道或现有管道的一个子集。
要监视所有管道的连接状态:SELECT * FROM replication_connection_status
*************************** 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)
更多可参阅官方介绍。