CDC 变更数据捕获
问题
什么是 CDC?Binlog、Debezium、Canal 分别是什么?
答案
什么是 CDC
CDC(Change Data Capture,变更数据捕获)是一种实时捕获源数据库增删改操作并同步到下游系统的技术。
CDC vs 全量同步
| 对比 | 全量同步 | CDC 增量同步 |
|---|---|---|
| 数据量 | 每次同步全量(可能 TB) | 只同步变化的记录 |
| 延迟 | T+1 | 秒级 ~ 分钟级 |
| 源库压力 | 大(全表 SELECT) | 小(读 binlog) |
| 适用 | 初始化、小表 | 大表实时同步 |
CDC 实现方式
| 方式 | 原理 | 代表工具 |
|---|---|---|
| 基于日志 | 解析数据库 binlog/WAL | Canal、Debezium |
| 基于查询 | 定期查询变化记录(WHERE 时间戳) | 自定义 SQL |
| 基于触发器 | 数据库 Trigger 写入变更表 | 传统方式(不推荐) |
推荐方式
基于日志的 CDC(Canal/Debezium)是最佳实践:
- 不影响源库性能
- 能捕获 DELETE 操作
- 保证顺序性
Canal vs Debezium
| 对比 | Canal | Debezium |
|---|---|---|
| 支持数据库 | MySQL 为主 | MySQL、PG、MongoDB、Oracle |
| 输出 | 自定义协议 | Kafka |
| 部署 | 独立进程 | Kafka Connect 插件 |
| 生态 | 阿里开源,国内流行 | 红帽维护,国际流行 |
| 语言 | Java | Java |
CDC 架构
常见面试问题
Q1: CDC 数据同步有延迟怎么排查?
答案:
- 源端:binlog 是否产生了?主库是否正常?
- CDC 工具:Canal/Debezium 是否健康?是否有积压?
- Kafka:消费是否跟得上?分区是否均衡?
- 下游:Flink/Spark 处理是否有瓶颈?
Q2: CDC 和消息队列是什么关系?
答案:
- CDC 负责捕获变更(从 binlog 读取)
- 消息队列(Kafka)负责传输和缓冲
- 它们是上下游关系,通常一起使用
Q3: CDC 同步的数据如何保证一致性?
答案:
- 至少一次:Canal/Debezium 默认 at-least-once,下游需要去重
- Exactly-Once:Flink + Kafka 事务写入 + Checkpoint
- 最终一致:实时层容忍小延迟,定期和离线层对数修正
相关链接
- 离线数仓 vs 实时数仓 - CDC 在实时数仓中的角色
- Airflow - 离线 ETL 调度