首页/数据/数据工程与 ETL 速查/Flink CDC:把 CDC 做成 Flink 连接器
CDC 与同步53 条

Flink CDC:把 CDC 做成 Flink 连接器

Flink CDC 将 CDC 数据源封装为 Flink 连接器(mysql-cdc、postgres-cdc、oracle-cdc、mongo-cdc 等),用 SQL 或 DataStream 直接消费增量并流式加工;2.x 的增量快照算法支持并发快照与断点续读,3.x 提供 YAML 管道做多表整库同步。

Flink CDC 是什么

Flink CDC 把 CDC 数据源封装成 Flink 连接器:mysql-cdc、postgres-cdc、oracle-cdc、mongo-cdc 等可以直接在 Flink SQL 里声明为一张表,然后像写普通 SQL 一样做过滤、关联与聚合。底层使用日志解析引擎读取变更,因此对源库的侵入很小。

为什么它比传统链路省事

传统做法是 CDC 工具先写入 Kafka,Flink 再从 Kafka 读,中间多一跳存储与一套运维;Flink CDC 让作业直接连接源库消费变更,省掉这一跳。2.x 引入的增量快照支持并发读取存量数据与断点续读,3.x 进一步提供 YAML 管道,用配置完成多表整库同步与表结构变更同步。

基本信息

定位Flink 生态的 CDC 连接器与整库同步工具
引擎连接器底层基于 Debezium 引擎解析数据库日志
关键能力增量快照(无锁并发读取)、checkpoint 提交位点、整库同步
入口Flink SQL、DataStream API,3.x 起支持 YAML pipeline
前置条件源库日志已开启且格式正确(MySQL 需 binlog_format=ROW)

典型使用场景

  • 实时宽表加工:CDC 源表与维表 join,持续产出宽表落库
  • 整库同步:把多张表按配置一次性同步到目标存储(3.x 管道)
  • 实时对账:把源库变更与目标端数据持续比对,尽早发现差异
  • 轻量链路:不想额外维护 Kafka 时,用作业直连源库消费变更
  • 实时看板:CDC 源表直接做分组聚合,输出到在线存储供查询

SQL 声明 CDC 源表并直接加工

SQL 声明 CDC 源表并直接加工
-- 源表:直接指向业务库表,底层按日志解析增量
CREATE TABLE orders (
  order_id BIGINT,
  user_id  BIGINT,
  amount   DECIMAL(10,2),
  status   STRING,
  update_time TIMESTAMP(3),
  PRIMARY KEY (order_id) NOT ENFORCED
) WITH (
  'connector' = 'mysql-cdc',
  'hostname' = '10.0.0.5',
  'port' = '3306',
  'username' = 'cdc_ro',
  'password' = '******',
  'database-name' = 'app',
  'table-name' = 'orders',
  'scan.startup.mode' = 'initial',           -- 先做增量快照,再持续追变更
  'server-time-zone' = 'Asia/Shanghai'      -- 时区不匹配会导致时间字段整体偏移
);

-- 持续查询:按状态实时统计,结果随变更更新
SELECT status, COUNT(*) AS cnt, SUM(amount) AS amt FROM orders GROUP BY status;

3.x 管道式整库同步(YAML 片段)

3.x 管道式整库同步(YAML 片段)
# 用配置文件描述源与目标,由 pipeline 作业完成多表同步
source:
  type: mysql
  hostname: 10.0.0.5
  port: 3306
  username: cdc_ro
  password: '******'
  tables: app\.orders,app\.order_items     # 指定需要同步的表
sink:
  type: values                                # 示例输出,实际可指向目标存储
pipeline:
  name: mysql-to-dw
  parallelism: 4

关键点读法

要点含义注意
scan.startup.mode首次启动读取位置:initial 做快照,latest-offset 只读新数据选错会漏掉全部存量数据
增量快照并发读取存量数据,过程中不加全表锁大表快照期间对源库仍有读压力
checkpoint位点与状态一起提交,故障后从快照恢复不开启则每次重启都从头回放
server-time-zone与源库一致的时区不一致会让时间字段整体偏移数小时
CDC 源表性质持续变更的动态表,不是静态表不能当维表反复全量扫描
CDC 源表在 Flink SQL 里是持续变更的流表:对它的查询是常驻作业,结果会随源端变更不断更新。把它当成批表反复扫描,会在源库上产生持续压力,也拖垮作业状态。
作业必须开启 checkpoint:位点随 checkpoint 提交,否则重启后要么从最早的位点重放导致重复,要么跳过中间变更造成缺数。

易错点

  • 作业没有开启 checkpoint,位点不提交,重启后从头回放或直接跳过一段变更
  • 把 CDC 源表当普通维表反复 join 做全量扫描,源库压力与作业状态同时失控
  • server-time-zone 与源库不一致,时间字段整体偏移数小时,指标落在错误的业务日期上
  • 新增表或字段变更后没有同步调整作业,表现为部分数据长期缺失却没有任何报错

数据来源与参考

  • Apache Flink 官方文档(CDC Connectors)
  • Flink CDC 官方文档(ververica/flink-cdc)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