CDC 技术全景
概述
CDC(Change Data Capture,变更数据捕获)是数据集成的基础:把数据库的增删改实时捕获出来同步到下游。按实现方式分为基于查询与基于日志两类,工具生态有 Canal、Debezium、Maxwell、DataX 等。本文讲清 CDC 原理、工具对比与选型。
一、CDC 是什么
CDC = 捕获数据变更(INSERT/UPDATE/DELETE)
应用场景:
- 业务库 → 数仓/湖
- 主库 → 从库/搜索/缓存
- 实时数据管道| 对比 | 全量同步 | CDC 增量 |
|---|---|---|
| 延迟 | 高 | 实时 |
| 数据量 | 全量 | 变更 |
| 成本 | 高 | 低 |
| 适用 | 初始化 | 持续同步 |
二、基于查询的 CDC
2.1 原理
轮询查询变更:
1. 时间戳列(updated_at > 上次)
2. 版本号/标志位
3. 全表扫描比对| 方式 | 说明 |
|---|---|
| 时间戳 | 依赖列值 |
| 版本号 | 递增版本 |
| 快照比对 | 前后差异 |
2.2 优缺点
| 优点 | 缺点 |
|---|---|
| 实现简单 | 延迟高(轮询) |
| 无侵入 | 漏删(物理删除) |
| 兼容 | 性能开销 |
问题:
物理删除无法感知
列未更新时间戳 → 漏变更三、基于日志的 CDC
3.1 原理
解析数据库事务日志:
MySQL:binlog
PostgreSQL:WAL
Oracle:Redo Logbinlog 记录所有变更:
解析 → 还原 INSERT/UPDATE/DELETE
实时且完整3.2 优缺点
| 优点 | 缺点 |
|---|---|
| 实时 | 需开启日志 |
| 完整(含删除) | 实现复杂 |
| 低侵入 | 日志保留策略 |
| 数据库 | 日志 |
|---|---|
| MySQL | binlog |
| PostgreSQL | WAL |
| Oracle | Redo/Archive Log |
| SQL Server | CDC/CT |
四、Canal
4.1 定位
阿里开源:
MySQL binlog → 消息/下游
主从复制原理实现| 特性 | 说明 |
|---|---|
| 来源 | MySQL binlog |
| 模拟 | 从库协议拉取 |
| 输出 | 自定义/消息队列 |
| 部署 | 服务端 |
4.2 架构
MySQL → Canal Server(解析 binlog)→ MQ/下游
客户端消费变更事件| 适用 | 说明 |
|---|---|
| MySQL → Redis/ES/数仓 | 实时同步 |
| 数据库异构 | 改造应用 |
五、Debezium
5.1 定位
Red Hat 开源:
Kafka Connect 生态
多数据库支持| 特性 | 说明 |
|---|---|
| 来源 | MySQL/PG/Oracle/SQL Server/MongoDB |
| 集成 | Kafka Connect |
| 格式 | 结构化变更事件 |
| 快照+增量 | 无缝 |
Debezium 事件包含:
before/after + op(c/u/d)+ 元数据5.2 场景
| 场景 | 说明 |
|---|---|
| Kafka 数据管道 | 主流 |
| 多数据库 | 统一接入 |
| 湖仓实时 | 入湖 |
六、Maxwell
6.1 定位
轻量级 MySQL CDC:
输出 JSON
简单易用| 对比 Canal | Maxwell |
|---|---|
| 简单 | 是 |
| JSON 输出 | 默认 |
| 依赖 | 低 |
适合:快速搭建、消息驱动七、DataX
7.1 定位
阿里开源离线同步工具:
批量数据搬运
异构数据源| 特性 | 说明 |
|---|---|
| 类型 | 离线全量/批量 |
| 插件 | 多源多目标 |
| 通道 | 并发控制 |
| 断点 | 支持续传 |
| 对比 CDC 工具 | DataX |
|---|---|
| 实时 | 否(离线) |
| 增量 | 手动(时间戳) |
| 场景 | 初始化/批量 |
DataX 定位:
全量同步、批量迁移
CDC 工具定位:
实时增量
常组合使用(全量+增量)八、工具对比总表
| 工具 | 类型 | 实时 | 源 | 输出 |
|---|---|---|---|---|
| Canal | 日志 CDC | 是 | MySQL | MQ/自定义 |
| Debezium | 日志 CDC | 是 | 多库 | Kafka |
| Maxwell | 日志 CDC | 是 | MySQL | JSON |
| DataX | 离线同步 | 否 | 多源 | 多目标 |
| Flink CDC | 日志 CDC | 是 | 多库 | Flink 生态 |
| 维度 | 选型 |
|---|---|
| MySQL 单库 | Canal / Maxwell |
| 多库 + Kafka | Debezium |
| Flink 实时数仓 | Flink CDC |
| 批量初始化 | DataX |
九、选型建议
9.1 决策树
实时增量?
是 → MySQL → Canal/Maxwell
多库 → Debezium / Flink CDC
否 → 批量 → DataX / SeaTunnel9.2 组合方案
经典组合:
全量:DataX(初始化历史数据)
增量:Canal/Debezium(实时变更)
汇总:Kafka → 数仓/湖| 场景 | 方案 |
|---|---|
| 全量+增量 | DataX + Canal |
| 实时数仓 | Flink CDC |
| 多库统一 | Debezium + Kafka |
十、实施注意
| 注意 | 说明 |
|---|---|
| binlog 开启 | 需开启 row 格式 |
| 保留期 | 防日志过期 |
| 主键 | 变更定位依赖 |
| 幂等 | 下游去重 |
| 监控 | 位点/延迟 |
常见问题速查
| 问题 | 要点 |
|---|---|
| 查询 vs 日志 CDC | 轮询 vs binlog |
| 物理删除 | 查询式漏,日志式有 |
| 选 Canal 还是 Debezium | 单库 vs 多库 |
| DataX 能实时吗 | 离线批量 |
| 全量增量怎么配合 | DataX + CDC |