跳到主要内容

CDC 变更数据捕获

问题

什么是 CDC?Binlog、Debezium、Canal 分别是什么?

答案

什么是 CDC

CDC(Change Data Capture,变更数据捕获)是一种实时捕获源数据库增删改操作并同步到下游系统的技术。

CDC vs 全量同步

对比全量同步CDC 增量同步
数据量每次同步全量(可能 TB)只同步变化的记录
延迟T+1秒级 ~ 分钟级
源库压力大(全表 SELECT)小(读 binlog)
适用初始化、小表大表实时同步

CDC 实现方式

方式原理代表工具
基于日志解析数据库 binlog/WALCanal、Debezium
基于查询定期查询变化记录(WHERE 时间戳)自定义 SQL
基于触发器数据库 Trigger 写入变更表传统方式(不推荐)
推荐方式

基于日志的 CDC(Canal/Debezium)是最佳实践:

  • 不影响源库性能
  • 能捕获 DELETE 操作
  • 保证顺序性

Canal vs Debezium

对比CanalDebezium
支持数据库MySQL 为主MySQL、PG、MongoDB、Oracle
输出自定义协议Kafka
部署独立进程Kafka Connect 插件
生态阿里开源,国内流行红帽维护,国际流行
语言JavaJava

CDC 架构


常见面试问题

Q1: CDC 数据同步有延迟怎么排查?

答案

  1. 源端:binlog 是否产生了?主库是否正常?
  2. CDC 工具:Canal/Debezium 是否健康?是否有积压?
  3. Kafka:消费是否跟得上?分区是否均衡?
  4. 下游:Flink/Spark 处理是否有瓶颈?

Q2: CDC 和消息队列是什么关系?

答案

  • CDC 负责捕获变更(从 binlog 读取)
  • 消息队列(Kafka)负责传输和缓冲
  • 它们是上下游关系,通常一起使用

Q3: CDC 同步的数据如何保证一致性?

答案

  • 至少一次:Canal/Debezium 默认 at-least-once,下游需要去重
  • Exactly-Once:Flink + Kafka 事务写入 + Checkpoint
  • 最终一致:实时层容忍小延迟,定期和离线层对数修正

相关链接