Flink CDC:新一代实时数据集成框架

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 本文源自阿里云实时计算团队 Apache Flink Committer 任庆盛在 Apache Asia CommunityOverCode 2024 的分享,涵盖 Flink CDC 的概念、版本历程、内部实现及社区未来规划。Flink CDC 是一种基于数据库日志的 CDC 技术实现的数据集成框架,能高效完成全量和增量数据的实时同步。自 2020 年以来,Flink CDC 经过多次迭代,已成为功能强大的实时数据集成工具,支持多种数据库和数据湖仓系统。未来将进一步扩展生态并提升稳定性。

摘要:本文整理自阿里云实时计算团队 Apache Flink Committer 和 PMC Member 任庆盛老师在 Apache Asia CommunityOverCode 2024中的分享。内容主要分为以下四个部分:

  1. 什么是 Flink CDC
  2. Flink CDC 版本历程
  3. Flink CDC 内部实现
  4. Flink CDC 社区与未来规划

一、什么是 Flink CDC

Flink CDC 是一个数据集成框架,它基于数据库日志的 CDC(变更数据捕获)技术实现了统一的增量和全量数据读取。结合 Flink 出色的管道能力和丰富的上下游生态系统,Flink CDC 可以高效地实现海量数据的实时集成。

(1)Flink CDC 使用场景

Flink CDC 可以应用在多种场景中。比如数据同步,可以将上游数据库中的数据同步至下游数据仓库、数据湖等。用户还可以借助 Flink CDC source 实现实时物化视图,结合下游 Flink 作业处理逻辑实现更丰富的业务场景。此外用户还可以使用 Flink CDC 捕获的变更数据基于业务逻辑进行数据分发。

作为一款数据集成框架,Flink CDC 对接了非常丰富的上下游数据库、数据湖仓和消息队列等外部系统,如 MySQL、PostgreSQL、Kafka、Paimon 等。

(2)与传统数据集成流水线比较

一个传统的数据集成流水线通常由两套系统构成:全量同步和增量同步。其中全量同步会使用 DataX、Sqoop 等系统,增量同步需要使用另外一套系统,如 Debezium、Canal 等等。在全量同步完成后,可能还需要额外的一步合并操作将增量表和全量表进行合并,最终得到与上游一致的快照。这种架构的组件构成较为复杂,为系统维护带来了很多困难。

相比于传统数据集成流水线,Flink CDC 提供了全量和增量一体化同步的解决方案,对于一个同步任务,只需使用一个 Flink 作业即可将上游的全量数据和增量数据一致地同步到下游系统。此外 Flink CDC 使用了增量快照算法,无需任何额外配置即可实现全量和增量数据的无缝切换。

二、Flink CDC 版本历程

Flink CDC 诞生于 2020 年 7 月,中间经过不断迭代优化,发布了多个大版本。2021 年 8 月,Flink CDC 发布了 2.0 版本,首次为 MySQL CDC source 引入增量快照算法,实现了全增量同步无缝切换。2022 年 11 月,Flink CDC 发布 2.3 版本,将大多数 connector 对接至增量快照框架。2023 年 12 月,Flink CDC 推出 3.0 版本,正式将 Flink CDC 项目升级为实时数据集成框架,提供 YAML API,为数据同步提供端到端解决方案。

三、Flink CDC 内部实现

(1)Flink CDC YAML

在 Flink CDC 2.x 的时代,Flink CDC 只提供一些 Flink source,用户仍然需要自己开发 Flink DataStream 或 SQL 作业实现数据同步逻辑。如果用户对 Flink 不够熟悉,经常会遇到棘手的数据正确性和乱序问题。此外 Flink CDC 2.x 不支持 schema 变更,而 schema 变更是用户的业务系统中很常见而且很重要的场景。通过对用户使用场景的调研,我们发现绝大多数使用 Flink CDC 的作业都是较为简单的数据 ETL。结合上述问题,我们决定为用户提供一个全新的框架,设计一套全新的 API,专注于数据同步场景。

(2)Flink CDC 整体设计

