一、Flink CDC 简介
CDC(Change Data Capture)是一种用于捕获数据库变更的技术。通常所说的 CDC 主要面向数据库的数据变化,是一种用于捕捉数据库变更事件的技术。
Flink CDC 经过多轮迭代,已经不再局限于 MySQL 或其他单一数据源的 CDC 数据流,目前已发展为一种支持流批一体的分布式数据集成工具。它通过 YAML 配置描述数据传输过程中的路由、转换等数据集成操作。在最新版阿里云实时计算服务中,已完整集成开源 Flink CDC 的全部功能。
FlinkCDC专注于提供数据开发中的数据摄入能力,支持用户通过 YAML 配置文件完成完整的数据集成任务。采用 YAML 配置方式降低了使用门槛,同时FlinkCDC也预设了一些常用模板供用户选择。
FlinkCDC的最新数据摄入功能已升级至 Flink CDC 3.4 版本,包含 3.4 的核心能力增强、数据集成工具改进以及整体功能体系的增强。预计将在五月底发布,欢迎大家关注。
二、Flink CDC EMO 核心能力
1. 多样化的数据输入链路支持
在数据输入环节,FlinkCDC支持多种常见的入湖入仓链路,例如 MySQL 到 Delta Lake、Iceberg 等同步链路。这些同步链路所依赖的连接器均由系统自动识别并添加到作业中,用户无需手动管理。
此外,数据输入功能还帮助用户管理整个 CDC EMO 作业的生命周期,包括启动、停止、重启等操作。同时FlinkCDC提供了版本管理的便捷功能,如版本回滚等。
为了满足用户对监控的需求,FlinkCDC 还提供了丰富的数据同步作业指标。目前最新版本已于四月份上线,支持将现有的 CTS 作业迁移为 YAML 作业。新建 YAML 作业时,开发者可以通过现有 CTS 或 CTAS 作业快速生成数据摄入的 YAML 作业,无需手动转换。
2. 支持的数据同步链路
目前 CDC EMO 数据摄入功能支持的 SaaS 端同步链路中,除广泛使用的 MySQL 外,FlinkCDC还支持 Kafka 链路。该链路主要用于同步原始 binlog 数据,用户可将 binlog 数据同步至 Kafka,再通过 Kafka 同步到其他目的端。
同时,CDC EMO 还支持 Schema Evolution 和 Schema 变更控制,具备整库同步能力,能够将数据变更同步到下游系统当中。FlinkCDC计划于五月底发布新版本,新增对 SQL Server 数据源的支持,并实现从 SQL Server 到 Delta Lake 的 Schema Evolution,以简化整体湖仓场景中原数据管理的复杂度。
当前下游目标端主要包括 Delta Lake、Iceberg、Hologres 和 Kafka。
对于 Kafka,FlinkCDC目前支持两种同步方式:
- 一种是通过实时表 Flink Upsert Kafka 连接器直接读取数据;
- 另一种是将原始 binlog 日志同步至 Kafka 并进行存储,供后续处理使用。
新版本中还将新增 Mass Compute Sink 功能,支持 TB 级以上的大规模数据写入,适用于离线数据处理与大数据存储场景。此外,FlinkCDC将新增对 SelectDB 和 Apache Doris 的支持,完善整体数据同步链路的目标存储适配能力。
3. Transform 与 Routing 模块
Flink CDC EMO 还具备额外的功能模块,可在数据同步过程中执行额外计算处理。
Transform 模块
- 可添加计算列,根据已有字段生成新的列;
- 支持在读取过程中添加元数据列,如操作类型、表名或数据库名;
- 提供丰富的内置函数,并支持用户自定义 UDF;
- 兼容 SQL 作业中的 Flink Scalar Function,用户可在 Transform 中无缝使用;
- 支持重新指定下游组件或分区键,应对写入目标表时的额外依赖;
- 支持数据过滤,清理不必要的数据。
Routing 模块
- 支持上下游之间的映射关系配置;
- 在整库同步场景中,可将上游一张表一对一同步至下游一张表;
- 在分库分表场景中,可通过 Routing 模块将多个库中的多张表同步至目标端同一张表;
- 支持批量定义下游 Sink 表名,例如统一添加版本前缀等。
4. 数据同步进度与状态监控
FlinkCDC提供了一系列关键指标,帮助用户全面掌握数据同步进度及相关信息。FlinkCDC支持全量与增量一体化同步,在同步阶段,Flink CDC 会将每个表切分为多个分片进行处理。
FlinkCDC提供的指标可用于判断当前处于全量同步阶段还是增量同步阶段,并按表提供以下信息:
- 已处理/未处理分片数;
- 已处理/未处理表数;
- 数据条数统计(全量阶段 / 总计);
- 最新读取时间戳;
- 延迟指标。
此外FlinkCDC还提供更丰富的功能,如细粒度的 Schema 变更策略。
在数据同步过程中,为了避免在下游执行潜在危险操作(如 drop table),FlinkCDC提供了更细粒度的表变更序列控制,允许用户进行过滤和跳过。此外,FlinkCDC还支持变更的宽容模式,支持更多类型的变更操作。FlinkCDC还支持原始 binlog 数据同步,以满足用户的多样化开发需求。
5. 与 SQL/CTAS 对比优势
相较于传统的 SQL 作业开发方式,FlinkCDC对 CCM 开发方式进行了对比分析:
特性 |
SQL/CTAS |
Flink CDC EMO |
Schema Evolution 支持 |
❌ |
✅ |
Binlog 原始格式保留 |
❌ |
✅ |
多表同步支持 |
❌ |
✅ |
细粒度变更控制 |
❌ |
✅ |
传统 SQL 作业无法支持 Schema Evolution,需要预先定义 schema,且作业启动后无法更改,限制了灵活性。此外,SQL 依赖 row data 传递数据,会破坏 binlog 原始格式。例如将 update 数据拆分为 update before 和 update after 两条记录,导致 SQL 作业无法支持原始 binlog 同步。此外,SQL 方式通常仅支持单表读写,而 CDC EMO 是专为数据同步设计的工具,支持自动同步 schema 变更,并提供细粒度的 schema 变更控制。更重要的是,CDC EMO 在传递内容时保留了原始 change log 格式,包含 data change event 和 schema change event。同时,schema 压缩还支持多表读写功能。
对于熟悉 Flink 的用户而言,SQL 提供的 CTS 和 CTAS 语法可用于数据同步。但由于 CTS/CTAS 基于 SQL API,依赖 raw data 格式传递数据,无法完成原始表结构的同步。此外,schema 变更需等待新数据到达才会触发同步,且 CTS/CTAS 会破坏原有的 change log 结构,无法实现原始 change 同步。而在 CDC EMO 中,FlinkCDC支持更多类型的 schema 变更,如 job table 等,支持原始 binlog 同步,并提供更细粒度的 schema 变更策略。通过 Routing 模块可灵活定义目标表名称。此外,YAML 配置支持数据过滤功能,以及通过 Transform 模块裁剪字段,去除冗余数据。
6. 与 DataStream 作业对比优势
DataStream 作业的主要挑战在于用户需深入了解 Java 编程语言和分布式系统原理,包括框架机制及相关技术。此外,用户还需自行管理依赖项,熟悉相关构建工具,且 DataStream 代码复用性较差。
相比之下,CDC EMO 在多个方面展现出显著优势,尤其适合初级用户。CDC EMO 隐藏了底层细节,使开发更为简洁。采用 YAML 格式不仅易于开发,也易于理解。更重要的是,CDC EMO 的作业配置清晰明了,极大提升了配置的复用性。
三、典型应用场景:整库同步至 Kafka
在许多业务场景中,Flink CDC 与 Kafka 的结合成为一种高效的数据流传输和实时业务加速方案。
当多个作业依赖于 MySQL 的同一张表时,频繁建立数据库连接会导致数据库压力过大。通过整库同步后,Upsert Kafka 表可作为原表替代读取,有效减轻系统压力。
示例配置流程:
- 定义 MySQL 数据源;
- 在 EMO 端配置数据连接信息;
- 在整库同步至 Kafka 时,可通过 Routing 模块定义下游 topic 名称;
- 若未特别指定,默认 topic 名称将使用数据库名加表名组合而成。
除了将整张表的数据同步至 Upsert Kafka 外,还有一种场景是用户希望将完整的变更信息(即 binlog 原始内容)进行存储。这一功能在 CTS 或 CTAS 中无法实现,但在 CDC YAML 中得到了支持。
如果用户需要将 binlog 原始数据同步至 Kafka,可按如下方式配置:
- 首先定义 MySQL 的连接信息;
- 若用户需要记录操作时间戳等元数据信息,可额外添加 metadata 列;
- 系统将在对应的 topic 中自动添加该列。
目前FlinkCDC支持 Debezium JSON 和 Default JSON 两种变更格式,默认使用 Default JSON 类型。由于 update 操作格式较为复杂,图中展示的是 update 格式,包含 before 和 after 内容、操作类型及来源信息。
四、实战 DEMO 演示
本次 DEMO 演示将展示整库同步 binlog 至 Kafka 的全过程,具体演示请观看视频:https://developer.aliyun.com/live/255088
首先可以看到FlinkCDC选择了三张表进行数据同步。共有 93 张表,共九条数据参与同步。通过 Routing 模块指定了 topic 名称。
在部署整库同步作业后,可以看到作业已成功启动。检查监控告警发现,目前已完成从全量到增量的切换。全量阶段每张表三条数据,共计九条已完成同步。
接下来FlinkCDC查看 Kafka,可见三个 topic 已成功创建。查询具体表数据时,FlinkCDC选择较早的时间点进行检索。此处FlinkCDC使用默认的 Debezium JSON 格式保留数据。在 customer 表中FlinkCDC进行了 schema 变更、插入新数据、删除及更新操作。
继续查询 Kafka 数据,可见数据已正常同步。
FlinkCDC还执行了数据更新、删除和修改操作,并验证其同步情况。
最后FlinkCDC在 customer 表中新增了一列,并再次验证数据是否同步成功。
五、Flink CDC 整体数据同步方案
目前阿里云基于 Flink CDC 提供了一套完整的数据同步解决方案。相较于传统数据集成流水线,Flink CDC 提供了全量与增量一体化的同步方案。
对于一个同步任务,只需一个 Flink 作业即可将上游的全量与增量数据一致同步至下游系统。此外,FlinkCDC采用了增量快照算法,用户无需额外配置即可实现全量与增量数据的无缝切换。感兴趣的用户可通过阿里云平台体验 Flink CDC 的整体数据同步功能。
六、未来规划方向
- 增强数据处理能力
- 整合数据处理与采集能力,提升异常数据处理效率。
- 引入限流机制
- 控制同步速度,避免影响线上业务。
- 日志并行解析优化
- 支持 MongoDB、PolarDB 等高性能日志拉取。
- AI 能力集成
- 内置 AI Model,实现数据分类、实体识别、特征提取等高级处理。
- 扩展上下游生态
- 支持 Iceberg、PostgreSQL、Flink Flusher 等更多组件。