0
0
1
0
博客/.../

TiCDC 双向复制验证

 克里克里克  发表于  2026-07-30

注:该文档省略了数据初始化的过程。

基础环境信息

主从IP信息

主:40.121 原有3节点集群,haproxyIP为 40.120。

备:40.122 playground临时环境,原集群中的一个节点,使用不同的端口。

注意:bdr-mode = true参数在双向同步复制里是必备的,否则会造成数据的无限循环

配置临时tidb 122

tiup playground v8.5.4 --db 1 --pd 1 --kv 1 --tiflash 0 --ticdc 1 --ticdc.host 192.1.40.122 --ticdc.port 8400 --without-monitor --host=192.1.40.122 --db.port 4001

TiCDC 双向复制配置

配置前检查

1)无效索引表

with valid_table as
(
select * from tidb_indexes d where d.TABLE_SCHEMA not in ('mysql','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA','METRICS_SCHEMA') and d.KEY_NAME ='PRIMARY' and d.NON_UNIQUE =0
)
select * from TABLES t left join valid_table v on t.TABLE_SCHEMA =v.table_schema and t.table_name=v.table_name
where 1=1 
and t.TABLE_SCHEMA not in ('mysql','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA','METRICS_SCHEMA','sys','nacos') 
and v.table_name is null and t.TABLE_TYPE  not in ('VIEW')
order by t.TABLE_SCHEMA ,t.TABLE_NAME ;

无效索引表是否有非程序使用的临时表。

2)自增键步长修改-双向同步复制检查

修改参数:auto_increment_increment,主库备份前步长修改为2;

灾备库步长调整为3;

set global auto_increment_increment=2; -- 主

set global auto_increment_increment=3; -- 备

修改后需要重启tidb server,否则无法知道连接是否都是在修改参数后新建的,会话步长是否修改。

3)不可同步的DDL检查-双向复制同步(主要针对truncate操作);

select * from information_schema.ddl_jobs d where d.job_type='truncate table' and d.db_name not in ('temp') order by d.CREATE_TIME desc;

4)大事务的拆分

避免超过1W条更新的事务。

select * from information_schema.cluster_slow_query d where 1=1 and d.db='ddd' and d.user='root' and d.conn_id>0

and d.Time > ADDDATE(now(),-5) and d.Write_keys >5000 order by d.time desc;

5)删除多余的序列

select from information_schema.tables d where d.table_type in ('SEQUENCE');

6)创建同步账户my_sync

create user my_sync@'%' identified by 'admin';
grant all on *.* to my_sync@'%';
-- 从库设置只读,需要赋予严格复制权限
grant RESTRICTED_REPLICA_WRITER_ADMIN on *.* to my_sync;
set global tidb_restricted_read_only=on; --该参数会默认将tidb_super_read_only设置为on,仅允许ticdc的数据进行写入,其它所有操作均禁止。

7)如果不配置双向同步的演练操作(业务停止窗口较长)TiDB-TiCDC主备计划内演练步骤

8)演练期间禁止执行DDL操作

双向复制配置

账户配置

create user my_sync@'%' identified by 'admin';

grant all on . to my_sync@'%';

-- 查看 cdc的master节点

tiup cdc cli capture list --pd=http://192.1.40.121:2379

-- Master端配置

tiup cdc cli changefeed create --server=http://192.1.40.122:8300 --sink-uri="mysql://my_sync:admin@192.1.40.122:4001/" --changefeed-id="ticdcms-test" --config=changefeed_tidb.toml

-- 查看当前任务

tiup cdc cli changefeed list --pd=http://192.1.40.121:2379

tiup cdc cli changefeed query -c ticdcms-test --server=http://192.1.40.122:8300

-- Slave端配置cdc任务,连接集群的Haproxy的VIP 120

tiup cdc cli changefeed create --server=http://192.1.40.122:8400 --sink-uri="mysql://my_sync:admin@192.1.40.120:4000/" --changefeed-id="ticdcsm-test" --config=changefeed_tidb.toml