Flink CDC 基于 Flink runtime 实现,因此可以充分复用 Flink 的资源管理和在不同环境上部署的能力。针对各种数据集成场景,Flink CDC 深度定制了多种自定义算子,如 schema operator、router、transformer 等。为了将不同的算子进行协调和组合,Flink CDC 引入了 composer 组件,可根据用户定义的数据同步逻辑构建 Flink 作业。依托于 Flink 丰富的生态系统,开发者只需简单地封装即可快速将现有的 Flink connector 对接至 Flink CDC。此外 Flink 还提供了 CLI,只需一个脚本即可将用户的 YAML 定义使用 composer 构建成 Flink 作业,并提交至指定 Flink 集群。基于以上架构,Flink CDC 为数据集成用户提供 schema 变更同步、整库同步、分库分表同步等增强能力。

(3)Flink CDC API

Flink CDC API 使用 YAML 语法定义数据同步任务,即易于开发者进行手动开发,又可以高效地使用机器进行处理。YAML API 针对数据集成场景设计,用户只需定义同步数据源和数据目标端即可快速搭建起一个实时同步流水线。此外用户还可以在 YAML 中定义 routing 和 transformation 实现自定义数据分发和变换。用户不再需要熟练掌握 Flink 作业开发与内部实现,即可使用 Flink CDC 搭建实时数据集成流水线。

Flink CDC 提供的 CLI(flink-cdc.sh)进一步简化了用户提交 Flink CDC 任务的流程。用户只需执行一行命令,CDC composer 会将 source、sink、自定义 CDC runtime 构建成 Flink 任务,创建 Flink JobGraph 后提交至 Flink 集群。

(4)Flink CDC Pipeline 连接器

Flink CDC 定义了自己的数据源和目标端连接器的接口,以适配 Flink CDC 内部的数据结构。Flink CDC pipeline connector 基于 Flink connector,只需进行简单的数据转换封装,即可快速复用现有的 Flink connector,将其对接到 Flink CDC 生态系统中。为了实现 schema 变更处理能力,Flink CDC 定义了 MetadataAccessor 和 MetadataApplier,分别对源端和目标端的 schema 等元信息进行获取和处理,实现 schema 变更的实时同步。

(5)Flink CDC Source 增量快照算法

为了实现全量和增量的一体化同步,Flink CDC source 使用增量快照算法,既实现了全增量同步的无缝切换,而且采用了无锁设计,避免全量同步时的锁表动作对上游业务的影响。在增量快照算法中,数据库的全量数据被切分为独立的数据块(chunk),分发给 source 的各个并发进行读取。考虑到在全量读取过程中数据还有可能发生变化,在开始读取前,source 将 binlog 的当前位点记为低水位线(low watermark),在全量读取结束后再次将 binlog 最新位点记录为高水位线(high watermark),随后读取高、低水位线之间的变更数据,将其合并到已读取的全量数据块中,从而构建一个与上游完全一致的数据块。在完成全部数据块的读取之后,source 会根据记录的高水位线确定切换位点,实现全量和增量的无缝切换。

(6)Flink CDC 对 Schema 变更的支持

Flink CDC 通过定制化的 schema operator 以及 schema registry 的协调,实现对上游 schema 变更的实时同步。当 schema operator 感知到上游发生 schema 变更后,会将变更信息同步给 schema registry,并暂停数据流的处理。schema registry 首先插入 Flush 事件将下游数据全部从 sink 推出,在收到全部 sink 的确认后,通过 MetadataApplier 将 schema 变更应用在下游系统中,在完成 schema 变更后,schema registry 通知 schema operator,并恢复数据流处理,完成整个 schema 变更的流程。

(7)Flink CDC 对数据分发处理的支持

Flink CDC 定制了 router 算子,实现对变更数据的分发和合并。用户可以在 YAML 中使用 route 字段修改变更数据的目标数据库和表名,将数据同步至指定目标端,同样也可以通过指定多对一的路由规则,将多个表合并为目标端中的一张表。

(8)Flink CDC 对数据变换的支持

