TiCDC 双向复制
从 v6.5.0 版本开始,TiCDC 支持在两个 TiDB 集群之间进行双向复制。基于该功能,你可以使用 TiCDC 来构建 TiDB 集群的多写多活解决方案。
本文档以在两个 TiDB 集群之间进行双向复制为例,介绍双向复制的使用方法。
部署双向复制
TiCDC 复制功能只会将指定时间点之后的增量变更复制到下游集群。开始双向复制之前,需要采取以下步骤:
(可选)根据实际需要,使用数据导出工具 Dumpling 和导入工具 TiDB Lightning 将两个集群的数据导入到对方集群。
在这两个 TiDB 集群之间部署两套 TiCDC 集群,集群的拓扑如下图所示,图中箭头所指的方向即为该 TiCDC 集群同步数据的流向。
指定上下游集群的数据同步的开始时间点。
确认上下游集群的时间点。如果进行双集群容灾,那么建议确保两个集群在某个对应的时刻的数据是一致的,例如 TiDB A 在
ts=1
时刻与 TiDB B 在ts=2
的时刻数据是一致的。在创建同步任务时,分别把对应集群的同步任务的
--start-ts
参数指定为对应的tso
,即上游为 TiDB A 的同步任务需设置参数--start-ts=1
,上游为 TiDB B 的同步任务需设置参数--start-ts=2
。
在创建同步任务的
--config
参数所指定的配置文件中,添加如下配置:# 是否启用 bdr 模式
bdr-mode = true
(可选)如果需要追踪数据写入源,可以使用 TiDB 系统变量 tidb_source_id 为集群设置不同的数据源 ID。
这样,以上搭建好的集群即可对数据进行双向复制。
执行 DDL
双向复制的集群不支持同步 DDL。
如果需要执行 DDL,采取以下步骤:
- 暂停所有集群中需要执行 DDL 的对应的表的写入操作。如果是添加非唯一索引,不用暂停写入。
- 等待所有集群中对应表的所有写入已经同步到其他集群后,手动在每一个 TiDB 集群上单独执行所有的 DDL。
- 等待 DDL 完成之后,重新恢复写入。
注意,添加非唯一索引 DDL 不会引起双向复制链路中断,因此不用停止对应表的写入。
停止双向复制
在业务数据停止写入之后,你可以在两个集群中都插入一行特殊的值,通过检查这两行特殊的值来确保数据达到了一致的状态。
检查完毕之后,停止同步任务即可停止双向复制。
使用限制
DDL 的限制见执行 DDL 小节。
双向复制的集群不具备检测写冲突的功能,写冲突将会导致未定义问题。你需要在业务层面保证不出现写冲突。
TiCDC 双向复制功能支持超过 2 个集群的双向同步,但是不支持多个集群级联模式的同步,即 TiDB A -> TiDB B -> TiDB C -> TiDB A 的环形复制方式。在这种部署方式下,如果其中一个链路出现问题则会影响整个数据同步链路。因此,如果需要部署多个集群之间的双向复制,每个集群都需要与其他集群两两相连,即
TiDB A <-> TiDB B
,TiDB B <-> TiDB C
,TiDB C <-> TiDB A
。