TiCDC 新架构
从 TiCDC v8.5.4-release.1 版本起,TiCDC 引入新架构,显著提升了实时数据复制的性能、可扩展性与稳定性,同时降低了资源成本。
新架构在完全兼容 TiCDC 老架构的配置项、使用方式和 API 的基础上,对 TiCDC 核心组件与数据处理流程进行了重构与优化,具有以下优势:
- 更高的单节点性能:单节点可支持最多 50 万张表的同步任务,宽表场景下单节点同步流量最高可达 190 MiB/s。
- 更强的扩展能力:集群同步能力接近线性扩展,单集群可扩展至超过 100 个节点,支持超 1 万个 Changefeed;单个 Changefeed 可支持百万级表的同步任务。
- 更高的稳定性:在高流量、频繁 DDL 操作及集群扩缩容等场景下,Changefeed 的延迟更低且更加稳定。通过资源隔离和优先级调度,减少了多个 Changefeed 任务之间的相互干扰。
- 更低的资源成本:通过改进资源利用率,减少冗余开销。在典型场景下,CPU 和内存等资源的使用量降低高达 50%。
架构设计
TiCDC 新架构由 Log Service 和 Downstream Adapter 两大核心组件构成。
- Log Service:作为核心数据服务层,Log Service 负责实时拉取上游 TiDB 集群的行变更和 DDL 变更等信息,并将变更数据临时存储在本地磁盘上。此外,它还负责响应 Downstream Adapter 的数据请求,定时将 DML 和 DDL 数据合并排序并推送至 Downstream Adapter。
- Downstream Adapter:作为下游数据同步适配层,Downstream Adapter 负责处理用户发起的 Changefeed 运维操作,调度生成相关同步任务,从 Log Service 获取数据并同步至下游系统。
TiCDC 新架构通过将整体架构拆分成有状态和无状态的两部分,显著提升了系统的可扩展性、可靠性和灵活性。Log Service 作为有状态组件,专注于数据的获取、排序和存储,通过与 Changefeed 业务逻辑的解耦,实现了数据在多个 Changefeed 间的共享,有效提高了资源利用率,降低了系统开销。Downstream Adapter 作为无状态组件,采用轻量级调度机制,支持任务在不同实例间的快速迁移,并根据负载变化灵活调整同步任务的拆分与合并,确保在各种场景下都能实现低延迟的数据同步。
新老架构对比
新架构旨在解决系统规模持续扩展过程中常见的性能瓶颈、稳定性不足及扩展性受限等核心问题。相较于老架构,新架构在以下关键维度实现了显著优化:
新老架构选择
如果你的业务满足以下任一条件,建议从 TiCDC 老架构切换至TiCDC 新架构,以获得更优的性能与稳定性:
- 增量扫描存在性能瓶颈:增量扫描任务长时间无法完成,导致同步延迟持续上升。
- 超高流量场景:Changefeed 总体流量超过 700 MiB/s。
- MySQL Sink 中存在超高流量写入的单表:目标表结构满足有且仅有一个主键或非空唯一键。
- 海量表同步场景:同步的表数量超过 10 万张。
- 高频 DDL 操作引发延迟:频繁执行 DDL 语句导致同步延迟显著上升。
新功能介绍
新架构支持为所有类型的 Sink 启用表级任务拆分。你可以通过在 Changefeed 配置中设置 scheduler.enable-table-across-nodes = true 来启用该功能。
启用后,TiCDC 会自动将满足以下任一条件的表拆分并分发到多个节点并行执行同步,从而提升同步效率与资源利用率:
- 表的 Region 数超过配置的阈值(默认
10000,可通过scheduler.region-threshold调整)。 - 表的写入流量超过配置的阈值(默认未开启,可通过
scheduler.write-key-threshold设置)。
表级任务拆分配置建议
切换至 TiCDC 新架构后,不建议继续使用老架构中的拆表相关配置。在绝大多数场景下,建议先采用新架构的默认配置。仅在存在同步性能瓶颈或调度不均的特殊场景下,再基于默认值进行小幅调整。
在拆表模式下,建议重点关注以下配置项:
scheduler.region-threshold:默认值为10000。当表的 Region 数量超过该阈值时,TiCDC 会对该表执行拆分。对于 Region 数量较少但表整体写入流量较高的场景,可以适当降低该值。该参数必须大于或等于scheduler.region-count-per-span,否则可能导致任务频繁调度,并增加同步延迟。scheduler.region-count-per-span:默认值为100。在 Changefeed 初始化阶段,满足拆分条件的表会按照该参数进行拆分。拆分后,每个子表最多包含region-count-per-span个 Region。scheduler.write-key-threshold:默认值为0(表示关闭)。当表的 Sink 写入流量超过该阈值时,TiCDC 会触发拆分。建议保持默认值0。
Storage Sink 文件名变更和消费说明
从 v8.5.5 起,切换至 TiCDC 新架构并且开启表级任务拆分后,对于 Storage Sink,记录数据变更的文件名格式将从 CDC{num}.{extension} 变更为 CDC_{uuid}_{num}.{extension},Index 文件名格式将从 CDC.index 变更为 CDC_{uuid}.index。其中,uuid 用于标识表拆分后的子同步任务,num 表示文件序号。
数据变更记录路径
{scheme}://{prefix}/{schema}/{table}/{table-version-separator}/{partition-separator}/{date-separator}/CDC_{uuid}_{num}.{extension}Index 文件路径
{scheme}://{prefix}/{schema}/{table}/{table-version-separator}/{partition-separator}/{date-separator}/meta/CDC_{uuid}.index
开启表级任务拆分后,在 {schema}/{table}/{table-version-separator}/ 目录下,同一张表可能存在多个 uuid 不同、序号相同的数据文件。例如:
├── metadata
└── test
├── tbl_1
│ ├── 437752935075545091
│ │ ├── CDC_11_000001.json
│ │ ├── CDC_11_000002.json
│ │ ├── CDC_22_000001.json
│ │ └── meta
│ │ ├── CDC_11.index
│ │ └── CDC_22.index
│ ├── 437752935075546092
│ │ ├── CDC_33_000001.json
│ │ ├── CDC_44_000001.json
│ │ └── meta
│ │ ├── CDC_33.index
│ │ └── CDC_44.index
由于多个子同步任务并行写文件,可能会出现某个数据文件尚未完全写入就被下游读取的情况,导致这部分数据未被成功读取。为了避免这种情况,编写下游消费程序时,请按照以下顺序读取数据:
- 读取各个子同步任务对应的
meta/CDC_{uuid}.index文件(例如,CDC_11.index),获取当前已经写入完成的文件名(例如,CDC_11_000002.json)。 - 依次读取与该 Index 文件对应的
uuid相同,且文件序号小于或等于该文件名中序号的文件(例如,CDC_11_000001.json和CDC_11_000002.json)。 - 从所有子任务的文件中读取 DML 事件后,将 DML 事件按
commit-ts排序,然后按排序后的顺序在下游处理。
兼容性说明
TiCDC 新架构除以下特殊说明外,其余部分与老架构完全兼容。
DDL 进度表
在 TiCDC 的老架构中,DDL 的同步是完全串行进行的,因此同步进度仅需通过 Changefeed 的 CheckpointTs 来标识。然而,在新架构中,为了提高 DDL 同步效率,TiCDC 会尽可能并行同步不同表的 DDL 变更。为了在下游 MySQL 兼容数据库中准确记录各表的 DDL 同步进度,TiCDC 新架构会在下游数据库中创建一张名为 tidb_cdc.ddl_ts_v1 的表,专门用于存储 Changefeed 的 DDL 同步进度信息。
DDL 同步行为变更
TiCDC 新老架构在 RENAME DDL 的同步行为上有以下差异:
- 互换表名:对于使用中间表名来交换两个表名的 DDL(例如
RENAME TABLE a TO c, b TO a, c TO b;),老架构不支持同步,新架构支持同步。同步时,必须保留所有相互依赖的重命名步骤。 - 表过滤:两种架构均以旧表名是否匹配过滤规则决定是否同步 Rename。旧表名不匹配而新表名匹配时,Changefeed 会报错并停止同步。对于多表 Rename,老架构还要求目标库位于同步范围内;新架构按各个重命名步骤分别判断。例如,当
filter.rules = ['test.t*']时,新架构可以同步RENAME TABLE test.t1 TO ignore.t1, test.t2 TO test.t22;,随后停止同步改名后的ignore.t1。详情参见 Rename table 类型的 DDL 注意事项。
DDL SQL 文本差异
TiCDC 同步到下游的 DDL SQL 文本不保证与上游原语句或老架构输出逐字一致。新架构会将单表 Rename 统一重建为带完整库表名的 RENAME TABLE,并在拆分多表 Rename 和批量建表事件时为每条子语句添加尾部分号。视图、跨库 CREATE TABLE ... LIKE ...、匿名索引和表路由等场景也可能发生 SQL 改写。
如果下游消费者需要解析 DDL SQL,或者升级时需要比较新老架构输出,请参见 DDL SQL 文本的处理。
使用限制
TiCDC 新架构目前暂不支持将大事务拆分为多个批次同步至下游,因此在处理超大事务时仍存在 OOM 风险,请在使用前评估相关影响。
升级指南
TiCDC 新架构仅支持 v7.5.0 或者以上版本的 TiDB 集群,使用之前需要确保 TiDB 集群版本满足该要求。
你可以通过 TiUP 或 TiDB Operator 部署 TiCDC 新架构。
部署启用新架构 TiCDC 的全新 TiDB 集群
使用 TiUP 部署 v8.5.4 或者以上版本的全新 TiDB 集群时,可以同时部署启用新架构的 TiCDC 组件。你需要在 TiUP 启动 TiDB 集群时的配置文件中添加 TiCDC 组件相关配置,并设置 newarch: true 以启用新架构,以下是一个示例:
cdc_servers:
- host: 10.0.1.20
config:
newarch: true
- host: 10.0.1.21
config:
newarch: true
更多 TiCDC 部署信息,请参考使用 TiUP 部署包含 TiCDC 组件的全新 TiDB 集群。
使用 TiDB Operator 部署 v8.5.4 或者以上版本的全新 TiDB 集群时,可以同时部署启用新架构的 TiCDC 组件。你需要在集群配置文件中添加 TiCDC 组件配置,并设置 newarch = true 以启用新架构,以下是一个示例:
spec:
ticdc:
baseImage: pingcap/ticdc
version: v8.5.8
replicas: 3
config:
newarch = true
更多 TiCDC 部署信息,请参考全新部署 TiDB 集群同时部署 TiCDC。
在原有 TiDB 集群中部署启用新架构的 TiCDC 组件
以下为通过 TiUP 在原有 TiDB 集群中部署启用新架构的 TiCDC 组件的步骤:
如果你的 TiDB 集群中尚无 TiCDC 节点,参考扩容 TiCDC 节点在集群中扩容新的 TiCDC 节点,否则跳过该步骤。
如果你的 TiDB 集群为 v8.5.4 之前版本,需要按照以下方式手动下载 TiCDC 新架构离线包,并将下载的 TiCDC 二进制文件动态替换到你的 TiDB 集群,否则跳过该步骤。
离线包下载链接格式为
https://tiup-mirrors.pingcap.com/cdc-${version}-${os}-${arch}.tar.gz。其中,${version}为 TiCDC 版本号(版本号信息可参考 TiCDC 新架构版本发布列表),${os}为你的操作系统,${arch}为组件运行的平台(amd64或arm64)。例如,可以使用以下命令下载 Linux 系统 x86-64 架构的 TiCDC v8.5.8 离线包:
wget https://tiup-mirrors.pingcap.com/cdc-v8.5.8-linux-amd64.tar.gz如果集群中已经有 Changefeed,请参考停止同步任务暂停所有的 Changefeed 同步任务。例如:
# cdc 默认服务端口为 8300 cdc cli changefeed pause --server=http://<ticdc-host>:8300 --changefeed-id <changefeed-name>使用
tiup cluster patch命令将下载的 TiCDC 二进制文件动态替换到你的 TiDB 集群中:tiup cluster patch <cluster-name> ./cdc-v8.5.8-linux-amd64.tar.gz -R cdc --overwrite通过
tiup cluster edit-config命令更新 TiCDC 配置以启用 TiCDC 新架构:tiup cluster edit-config <cluster-name>server_configs: cdc: newarch: true参考恢复同步任务恢复所有的 Changefeed 同步任务。
# cdc 默认服务端口为 8300 cdc cli changefeed resume --server=http://<ticdc-host>:8300 --changefeed-id <changefeed-name>
以下为通过 TiDB Operator 在原有 TiDB 集群中部署启用新架构的 TiCDC 组件的步骤:
如果现有 TiDB 集群中没有 TiCDC 组件,参考在现有 TiDB 集群上新增 TiCDC 组件在集群中添加新的 TiCDC 节点。操作时,只需在集群配置文件中将 TiCDC 的镜像版本指定为新架构版本即可。版本号信息可参考 TiCDC 新架构版本发布列表。
示例如下:
spec: ticdc: baseImage: pingcap/ticdc version: v8.5.8 replicas: 3 config: newarch = true如果现有 TiDB 集群中已有 TiCDC 组件,请按以下步骤操作:
如果集群中已经有 Changefeed,暂停所有的 Changefeed 同步任务。
kubectl exec -it ${pod_name} -n ${namespace} -- sh# 通过 TiDB Operator 部署的 TiCDC 服务器的默认端口为 8301 /cdc cli changefeed pause --server=http://127.0.0.1:8301 --changefeed-id <changefeed-name>修改集群配置文件中 TiCDC 组件的镜像版本为新架构版本。
kubectl edit tc ${cluster_name} -n ${namespace}spec: ticdc: baseImage: pingcap/ticdc version: v8.5.8 replicas: 3kubectl apply -f ${cluster_name} -n ${namespace}恢复所有的 Changefeed 同步任务。
kubectl exec -it ${pod_name} -n ${namespace} -- sh# 通过 TiDB Operator 部署的 TiCDC 服务器的默认端口为 8301 /cdc cli changefeed resume --server=http://127.0.0.1:8301 --changefeed-id <changefeed-name>
使用指南
在 TiCDC 新架构的节点部署完成后,即可使用相应的命令进行操作。新架构沿用了旧架构的 TiCDC 使用方式,因此无需额外学习新的命令,也无需修改旧架构中使用到的命令。
例如,要在新架构的 TiCDC 节点中创建同步任务,可执行以下命令:
cdc cli changefeed create --server=http://127.0.0.1:8300 --sink-uri="mysql://root:123456@127.0.0.1:3306/" --changefeed-id="simple-replication-task"
若需查询特定同步任务的信息,可执行:
cdc cli changefeed query -s --server=http://127.0.0.1:8300 --changefeed-id=simple-replication-task
更多命令的使用方法和细节,可以参考管理 Changefeed。
监控
TiCDC 新架构的监控面板为 TiCDC-New-Arch。对于 v8.5.4 及以上版本的 TiDB 集群,该监控面板已在集群部署或升级时自动集成到 Grafana 中,无需手动操作。如果你的集群版本低于 v8.5.4,需手动导入 TiCDC 监控指标文件以启用监控。
导入步骤以及各监控指标的详细说明,请参考 TiCDC 新架构监控指标。

