1. CDC实时数据集成全景
CDC(Change Data Capture,变更数据捕获)是一类从数据库事务日志或增量表中识别并提取数据变化的技术。它的核心价值在于:不再依赖全量轮询去"猜"数据是否变化,而是直接读取数据库已经记录下来的变更事实,把 INSERT、UPDATE、DELETE 以低延迟、低侵入的方式投递到下游系统。对于实时数仓、缓存刷新、搜索索引、微服务数据同步等场景,CDC 往往是整条数据链路的起点。
一、CDC 的核心概念
理解 CDC,需要先厘清四个基本概念。第一是变更事件:一条变更通常包含操作类型(I/U/D)、变更前后的字段值、变更时间以及事务标识。第二是位点(Offset/LSN/SCN):日志中的位置标记,决定了下游从哪里继续消费,是断点续传和精确一次语义的基础。第三是快照与增量:首次接入时通常先做一次一致性快照,再从某个位点开始追增量,二者拼接才构成完整数据集。第四是投递语义:at-least-once 保证不丢但可能重复,exactly-once 依赖幂等写入或事务提交来消除重复。
以 MySQL 为例,binlog 中的一条 UPDATE 事件在 ROW 模式下会同时记录变更前镜像(before image)和变更后镜像(after image)。下游若只关心最终状态,可用 after image 做 upsert;若需要审计或回滚,则必须保留 before image。这个细节直接决定了目标表的主键设计和写入方式。
二、技术流派与选型
CDC 的实现路径大致分为三类。第一类是基于日志的 CDC,直接解析数据库事务日志,如 MySQL binlog、PostgreSQL WAL、Oracle Redo Log、SQL Server Transaction Log。它的优点是侵入低、延迟低、能捕获删除操作,是生产环境的主流选择。第二类是基于触发器的 CDC,在源表上创建触发器把变更写入影子表,实现简单但会显著增加源库写入开销,高并发下容易成为瓶颈。第三类是基于查询的 CDC,通过时间戳或自增 ID 轮询增量数据,实现门槛最低,但无法可靠捕获物理删除,且轮询间隔决定了延迟下限。
工具层面,Debezium 是日志型 CDC 的代表,通常以 Kafka Connect 插件形式运行,把变更事件写入 Kafka Topic;Flink CDC 则把采集与计算整合到同一作业中,支持全增量一体化读取;Canal、Maxwell 在 MySQL 生态中也有广泛应用。选型时不能只看功能列表,而要结合源库类型、版本、是否允许开启日志、下游消费形态综合判断。
三、典型应用场景
CDC 最常见的落地场景有四类。其一是实时数仓与湖仓入湖:业务库的订单、支付、用户表变更实时写入 Hudi、Iceberg 或 Doris,支撑分钟级报表与实时看板。其二是缓存与搜索索引刷新:商品信息变更后同步更新 Redis 与 Elasticsearch,避免缓存与数据库长期不一致。其三是微服务数据同步:通过 CDC 把单体库的变更以事件形式发布,逐步拆分服务而不引入双写。其四是审计与风控:保留 before image 用于追溯资金流水、权限变更等敏感操作。
这些场景对 CDC 的要求并不相同。数仓入湖更关注吞吐与顺序性,缓存刷新更关注端到端延迟,审计场景则更关注完整性与不可篡改性。因此同一套采集工具在不同场景下,参数配置和下游写入策略往往需要分别设计。
四、生产环境中的主要挑战
把 CDC 跑通不难,难的是长期稳定运行。生产中最常见的挑战包括:
- 源库压力与日志膨胀:开启 binlog 后磁盘增长加快,若下游消费停滞,日志无法及时清理,可能撑爆磁盘。需要监控日志保留时长与消费 Lag。
- 位点丢失与重复消费:采集器重启后若位点未持久化,可能从头重放或跳过数据。应确保位点存储在可靠介质中,并让下游写入具备幂等性。
- Schema 变更:源表加字段、改类型、删列都会影响下游解析。需要 Schema Registry 或兼容性策略,避免作业因结构漂移直接失败。
- 大事务与长事务:一次批量更新百万行会产生巨大事务事件,可能造成内存溢出或下游瞬时压力。需要拆分事务或限流。
- 数据一致性校验:CDC 链路长,任何一环出错都可能导致数据偏差。应定期做源目标行数与关键字段比对。
五、一个可参考的接入检查清单
在正式接入前,建议按下表逐项确认。以下参数为示例值,实际应根据业务量级和源库规格调整。
| 检查项 | 示例要求 | 判断依据 |
|---|---|---|
| 源库日志模式 | MySQL binlog_format=ROW,binlog_row_image=FULL | 确保能拿到完整前后镜像 |
| 日志保留时长 | ≥ 24 小时 | 覆盖下游故障恢复窗口 |
| 采集器位点存储 | Kafka Connect Offset Topic 或外部存储 | 重启后不丢位点 |
| 下游写入幂等 | 按主键 upsert | 重复事件不产生脏数据 |
| 延迟监控 | 端到端 P99 ≤ 5s | 满足业务实时性要求 |
| 一致性校验 | 每日行数与关键字段比对 | 及时发现链路偏差 |
总体来看,CDC 实时数据集成的本质是把数据库的"变更事实"变成可被下游消费的"事件流"。理解变更事件、位点、快照与投递语义这四个基础概念,区分日志型、触发器型和查询型三条技术路线,再结合具体场景明确延迟、吞吐与一致性目标,才能在生产环境中把 CDC 从"能跑"推进到"稳定可靠"。