集捕获、计算、同步于一体的“全才”——Flink CDC
在之前的CDC系列文章中,我们认识了专注于MySQL的“专才”Canal,也聊过支持多数据库的“通才”Debezium。如果说它们解决了“如何捕获变更”的问题,那么今天要介绍的这位主角,则更进一步解决了“捕获之后怎么办”的问题——Flink CDC。
一、什么是Flink CDC?
Flink CDC(Change Data Capture)是基于Apache Flink构建的实时数据集成框架。它并非一个独立的服务,而是深度融入了Flink生态——你可以直接在Flink作业中使用它,无需额外部署和运行独立的组件。
如果说Canal和Debezium是“数据捕获器”,那么Flink CDC就是“数据捕获器 + 流计算引擎 + 数据同步管道”的三合一方案。它将CDC技术与Flink强大的流处理能力、丰富的上下游生态相结合,实现了从数据捕获、实时计算到目标写入的端到端一体化解决方案。
Flink CDC诞生于2020年7月,在短短几年内发展迅猛——社区已吸引了111位贡献者,培养了8位Maintainer,社区用户群超过9800人。从1.0到2.0再到3.0,Flink CDC完成了一次次蜕变:
- 1.0时代:用户只需一个简单的Flink SQL作业即可完成CDC数据的同步、加工和分析
- 2.0时代:引入增量快照算法,实现无锁并发读取和全增量无缝切换
- 3.0时代(2023年12月):从Flink数据源正式升级为端到端的流式ELT数据集成框架
二、核心原理:从“捕获”到“集成”
Flink CDC的技术原理融合了CDC日志捕获与Flink流处理两大核心能力。
2.1 底层依赖:站在巨人的肩膀上
Flink CDC的底层数据捕获,基于Debezium引擎实现。它通过数据库连接器(如DebeziumSourceFunction)订阅数据库的事务日志(MySQL的binlog、PostgreSQL的WAL等),并将其解析为结构化的变更事件流(INSERT/UPDATE/DELETE)。
2.2 双流模型:全量 + 增量一体化
Flink CDC最核心的创新在于**“快照 + 增量”双模式设计**:
- 初始快照阶段:通过JDBC协议获取数据库的全量数据,同时建立一致性位点
- 增量同步阶段:从快照结束的位点开始,持续消费数据库日志,实时同步后续的所有变更
这种设计实现了全量和增量同步的无缝切换,用户无需关心“什么时候全量结束、什么时候增量开始”——Flink CDC自动完成这一切。
2.3 分布式架构:突破单点瓶颈
与Canal等单机架构的CDC工具不同,Flink CDC充分利用了Flink的分布式计算能力。它支持:
- 并行读取:全量阶段可以对大表进行分片并发读取,大幅提升同步速度
- 水平扩展:通过增加并行度来应对海量数据场景
- Checkpoint机制:利用Flink的状态后端与检查点机制,实现Exactly-Once语义——故障恢复时数据不重不漏
三、核心特性:为什么选择Flink CDC?
3.1 全增量一体化同步
传统的数据集成流水线通常由两套系统构成——全量同步用DataX、Sqoop,增量同步用Debezium、Canal,全量完成后还需要额外的合并操作。而Flink CDC只需一个Flink作业,即可将上游的全量数据和增量数据一致地同步到下游系统。
3.2 无锁并发读取
Flink CDC 2.0引入的增量快照算法,参考了DBLog论文的设计,实现了无锁读取——在全量同步过程中不需要对源表加锁,避免了影响业务写入。
3.3 表结构变更自动同步(Schema Evolution)
这是Flink CDC 3.0带来的重磅特性。上游数据库发生加列、减列、修改列类型等DDL操作时,Flink CDC能够自动感知并将表结构变更同步到下游。用户不再需要手动调整作业配置。
3.4 整库同步与分库分表同步
Flink CDC 3.0支持一个作业同步整个数据库的所有表,甚至支持分库分表场景下的合并同步。这大大减少了数据库连接数,节省了计算资源。
3.5 YAML声明式配置(3.0+)
从3.0开始,Flink CDC提供了YAML API——用户只需编写一个简单的YAML配置文件,即可快速构建数据入湖入仓作业。相比2.x时代需要自己开发DataStream或SQL作业,门槛大幅降低。
四、主要应用场景
4.1 实时数据入湖入仓
这是Flink CDC最主要的应用场景。将MySQL、PostgreSQL等业务数据库的变更实时同步到数据湖(如Iceberg、Hudi、Paimon)或数据仓库(如Doris、StarRocks),构建实时数仓。
4.2 实时数据同步
在数据库与Kafka、Elasticsearch、HDFS等系统之间进行实时数据同步。例如,将MySQL的订单数据实时同步到Elasticsearch,实现搜索服务的秒级更新。
4.3 实时物化视图与实时分析
将实时捕获的数据库变更数据与其他流数据结合,用于实时BI报表和实时数据分析。
4.4 数据分发与微服务解耦
将数据库变更实时分发给多个下游系统,实现微服务架构下的数据解耦。
五、Flink CDC vs. Canal vs. Debezium
结合本系列前几篇文章,我们可以将这三个CDC工具做一个全面的对比:
| 维度 | Flink CDC | Debezium | Canal |
|---|---|---|---|
| CDC机制 | 日志(基于Debezium) | 日志 | 日志 |
| 增量同步 | ✅ | ✅ | ✅ |
| 全量同步 | ✅ | ✅ | ❌(需配合其他工具) |
| 全量+增量一体化 | ✅(无缝切换) | ✅ | ❌ |
| 架构 | 分布式 | 单机 | 单机 |
| 表结构变更同步 | ✅(3.0+) | ❌ | ❌ |
| 整库同步 | ✅(3.0+) | ❌ | ❌ |
| 数据转换能力 | ★★★★☆(Flink SQL) | ★★ | ★★ |
| 生态丰富度 | ★★★★☆ | ★★★ | ★★★ |
| 数据库支持 | 广泛(MySQL、PG、Oracle等) | 广泛 | 主要支持MySQL |
总结来说:
- Canal:轻量级MySQL专才,适合简单的MySQL增量订阅场景
- Debezium:多数据库通才,适合需要通过Kafka Connect构建CDC管道的场景
- Flink CDC:集大成者——不仅捕获变更,还能实时计算、灵活转换、端到端同步,适合复杂的实时数据集成场景
六、快速入门:5分钟体验Flink CDC
以下是一个最简单的Flink CDC MySQL → Kafka的同步示例:
Step 1:添加Maven依赖
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>1.14.0</version>
</dependency>
Step 2:编写Flink CDC作业
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(30000); // 启用Checkpoint,实现Exactly-Once
// 配置MySQL CDC Source
DebeziumSourceFunction<String> sourceFunction =
MySQLSource.<String>builder()
.hostname("localhost")
.port(3306)
.databaseList("test_db")
.tableList("test_db.orders")
.username("flinkuser")
.password("password")
.deserializer(new JsonDebeziumDeserializationSchema())
.build();
DataStreamSource<String> stream = env.addSource(sourceFunction);
// 写入Kafka
stream.addSink(new FlinkKafkaProducer<>(
"localhost:9092",
"cdc-orders-topic",
new SimpleStringSchema()
));
env.execute("Flink CDC MySQL to Kafka");
Step 3:启动作业
运行上述Java程序,Flink CDC就会开始工作——先全量同步orders表的现有数据,然后持续监听后续的变更,实时推送到Kafka。
关键配置说明:
- Checkpoint:启用Flink的Checkpoint机制(如30秒间隔),是实现Exactly-Once语义和故障恢复的关键
- 并行度:可根据数据量动态调整Source的并行度
- 状态后端:生产环境推荐使用RocksDB,支持TB级状态存储
七、总结
从2020年7月的第一个commit,到2023年12月的3.0里程碑,Flink CDC走过了一条从“个人兴趣项目”到“企业级实时数据集成框架”的快速演进之路。
如果说Canal是MySQL实时同步的“专才” ,Debezium是多数据库CDC的“通才” ,那么Flink CDC就是集“捕获、计算、同步”于一体的“全才” 。它不仅解决了“如何捕获变更”的问题,更解决了“捕获之后如何端到端地集成、转换、写入”的完整链路问题。
无论是实时入湖入仓、实时数据同步,还是实时物化视图与流式ETL,Flink CDC都提供了从YAML声明式配置到分布式高可用执行的一站式解决方案。如果你正在构建实时数据管道,Flink CDC值得你认真关注。
希望这篇文章能帮助你全面了解Flink CDC。从Canal到Debezium再到Flink CDC,数据同步技术正在从“单一工具”走向“一体化框架”——而你,正站在这个演进的前沿。
集捕获、计算、同步于一体的“全才”——Flink CDC
https://lautung.com/archives/4gXQvujq
评论