Flink CDC(Change Data Capture)是一种基于数据变更日志实现实时数据同步的技术方案,可以将数据库中的新增、更新、删除操作捕获,并实时传输到下游系统。随着实时数仓、数据湖、数据同步场景的发展,Flink CDC凭借低延迟、高可靠以及与Flink生态的深度结合,成为企业构建实时数据链路的重要技术组件。
理解Flink CDC的工作流程,有助于掌握数据库日志采集、数据转换、消息传递以及实时计算整个链路。下面通过流程图和详细解析介绍Flink CDC的核心执行过程。
Flink CDC整体流程图
Flink CDC完整的数据处理流程可以概括为:
数据源数据库 | | +---------------+ | 数据变更日志 | | Binlog/RedoLog | +---------------+ | | +---------------+ | CDC Connector | | 日志捕获组件 | +---------------+ | | +---------------+ | Flink Source | | 数据读取阶段 | +---------------+ | | +---------------+ | 数据转换处理 | | Flink SQL/DataStream | +---------------+ | | +---------------+ | Sink连接器 | | 写入目标系统 | +---------------+ | | Kafka / Elasticsearch / MySQL / Hudi / Iceberg
整个流程可以分为五个主要阶段:
-
数据库产生变更日志
-
CDC连接器捕获变化事件
-
Flink Source读取数据
-
Flink进行实时计算处理
-
Sink写入目标系统
第一阶段:数据库产生数据变更日志
Flink CDC并不是直接扫描数据库表数据,而是读取数据库自身维护的数据变化日志。
不同数据库对应不同日志类型:
| 数据库 | 日志类型 |
|---|---|
| MySQL | Binlog |
| PostgreSQL | WAL |
| Oracle | Redo Log |
| SQL Server | Transaction Log |
| MongoDB | Oplog |
例如MySQL执行:
SQLUPDATE user SET name='Tom' WHERE id=1;
数据库不会立即通知Flink CDC,而是先将该事务记录到Binlog中:
{ "operation":"UPDATE", "table":"user", "before":{ "id":1, "name":"Jack" }, "after":{ "id":1, "name":"Tom" } }
CDC组件通过读取这些日志,获取数据库变化信息。
第二阶段:CDC Connector捕获变化事件
Flink CDC通过各种Connector连接数据库日志系统。
常见Connector包括:
-
MySQL CDC Connector
-
PostgreSQL CDC Connector
-
Oracle CDC Connector
-
MongoDB CDC Connector
Connector主要负责三个任务:
1. 建立数据库连接
CDC需要具备数据库访问权限,例如MySQL需要开启:
propertiesbinlog_format=ROW binlog_row_image=FULL
同时创建具有复制权限的账号:
SQLCREATE USER 'cdc'@'%' IDENTIFIED BY 'password'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cdc'@'%';
2. 初始化数据快照
第一次启动CDC任务时,需要获取已有历史数据。
例如:
数据库表: user id name 1 Jack 2 Lucy 3 Mike
CDC会先执行Snapshot:
Snapshot阶段 读取已有数据 | | Flink Source
将历史数据发送到Flink计算链路。
3. 捕获增量变化
快照完成后,CDC自动切换到增量读取模式。
流程:
Snapshot完成 ↓ 记录Binlog位置 ↓ 持续监听Binlog ↓ 获取INSERT/UPDATE/DELETE事件
这样可以保证数据同步不会遗漏。
第三阶段:Flink Source读取数据
Flink CDC Connector会将数据库变化转换成Flink可以处理的数据流。
例如MySQL一条更新:
SQLUPDATE order_table SET status='paid' WHERE id=100;
转换后:
+I { id:100, status:"created" } -U { id:100, status:"created" } +U { id:100, status:"paid" }
其中:
-
+I:Insert新增数据
-
-U:Update之前的数据
-
+U:Update之后的数据
-
-D:Delete删除数据
这种变化事件模型是Flink CDC处理数据变更的核心。
第四阶段:Flink实时计算处理
数据进入Flink之后,可以使用Flink SQL或者DataStream API进行处理。
例如:
数据清洗
过滤无效数据:
SQLSELECT * FROM user WHERE status='active';
数据关联
订单表关联用户表:
SQLSELECT order.id, user.name, order.amount FROM order JOIN user ON order.user_id=user.id;
实时聚合
统计实时交易金额:
SQLSELECT product_id, SUM(amount) FROM orders GROUP BY product_id;
Flink负责:
-
状态管理
-
时间窗口计算
-
Exactly Once一致性
-
故障恢复
确保实时数据处理可靠。
第五阶段:Sink写入目标系统
处理后的数据通过Sink连接器写入目标系统。
常见目标包括:
写入Kafka
流程:
MySQL | Flink CDC | Kafka
适用于:
-
数据分发
-
事件驱动架构
-
多系统消费
写入数据仓库
例如:
MySQL | Flink CDC | Flink SQL | Hive/Iceberg/Hudi
用于实时数仓建设。
写入搜索系统
例如:
MySQL | Flink CDC | Elasticsearch
实现数据库数据实时搜索。
Flink CDC核心架构解析
Flink CDC整体架构主要包含以下组件:
+----------------------+ | Database | | MySQL/PostgreSQL/... | +----------------------+ | | Log Reader | | +----------------------+ | CDC Connector | +----------------------+ | | +----------------------+ | Flink Runtime | | Source -> Operator | | -> Sink | +----------------------+ | | +----------------------+ | Target System | +----------------------+
其中:
Source层
负责:
-
连接数据库
-
读取日志
-
生成Change Event
Operator层
负责:
-
数据转换
-
状态计算
-
业务逻辑处理
Sink层
负责:
-
数据输出
-
外部系统写入
-
数据一致性保证
Flink CDC中的Snapshot与Incremental流程
Flink CDC启动时通常包含两个阶段:
Snapshot阶段
流程:
启动任务 ↓ 读取数据库表结构 ↓ 扫描历史数据 ↓ 发送历史数据 ↓ 保存日志位点
特点:
-
一次性读取旧数据
-
保证初始数据完整
Incremental阶段
流程:
监听Binlog ↓ 捕获变化 ↓ 生成事件 ↓ 实时同步
特点:
-
持续运行
-
延迟低
-
支持实时同步
Flink CDC数据一致性机制
企业应用中最关注的问题之一就是数据一致性。
Flink CDC主要通过以下机制保证可靠性:
1. Checkpoint机制
Flink定期保存任务状态:
任务运行 ↓ Checkpoint ↓ 保存offset ↓ 故障恢复
任务异常恢复后,可以继续从正确位置读取日志。
2. Exactly Once语义
通过:
-
两阶段提交
-
状态快照
-
事务写入
保证数据不会重复或丢失。
3. Schema变化处理
数据库字段变化时,例如:
SQLALTER TABLE user ADD COLUMN age INT;
Flink CDC可以感知Schema变化,并同步到下游。
Flink CDC常见应用场景
1. 实时数据同步
例如:
业务数据库 | Flink CDC | 数据仓库
减少传统ETL批处理延迟。
2. 实时数仓建设
通过CDC采集业务库数据,实时生成:
-
明细层
-
汇总层
-
数据指标
3. 数据备份与迁移
例如:
MySQL | Flink CDC | 新数据库
实现不停机迁移。
4. 搜索数据实时更新
数据库修改后:
用户修改商品信息 ↓ CDC捕获 ↓ 更新ES索引 ↓ 搜索结果同步变化
Flink CDC常见问题分析
1. 数据延迟较高
可能原因:
-
数据库压力过大
-
Flink并行度不足
-
Sink写入速度慢
优化方式:
-
增加Source并行度
-
调整Checkpoint参数
-
优化目标数据库写入
2. 数据重复消费
原因:
-
Checkpoint失败
-
Sink不支持事务
解决:
-
使用幂等写入
-
开启Exactly Once模式
3. Binlog读取失败
检查:
-
Binlog是否开启
-
用户权限是否正确
-
日志格式是否为ROW
总结
Flink CDC的数据流程核心可以概括为:
数据库变化 ↓ 日志捕获 ↓ CDC Connector解析 ↓ Flink实时计算 ↓ 结果写入目标系统
它通过读取数据库日志,将传统离线同步模式升级为实时数据流处理模式。理解Flink CDC流程图,不仅能够帮助开发人员快速搭建实时同步链路,也能更好地解决数据一致性、延迟优化以及数据架构设计中的实际问题。