概念篇
1、Flink 与 Flink CDC 基础概念
1.1 Flink
Apache Flink 是一个开源的分布式流处理框架,支持高吞吐、低延迟的数据处理任务。它不仅适用于无界数据流(Unbounded Stream),也支持有界数据批处理(Batch Processing)。Flink 提供了丰富的 API,如:
- DataStream API:用于处理无界/有界流数据。
- DataSet API(已弃用):用于批处理。
- Table API & SQL:提供类 SQL 接口,便于数据转换与分析。
- Stateful Functions:构建事件驱动的微服务架构。
Flink 的核心优势在于:
- 支持事件时间(Event Time)。
- 精确一次(Exactly-once)语义。
- 状态管理(State Management)。
- 检查点机制(Checkpointing)。
1.2 Flink CDC
Flink CDC(Change Data Capture)是基于 Apache Flink 构建的一个连接器插件,主要用于从数据库中实时捕获数据变更(INSERT、UPDATE、DELETE),并将其以流的形式发送到下游系统(如 Kafka、Elasticsearch、Iceberg、Doris 等)。
核心特性包括:
- 无需依赖数据库日志工具(如 Debezium)。
- 直接读取数据库 Binlog 实现 CDC。
- 支持 MySQL、PostgreSQL、Oracle 等主流数据库。
- 与 Flink Table API / SQL 高度集成。
- 可实现端到端 Exactly-once 语义。
例如,使用 Flink CDC 可以轻松实现如下功能:
CREATE TABLE mysql_cdc (
id INT PRIMARY KEY,
name STRING
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '3306',
'database-name' = 'test_db',
'table-name' = 'users',
'username' = 'root',
'password' = '123456'
);
1.3 Flink 与 Flink CDC 区别
| 对比项 | Apache Flink | Flink CDC |
|---|---|---|
| 定位 | 流批一体计算引擎 | 数据库变更捕获连接器 |
| 功能 | 提供流处理、状态管理、窗口计算等底层能力 | 利用 Flink 的能力实现实时数据库监控 |
| 使用方式 | 可独立运行或嵌入应用 | 必须依赖 Flink 运行时环境 |
| API 层级 | 提供基础 API(DataStream、Table) | 封装了 Source Operator |
| 扩展性 | 可扩展性强,支持多种数据源 | 当前主要面向关系型数据库 |
总结:Flink 是“发动机”,Flink CDC 是“轮胎”;没有 Flink,Flink CDC 无法运行;但有了 Flink,Flink CDC 能让数据库实时同步变得异常简单。
2、Flink CDC 与 Flink 版本
Flink CDC 并不是独立运行的系统,它必须依赖特定版本的 Apache Flink。不同版本的 Flink CDC 对应不同的 Flink 版本,以下是常见的版本对应关系:
| Flink CDC 版本 | 支持的 Flink 版本 |
|---|---|
| 2.3.x | Flink 1.11 - 1.13 |
| 2.4.x | Flink 1.13 - 1.15 |
| 2.5.x | Flink 1.16 - 1.17 |
| 2.6.x | Flink 1.18+ |
注意:
- 不建议跨多个主版本使用,比如 Flink 1.17 + Flink CDC 2.4.x,可能引发 ClassNotFound 或 NoSuchMethodError。
- JDK 兼容性也要注意:Flink 1.14 及以前版本支持 JDK 8;Flink 1.15 开始逐步转向 JDK 11,但仍部分兼容 JDK 8。
1、Flink 1.14.6 前后命名变更
从 Flink 1.14.6 开始,官方对一些关键模块的 artifactId 命名进行了简化,去掉了原本包含的 Scala 版本号(如 _2.11 或 _2.12)。
1.1 旧版本命名
<= Flink 1.14.6
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.13.6</version>
</dependency>
这里的 _2.12 表示该模块是使用 Scala 2.12 编译的。
1.2 新版本命名
>= Flink 1.14.6
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>1.15.4</version>
</dependency>
不再带有 Scala 版本号,原因是:
- Flink 1.14+ 开始默认使用 Scala 2.12。
- 后续版本逐步移除了对 Scala 的强耦合,开始向 Java 主导转型。
- 社区计划未来完全去除 Scala 依赖,提高维护性和性能。
提示:如果你使用的是较老的 Flink CDC 插件(如 2.4.x),请确保你使用的 Flink 模块名称与之匹配。
3、如何选择合适版本
根据你的需求(是否需要新特性、是否使用 JDK 8、是否部署生产环境)来选择合适的组合:
| 场景 | 推荐版本组合 |
|---|---|
| JDK 8 + 稳定生产环境 | Flink 1.13.6 + Flink CDC 2.4.0 |
| JDK 8 + 仍需较新功能 | Flink 1.15.4 + Flink CDC 2.4.0 |
| JDK 11 + 生产推荐 | Flink 1.16.0 + Flink CDC 2.5.1 |
| 最新功能尝鲜 | Flink 1.18.x + Flink CDC 2.6.x |
如果你在 Spring Boot 中集成 Flink CDC,请特别注意以下几点:
- 所有依赖版本保持一致。
- 显式排除冲突依赖(如旧版 MySQL 驱动)。
- 使用
mvn dependency:tree查看依赖树避免冲突。