一、应用场景
某些业务有地域属性的区分,有跨地域灾备的需求;某些全国性业务或全球性业务,对本地服务响应时间要求较高,但由于跨地域的网络延迟的问题,集中部署的数据库无法满足服务对于性能的要求。应对以上场景可以采用两地分别部署数据库,两套数据库做双向复制的方案。
二、技术架构
部署拓扑
上图通过颜色区分了两个集群复制组件的部署情况,其中 pump 为 binlog 生成组件,drainer 为 binlog 消费组件。两个集群互为上下游。
技术实现
在 A 和 B 两个集群间开启双向复制,则写入集群 A 的数据会复制到集群 B 中,然后这部分数据又会继续复制到集群 A,这样就会出现无限循环复制的情况。如上图所示,在复制数据的过程中 Drainer 对 binlog 加上标记,通过过滤掉有标记的 binlog 来避免循环复制。详细的实现流程如下:
- 为两个集群分别启动 TiDB Binlog 复制程序。
- 待复制的事务经过 A 的 Drainer 时,Drainer 为事务加入 _drainer_repl_mark 标识表,并在表中写入本次 DML event 更新,将事务复制至集群 B。
- 集群 B 向集群 A 返回带有 _drainer_repl_mark 标识表的 binlog event。集群 B 的 Drainer 在解析该 binlog event 时发现带有 DML event 的标识表,放弃复制 binlog event 到集群 A。
三、注意事项
(1)应用需要具备切分流量的功能,将不同区域的数据分发到对应的 TiDB 集群。只需有一个统一版本的应用服务。其整体架构如下:
(2)为防止数据冲突,应使用主键或唯一索引进行流量切分;
(3)为避免写入冲突,应避免使用自增列,主键的生成策略需要增加带有地区属性的标识位;
(4)DDL 只能在其中一个 TiDB 集群中执行。
目录