从mysql的sharding看多源复制

多源复制(Multi-Source Replication)最初由阿里云数据库RDS团队提出并实现的,主要在 MySQL 基于 Binary Log 单向一对多复制的基础上,实现了节点之间的多对多的复制,使数据可以在多个节点上自由聚合和拆分。在 MySQL 5.7.6 版本被官方收录并正式发布。

提问:如果现有业务数据库(trade)已经基于买家(buyerId)作为拆分键实施了db sharding,意味这你所有的查询必须基于buyerId,那对于有基于卖家(sellerId)的查询需要怎么办?

是的,这确实是个难题!

一般而言能想到的方法:

  1. 保留原始映射,要先找到buyerId,在查询sellerId类需求时添加where条件buyerId
  2. 基于sellerId继续拆分,也就是说拆分键有两个:buyerId、sellerId

这些确实比较凑合的方案,难道就没有别的方式了吗?

有的,我在之前已经分享数据库主从复制,它更多呈现的是对称复制(主从的数据与结构一致,见下图1),其实mysql最新的版本也支持非对称复制(而多源复制就是其中一种表现形态,见下图2)。

从mysql的sharding看多源复制_第1张图片

从mysql的sharding看多源复制_第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)

更多可参阅官方介绍。

引用资料

  • 阿里云获MySQL社区2018年度公司贡献奖

你可能感兴趣的:(oracle,sqlserver,mysql,mysql)