核心要点

  • CDC(Change Data Capture)捕获源数据库的增删改(INSERT/UPDATE/DELETE)变更

  • 基于日志的 CDC 订阅数据库事务日志(MySQL binlog、Postgres WAL),低延迟、低侵入

  • 典型用于实时数据同步、增量 ETL、缓存/搜索更新、湖仓 upsert,常用 Debezium + Kafka

  • 对比全量同步:CDC 只传变更,资源开销小、延迟低,可实现近实时

标准回答

CDC 是什么

CDC(变更数据捕获)指持续捕获源数据库的数据变更并以事件流形式向下游传递,每条变更通常含操作类型(增/改/删)、变更前后镜像与时间戳/位点。它让下游无需周期性全表扫描即可获得最新数据。

实现方式

主流是基于日志的 CDC:直接读取数据库事务日志(MySQL binlog、PostgreSQL WAL、Oracle redo log),对源库侵入小、延迟低、能捕获删除。其他方式如基于时间戳/触发器查询,侵入性强、漏删除,已较少用。常见工具链是 Debezium 把 binlog 转成变更事件写入 Kafka,下游 Flink/Spark 消费。

应用场景

CDC 广泛用于:异构数据库实时同步、数仓/湖仓的增量 ETL 与 upsert(避免每日全量)、缓存与搜索引擎(ES)的实时更新、微服务间数据复制。相比全量同步,它只传增量、延迟低、对源库压力小,是实时数据管道的基石。

常见误区

⚠️ 常见踩坑

日志型 CDC 才能可靠捕获 DELETE 与变更前镜像;基于查询时间戳的方式会漏掉删除。还要处理好初始全量快照与增量衔接、位点持久化,否则重启会丢数据或重复。

追问

追问 1CDC 如何保证不丢不重(一致性)?

下游需记录消费位点(binlog offset / LSN)并与处理结果一起做幂等或事务提交:故障重启从上次位点重放即可至少一次,配合主键 upsert 或事务 Sink 达到精确一次效果。初始快照与增量切换点要对齐,避免空洞或重复。

追问 2CDC 数据写入湖仓为什么常用 Hudi/Iceberg?

CDC 产生大量 upsert 与 delete,普通追加表难以处理行级更新。Hudi/Iceberg/Delta 支持行级 upsert/delete、ACID 与小文件合并,能高效地把变更流落地为可查询的最新快照,Hudi 的 MOR 表尤其适合高频更新场景。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

📖 术语表

🛠️ AI 工具

  • debezium

    开源变更数据捕获(CDC)平台,支持多种数据库的实时数据变更流。可与 Apache Kafka 无缝集成,将数据库变更转化为事件流,适用于 AI 数据管道和实时数据同步场景。12.7K+ stars。