一、需求
为保障TiDB集群的高可用,需要搭建双向复制,两个集群都可写入数据。应用侧来控制,避免两个集群写入数据的冲突。
二、部署
1、两集群同时扩容ticdc:
scale-out-primary-cdc.toml
cdc_servers:
- host: 10.211.55.30 ssh_port: 22 port: 8300 deploy_dir: "/tidb-deploy/cdc-8300" data_dir: "/tidb-data/cdc-8300" log_dir: "/tidb-deploy/cdc-8300/log"
scale-out-second-cdc.toml
cdc_servers:
- host: 10.211.55.30 ssh_port: 22 port: 8300 deploy_dir: "/tidb-deploy/cdc-8300" data_dir: "/tidb-data/cdc-8300" log_dir: "/tidb-deploy/cdc-8300/log"
tiup cluster scale-out test ./scale-out-cdc.toml
tiup cluster scale-out test1 ./scale-out-cdc.toml
2、两集群准备changefeed配置文件
配置一:只同步dml
changefeed_tidb_test.toml bdr-mode = true [filter] rules = ['.', '!test.'] [[filter.event-filters]] matcher = [".*"] ignore-event = ["all ddl"] # 过滤掉ddl 事件
配置二:同步部分DDL(v7.0.6开始支持同步DDL,详情见TiCDC 双向复制 | TiDB 文档中心)
changefeed_tidb_test.toml bdr-mode = true [filter] rules = ['.', '!test.']
同步DDL时,需要设置BDR role,PRIMARY和SECONDARY。
(1)该方式只能PRIMARY集群执行DDL,SECONDARY无法执行DDL,只能同步DDL。
集群一:
mysql> ADMIN SET BDR ROLE PRIMARY;
集群二:
mysql> ADMIN SET BDR ROLE SECONDARY;
(2)该方式两个集群都可以执行DDL,但是要确保DDL不出现冲突。
集群一:
mysql> ADMIN SET BDR ROLE PRIMARY;
集群二:
mysql> ADMIN SET BDR ROLE PRIMARY;
3、两集群同时创建changefeed,创建前保证数据一致或者通过 --start-ts 指定 tso: tiup cdc cli changefeed create --server=http://10.211.55.30:8300 --sink-uri="tidb://root:@10.211.55.31:4000/" --changefeed-id="simple-primary-task" --config ./changefeed_tidb_test.toml
tiup cdc cli changefeed create --server=http://10.211.55.31:8300 --sink-uri="tidb://root:@10.211.55.30:4000/" --changefeed-id="simple-second-task" --config ./changefeed_tidb_test.toml
4、检查两集群同步状态 tiup cdc cli changefeed --server=http://10.211.55.30:8300 list tiup cdc cli changefeed query -s --server=http://10.211.55.30:8300 --changefeed-id simple-primary-task
tiup cdc cli changefeed --server=http://10.211.55.31:8300 list tiup cdc cli changefeed query -s --server=http://10.211.55.31:8300 --changefeed-id simple-second-task
三、总结
双向复制场景目前应用并不广泛,DDL 只有 PRIMARY 的角色才能执行,若想双向同步DDL需要都设置为 PRIMARY,但是同步的DDL有限(DROP无法同步),需结合自身场景进行方案选择。
另外,该场景下还有较多限制,需要应用测保证写入不冲突。