-- 配置文件必须增加bdr-mode=true参数,否则会造成无限循环。

cat changefeed_tidb.toml 
#该参数强制复制没有有效索引的表 
force-replicate=true 
#开启 SyncPoint enable-sync-point = true 
#每隔 5 分钟对齐一次上下游的 
snapshot sync-point-interval = "5m" 
#每隔 24 小时清理一次下游 tidb_cdc.syncpoint_v1 表中的 ts-map 数据 
sync-point-retention = "24h" 
bdr-mode = true 
[filter] 
#rules = ['tidbcs.*','tidbcs2.*'] 
rules = ['*.*','!*.pdl*','!test2.*']

-- 主备端均pause任务,然后更新配置,重新启动任务

tiup cdc cli changefeed pause -c ticdcms-test --pd=http://192.1.40.121:2379

tiup cdc cli changefeed query -c=ticdcms-test -s --pd=http://192.1.40.121:2379

tiup cdc cli changefeed update -c=ticdcms-test --config=changefeed_tidb.toml --pd=http://192.1.40.121:2379

tiup cdc cli changefeed resume -c ticdcms-test --pd=http://192.1.40.121:2379

-- query确认设置已变更

tiup cdc cli changefeed query -c=ticdcms-test -s --pd=http://192.1.40.121:2379

-- 如上增加参数修改后,双向复制数据循环的问题解决。

但是DDL的操作均不能同步,包括create table

在开启bdr-mode,但是不设置bdr role的情况下(默认为空),所有的DDL都会被TiCDC拦截,必须设置bdr role,主库设置为Primary,从库设置为secondary。

  • PRIMARY:可以执行可复制的 DDL,但不能执行不可复制的 DDL。TiCDC 会把 PRIMARY 集群执行的可复制的 DDL 同步到下游。
  • SECONDARY:不能执行上述所有的 DDL。但是,TiCDC 能够把 PRIMARY 集群执行的 DDL 同步到 SECONDARY 集群。

经验证,只在master端设置bdr role角色为Primary,Slave端不设置,可以正常同步DDL。在master端执行不可复制的DDL会报错:

MySQL [test]> truncate table t6;

ERROR 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary.

需要取消角色才允许执行,但是取消bdr 角色后又无法解决双向同步的问题。

admin unset bdr role

不可复制的 DDL

不可复制的 DDL 是指对业务影响较大、可能会造成集群间数据不一致性的 DDL,这类 DDL 不能在双向复制中直接通过 TiCDC 同步到其他 TiDB 集群的 DDL。不可复制的 DDL 必须通过特定的操作来执行。

不可复制的 DDL 包括:

  • ALTER DATABASE CHARACTER SET
  • ALTER TABLE ... ADD COLUMN:添加的列为 not null 且不带有 default value
  • ALTER TABLE ... ADD PRIMARY KEY
  • ALTER TABLE ... ADD UNIQUE INDEX
  • ALTER TABLE ... AUTO_INCREMENT=...
  • ALTER TABLE ... AUTO_RANDOM_BASE=...
  • ALTER TABLE ... CHARACTER SET=...
  • ALTER TABLE ... DROP COLUMN
  • ALTER TABLE ... DROP PARTITION
  • ALTER TABLE ... EXCHANGE PARTITION
  • ALTER TABLE ... MODIFY COLUMN::修改列除 default value 和 comment 以外的属性
  • ALTER TABLE ... REORGANIZE PARTITION
  • ALTER TABLE ... TRUNCATE PARTITION
  • DROP DATABASE
  • DROP TABLE
  • RECOVER TABLE
  • RENAME TABLE
  • TRUNCATE TABLE

问题

上下游字段长度不一致,到下游之后被截断,没有报错。

:需要定期校验表结构、或者数据。

0
0
1
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论