Flink CDC 是什么
Flink CDC 通过直连数据库的变更日志(MySQL 的 binlog、PostgreSQL 的逻辑复制等)把源库变更实时同步到湖表、消息队列或 OLAP 库。它的两个关键特性是:启动时先做一次全量快照,再无缝切换到增量日志读取,业务方不需要停机或额外摆渡表;变更事件携带操作类型,插入、更新、删除都能被还原到目标表。
基本信息
| 数据来源 | binlog、redo log、逻辑复制槽 |
|---|---|
| 同步模式 | 全量快照 + 增量日志自动衔接 |
| 常见落点 | 湖表、消息队列、OLAP 库 |
| 变更类型 | 插入、更新、删除均可捕获 |
| 主要难点 | 结构变更处理与延迟监控 |
典型使用场景
- 业务库到数仓:替代定时抽数,明细表可以做到分钟级可见
- 源端物理删除需要感知:CDC 能捕获删除,弥补时间戳增量方式的缺口
- 对业务库压力敏感:从从库或日志读取,几乎不增加业务查询负担
- 实时大屏与告警:变更事件直接进入实时链路消费
- 历史数据初始化:启动时自动做一次全量快照,不必单独写初始化脚本
各环节关注点
| 环节 | 关注点 | 常见做法 |
|---|---|---|
| 全量阶段 | 大表快照耗时长且占用源库资源 | 调整并发与分片策略,避开业务高峰 |
| 增量阶段 | 消费延迟与位点管理 | 监控消费延迟,位点定期存档以便重放 |
| 结构变更 | 源表加字段会让同步中断 | 目标表结构同步演进,必要时自动加列 |
| 删除处理 | 删除事件如何落到目标表 | 目标表标记删除,或用主键模型覆盖 |
CDC 入湖
CDC 入湖
CREATE TABLE mysql_orders (
order_id STRING,
pay_amt DECIMAL(18,2),
PRIMARY KEY (order_id) NOT ENFORCED -- 声明主键,便于下游按主键更新
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '10.0.0.10',
'port' = '3306',
'database-name' = 'trade',
'table-name' = 'orders'
);
-- 写入目标表:变更事件按主键在湖表中更新
INSERT INTO ods_mysql_orders SELECT * FROM mysql_orders;源表加字段后未同步目标表结构,同步任务会因结构不匹配而中断,而且往往几小时后才被发现。上线时应同时配置结构变更监控与任务失败告警。
全量快照阶段读取的是源库当前数据,为降低对业务库的影响,通常把 CDC 任务指向从库,并在快照阶段限制并发;如果源表是大表,还要评估快照窗口是否会与业务高峰重叠。