一.TiCDC新老架构对比
1.不变部分
三个模块基本没有改动:Puller(从 TiKV 拉取变更),Configs & Cli API(配置和用户操作API),Sink(往下游系统写入数据的模块,比如 Kafka、MySQL 等)。这保证了新 CDC 与上下游之间有良好的兼容性,用户可以无感升级。
2.改进部分
CDC 的所有内核内容都进行了重写,包括基本的抽象模型,线程模型,监控等等。
- Changefeed彼此独立各负责一个同步任务链条的上下游,变为一个控制内部服务活动的参数。原同步任务抽象为各个服务管理,便于扩展和代码演进。
- 消息处理由Timer Driven 模式调整为Event Driven 模式,从原先每50ms周期轮动变为事件(如DDL、DML、changefeed创建修改等)驱动模式,将减少同步时延、提升同步并发效率。
- 代码复杂度降低,对表变革依赖关系进行逻辑抽象化,统一交给Maintainer模块管理,依赖判断复杂度从N x N降为N x 1。
二.TiDB单机集群v8.5.1测试TiCDC新架构
1.测试环境信息
源库: rocky9.5, TiDB Cluster V8.5.1单机集群; 目标库:MySQL5.7.40;
2.测试TiCDC节点增加和扩容
2.1 在现有TiDB v8.5.1中增加一个TiCDC节点
第一次扩展一个节点,端口号83000,配置文件如下:
# cat ticdc-scaleout1.yaml
cdc_servers:
- host: 192.168.169.41
gc-ttl: 86400
data_dir: /tidb-data/cdc-8300
执行添加TiCDC节点命令
# tiup cluster scale-out tidb-test ticdc-scaleout1.yaml -p
执行命令后,第一个CDC节点添加完成;
2.2 升级TiCDC到v9.0.0
下载最新的 TiCDC 版本的 binary https://tiup-mirrors.pingcap.com/cdc-v9.0.0-alpha-nightly-linux-amd64.tar.gz
将新的 TiCDC binary patch 到集群中
# tiup cluster patch tidb-test ./cdc-v9.0.0-alpha-nightly-linux-amd64.tar.gz -R cdc --overwrite
升级完成后查看集群状态,TiCDC Role变为cdc (patched);
查看TiCDC版本
# /tidb-deploy/cdc-8300/bin/cdc version
Release Version: v9.0.0-alpha-143-gfe0e19a
Git Commit Hash: fe0e19ac8286a77e02b51707cbaa82a364f56e27
Git Branch: HEAD
UTC Build Time: 2025-03-11 01:51:50
Go Version: go1.23.7
Failpoint Build: false
2.3 修改 TiCDC 配置并启用新架构
修改配置,添加如下内容
tiup cluster edit-config <cluster-name>
#vim
#cdc_servers:
# ...
# config:
# newarch: true
重新加载配置
# tiup cluster reload tidb-test
查看配置已生效:
# tiup cluster show-config tidb-test
2.4 扩容TiCDC集群
扩展两个TiCDC节点,端口号分别为8301,8302,配置文件如下:
# cat ticdc-scaleout2.yaml
cdc_servers:
- host: 192.168.169.41
gc-ttl: 86400
port: 8301
data_dir: /tidb-data/cdc-8301
- host: 192.168.169.41
gc-ttl: 86400
port: 8302
data_dir: /tidb-data/cdc-8302
执行扩容TiCDC节点命令
# tiup cluster scale-out tidb-test ticdc-scaleout2.yaml -p
执行完成后,查看集群状态,可见后加两个TiCDC节点Role均为cdc (patched)。
3.同步测试
3.1 创建同步任务
创建changefeed-id 为 cdc9rep1的同步任务,将上游集群所有包含主键或者非空唯一索引的表同步到下游 mysql5.7.40数据库;
# pwd
/tidb-deploy/cdc-8300/bin
# ./cdc cli changefeed create --pd=http://192.168.169.40:2379 --sink-uri="mysql://root:Abcd_1234@192.168.169.121:3307/" --changefeed-id="cdc9rep1"
3.2查看同步任务
对于刚创建的同步任务进行查询,如下:
# pwd
/tidb-deploy/cdc-8300/bin
# cdc cli changefeed list --pd=http://192.168.169.40:2379
[
{
"id": "cdc9rep1",
"namespace": "default",
"summary": {
"state": "normal",
"tso": 456665489618501650,
"checkpoint": "2025-03-15 20:09:54.553",
"error": null
}
}
3.3 查询复制任务详细信息
# cdc cli changefeed query --pd=http://192.168.169.40:2379 --changefeed-id=cdc9rep1
{
"upstream_id": 7481945022851484351,
"namespace": "default",
"id": "cdc9rep1",
"sink_uri": "mysql://root:xxxxx@192.168.169.121:3307/",
"config": {
"memory_quota": 1073741824,
"case_sensitive": false,
"force_replicate": false,
"ignore_ineligible_table": false,
"check_gc_safe_point": true,
"enable_sync_point": false,
"enable_table_monitor": false,
"bdr_mode": false,
"sync_point_interval": 600000000000,
"sync_point_retention": 86400000000000,
"filter": {
"rules": [
"*.*"
]
},
"mounter": {
"worker_num": 16
},
"sink": {
"csv": {
"delimiter": ",",
"quote": "\"",
"null": "\\N",
"include_commit_ts": false,
"binary_encoding_method": "base64",
"output_old_value": false,
"output_handle_key": false
},
"encoder_concurrency": 32,
"terminator": "\r\n",
"date_separator": "day",
"enable_partition_separator": true,
"enable_kafka_sink_v2": false,
"only_output_updated_columns": false,
"delete_only_output_handle_key_columns": false,
"content_compatible": false,
"advance_timeout": 150,
"send_bootstrap_interval_in_sec": 120,
"send_bootstrap_in_msg_count": 10000,
"send_bootstrap_to_all_partition": true,
"send-all-bootstrap-at-start": false,
"debezium_disable_schema": false,
"debezium": {
"output_old_value": true
},
"open": {
"output_old_value": true
}
},
"consistent": {
"level": "none",
"max_log_size": 64,
"flush_interval": 2000,
"meta_flush_interval": 200,
"encoding_worker_num": 16,
"flush_worker_num": 8,
"use_file_backend": false,
"memory_usage": {
"memory_quota_percentage": 50
}
},
"scheduler": {
"enable_table_across_nodes": false,
"region_threshold": 100000,
"write_key_threshold": 0
},
"integrity": {
"integrity_check_level": "none",
"corruption_handle_level": "warn"
},
"changefeed_error_stuck_duration": 1800000000000,
"synced_status": {
"synced_check_interval": 300,
"checkpoint_interval": 15
}
},
"create_time": "2025-03-15 20:09:52.364",
"start_ts": 456665489028677648,
"resolved_ts": 456665500916908046,
"target_ts": 0,
"checkpoint_tso": 456665500916908046,
"checkpoint_time": "2025-03-15 20:10:37.653",
"state": "normal",
"creator_version": "v9.0.0-alpha-143-gfe0e19a"
}
3.4验证同步情况
登录源端(上游)TiDB数据库,
# mysql -h192.168.169.40 -P4000 -uroot -ptidb
mysql> create database d315;
mysql> use d315
mysql> create table t315(id int primary key);
mysql> insert into t315 values(1);
mysql> select count(*) from d315.t315\G;
*************************** 1. row ***************************
count(*): 1
1 row in set (0.00 sec)
登录目标端(下游)MySQL数据库,
# mysql -P3307 -uroot -pAbcd_1234
mysql> select count(*) from d315.t315\G
*************************** 1. row ***************************
count(*): 1
1 row in set (0.00 sec)
查询,源端新建表d315.t315 已同步到目标数据库中,说明TiCDC同步正常。
三.测试过程踩坑总结
1 TiCDC 新架构v9.0.0 panic且无法启动--疑似Bug
该问题为:大批量数据同步引发TiCDC panic,等待官方修复bug中。 具体参见:TiCDC 新架构v9.0.0 panic且无法启动
2 Dasboard不显示TiCDC信息--疑似Bug
该问题为,启用TiCDC 新架构参数后,在Dashboard中无法查看TiCDC信息,等待官方修复中。 具体参见:Dasboard不显示TiCDC信息 .
3 单机集群reload配置很慢--疑似兼容问题
该问题为:Centos7.9部署TiDB v8.5.1单机集群,启动和加载配置操作很慢。重新在Rocky9.5中部署TiDB v8.5.1 单机集群解决。怀疑为操作系统Centos7.9不兼容导致。
具体参见:单机集群reload配置很慢
.
4 建议:TiCDC日志中增加记录– 同步范围和没有正常同步的表信息
增加日志丰富度,方便运维检测,排查故障