Flink 与 Flink CDC 基础概念

318 阅读3分钟

概念篇

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 FlinkFlink 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.xFlink 1.11 - 1.13
2.4.xFlink 1.13 - 1.15
2.5.xFlink 1.16 - 1.17
2.6.xFlink 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 查看依赖树避免冲突。