通过在 YAML 中使用 transform 字段,用户可以在数据流上定义投影、过滤、增加元信息列等数据变换操作,调整数据内容后同步至下游。transform 使用类 SQL 语法,既可以让用户简单上手开发,又保留了对更多类型变换支持的可扩展性。

(9)Flink CDC 数据结构

Flink CDC 在数据流中定义了数据和 schema 信息的协议:

  • 数据流以 CreateTableEvent 开始来描述起始 schema

  • 后续所有的 DataChangeEvent 需要遵循其前方的 schema

  • 当 schema 发生变更时,需要在数据流中发送一个新的 SchemaChangeEvent 以描述 schema 变化

这种设计的优势在于实现了数据和 schema 的分离,大大降低了数据的序列化成本。此外 Flink CDC 为数据变更事件使用了压缩的二进制格式,进一步提升了性能。

四、Flink CDC 社区与未来规划

目前 Flink CDC 已经有超过 160 位贡献者,项目获得 5k+ star,1000+ commit。未来 Flink CDC 将着力于扩展生态,对接至更多的外部系统,如 PostgreSQL、Iceberg 等,并且将支持更多的 schema 变更类型和数据类型。另外 Flink CDC 也会持续提升生产稳定性,包括对异常处理方式进行自定义配置、提升测试覆盖等等。作为 Apache Flink 的子项目,Flink CDC 使用与 Flink 一致的贡献流程。欢迎各位用户和贡献者在 Flink 邮件列表中咨询和讨论,使用 Apache JIRA 创建 issue,在 GitHub 上提交 PR!

欢迎大家多多关注 Flink CDC,从钉钉用户交流群[1]、微信公众号[2]、Slack 频道[3]、邮件列表[4]加入 CDC 用户社区,以及在 Flink CDC GitHub 仓库[5]上参与代码贡献!


[1] “ Flink CDC 社区 ② 群”群的钉钉群号:80655011780

[2] ” Flink CDC 公众号“的微信号:ApacheFlinkCDC

[3] https://flink.apache.org/what-is-flink/community/#slack

[4] https://flink.apache.org/what-is-flink/community/#mailing-lists

[5] https://github.com/apache/flink-cdc


更多内容

img


活动推荐

阿里云基于 Apache Flink 构建的企业级产品-实时计算 Flink 版现开启活动:
新用户复制点击下方链接或者扫描二维码即可0元免费试用 Flink + Paimon
实时计算 Flink 版(3000CU*小时,3 个月内)
了解活动详情:https://free.aliyun.com/?utm_content=g_1000395379&productCode=sc

retouch_2024070417440476.jpg

相关文章
|
28天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
82 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
2月前
|
存储 分布式计算 API
大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构
大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构
85 0
|
22天前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
51 9
|
29天前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
54 1
|
15天前
|
SQL 分布式计算 数据处理
Structured Streaming和Flink实时计算框架的对比
本文对比了Structured Streaming和Flink两大流处理框架。Structured Streaming基于Spark SQL,具有良好的可扩展性和容错性,支持多种数据源和输出格式。Flink则以低延迟、高吞吐和一致性著称,适合毫秒级的流处理任务。文章详细分析了两者在编程模型、窗口操作、写入模式、时间语义、API和库、状态管理和生态系统等方面的优劣势。
|
2月前
|
数据挖掘 物联网 数据处理
深入探讨Apache Flink:实时数据流处理的强大框架
在数据驱动时代,企业需高效处理实时数据流。Apache Flink作为开源流处理框架,以其高性能和灵活性成为首选平台。本文详细介绍Flink的核心特性和应用场景,包括实时流处理、强大的状态管理、灵活的窗口机制及批处理兼容性。无论在实时数据分析、金融服务、物联网还是广告技术领域,Flink均展现出巨大潜力,是企业实时数据处理的理想选择。随着大数据需求增长,Flink将继续在数据处理领域发挥重要作用。
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
301 6
|
5月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
394 4
|
5月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
341 1
|
6月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
178 2

相关产品

  • 实时计算 Flink版