共计 5405 个字符,预计需要花费 14 分钟才能阅读完成。
本文作者徐榜江 (雪尽)
以下视频为伍翀 (云邪) 分享的 Flink CDC 前世今生:
https://www.bilibili.com/vide…
前言
CDC (Change Data Capture) 是一种用于捕获数据库变更数据的技术,Flink 从 1.11 版本开始原生反对 CDC 数据(changelog)的解决,目前曾经是十分成熟的变更数据处理计划。
Flink CDC Connectors 是 Flink 的一组 Source 连接器,是 Flink CDC 的外围组件,这些连接器负责从 MySQL、PostgreSQL、Oracle、MongoDB 等数据库读取存量历史数据和增量变更数据。Flink CDC Connectors 是一个独立的开源我的项目,从去年 7 月份开源以来,社区放弃了相当高速的倒退,均匀两个月一个版本,在开源社区的关注度继续走高,也逐步有越来越多的用户应用 Flink CDC 来疾速构建实时数仓和数据湖。
在往年 7 月份,Flink CDC Maintainer 徐榜江 (雪尽) 在北京的 Flink Meetup 首次分享了 Flink CDC 2.0 的设计。随后的 8 月份,Flink CDC 社区公布 2.0 版本,解决了诸多生产实践上的痛点,Flink CDC 社区的用户群也随之迅速壮大。
除了社区用户群体的迅速扩充,社区的开发者也在疾速减少,目前曾经有国内外多家公司的开发者退出到 Flink CDC 社区的开源共建,有来自北美 Cloudera 的开发者,也有来自欧洲 Vinted,Ververica 的开发者,国内的开发者更加沉闷,有来自腾讯,阿里,字节等互联网公司的开发者,也有来自 XTransfer,新华文轩等守业公司和传统企业的开发者。此外,国内外的多家云厂商,其流计算产品都曾经集成了 Flink CDC,让更多的用户体验到 Flink CDC 的弱小与便捷。
一、Flink CDC 2.1 概览
在社区开发者们共同努力下,明天 Flink CDC 社区很开心地发表 Flink CDC 2.1 正式公布了:https://github.com/ververica/…
本文带着你 10 分钟理解 Flink CDC 2.1 版本的重大改良和外围性能。2.1 版本蕴含 23 位贡献者奉献的 100+ PR,重点晋升了 MySQL CDC 连接器的性能和生产稳定性,重磅推出 Oracle CDC 连接器和 MongoDB CDC 连接器。
- MySQL CDC 反对百亿级数据的超大表,反对 MySQL 全副数据类型,通过连接池复用等优化大幅晋升稳定性。同时提供反对无锁算法,并发读取的 DataStream API,用户能够借此搭建整库同步链路;
- 新增了 Oracle CDC 连接器,反对从 Oracle 数据库获取全量历史数据和增量变更数据;
- 新增了 MongoDB CDC 连接器,反对从 MongoDB 数据库获取全量历史数据和增量变更数据;
- 所有连接器均反对了 metadata column 性能,用户通过 SQL 就能够拜访库名,表名,数据变更工夫等 meta 信息,这对分库分表场景的数据集成十分实用;
- 丰盛 Flink CDC 入门文档,减少多种场景的端到端实际教程。
二、MySQL CDC 连接器改良详解
在 Flink CDC 2.0 版本里,MySQL CDC 连接器提供了无锁算法,并发读取,断点续传等高级个性, 一并解决了诸多生产实践上的痛点,随后大量用户开始投入使用并大规模上线。在上线过程中,咱们配合用户解决了诸多生产问题,同时也开发了一些用户迫切需要的高优性能,Flink CDC 2.1 版本针对 MySQL CDC 连接器的改良次要包含两类,一类是稳定性晋升,一类是性能加强。
1. 稳定性晋升
- 针对不同的主键散布,引入动静分片算法
对主键是非数值、Snowflake ID、稠密主键、联结主键等场景,通过动态分析源表的主键散布的平均水平,依据散布的平均水平主动地计算分片大小,让切片更加正当,让分片计算更快。动静分片算法可能很好地解决稠密主键场景下分片过多的,联结主键场景下分片过大等问题,让每个分片蕴含的行数尽量维持在用户指定的 chunk size,这样用户通过 chunk size 就能管制分片大小和分片数量,无需关怀主键类型。
- 反对百亿级超大规模表
在表规模十分大时,以前会报 binlog 分片下发失败的谬误,这是因为在超大表对应的 snapshot 分片会十分多,而 binlog 分片须要蕴含所有 snapshot 分片信息,当 SourceCoordinator 下发 binglog 分片到 SourceReader 节点时,分片 size 超过 RPC 通信框架反对的最大 size 会导致分片下发失败。尽管能够通过批改 RPC 框架的参数缓解分片 size 过大问题,但无奈彻底解决。2.1 版本里通过将多个 snapshot 分片信息划分成 group 发送,一个 binlog 分片会切分成多个 group 一一发送,从而彻底解决该问题。
- 引入连接池治理数据库连贯,晋升稳定性
通过引入连接池治理数据库连贯,一方面升高了数据库连接数,另外也防止了极其场景导致的连贯泄露。
- 反对分库分表 schema 不统一时,缺失字段主动填充 NULL 值
2. 性能加强
- 反对所有 MySQL 数据类型
包含枚举类型、数组类型、地理信息类型等简单类型。
- 反对 metadata column
用户能够在 Flink DDL 中通过 db_name STRING METADATA FROM ‘database_name’ 的形式来拜访库名(database_name)、表名(table_name)、变更工夫(op_ts)等 meta 信息。这对分库分表场景的数据集成十分应用。
- 反对并发读取的 DataStream API
在 2.0 版本中,无锁算法,并发读取等性能只在 SQL API 上透出给用户,而 DataStream API 未透出给用户,2.1 版本反对了 DataStream API,可通过 MySqlSourceBuilder 创立数据源。用户能够同时捕捉多表数据,借此搭建整库同步链路。同时通过 MySqlSourceBuilder#includeSchemaChanges 还能捕捉 schema 变更。
- 反对 currentFetchEventTimeLag,currentEmitEventTimeLag,sourceIdleTime 监控指标
这些指标遵循 FLIP-33 [1] 的连接器指标标准,能够查看 FLIP-33 获取每个指标的含意。其中,currentEmitEventTimeLag 指标记录的是 Source 发送一条记录到上游节点的工夫点和该记录在 DB 里产生工夫点差值,用于掂量数据从 DB 产生到来到 Source 节点的提早。用户能够通过该指标判断 source 是否进入了 binlog 读取阶段:
- 即当该指标为 0 时,代表还在全量历史读取阶段;
- 当大于 0 时,则代表进入了 binlog 读取阶段。
三、详解新增 Oracle CDC 连接器
Oracle 也是应用很宽泛的数据库,Oracle CDC 连接器反对捕捉并记录 Oracle 数据库服务器中产生的行级变更,其原理是应用 Oracle 提供的 LogMiner [2] 工具或者原生的 XStream API [3] 从 Oracle 中获取变更数据。
LogMiner 是 Oracle 数据库提供的一个剖析工具,该工具能够解析 Oracle Redo 日志文件,从而将数据库的数据变更日志解析成变更事件输入。通过 LogMiner 形式时,Oracle 服务器对解析日志文件的过程做了严格的资源限度,所以对规模特地大的表,数据解析会比较慢,长处是 LogMiner 是能够收费应用的。
XStream API 是 Oracle 数据库为 Oracle GoldenGate (OGG) 提供的外部接口, 客户端能够通过 XStream API 高效地获取变更事件,其变更数据不是从 Redo 日志文件中获取,而是从 Oralce 服务器中的一块内存中间接读取,省去了数据落盘到日志文件和解析日志文件的开销,效率更高,然而必须购买 Oracle GoldenGate (OGG) 的 License。
Oracle CDC 连接器反对 LogMiner 和 XStream API 两种形式捕捉变更事件。实践上能反对各种 Oracle 版本,目前 Flink CDC 我的项目里测试了 Oracle 11,12 和 19 三个版本。应用 Oracle CDC 连接器,用户只须要申明如下 Flink SQL 就能实时捕捉 Oracle 数据库中的变更数据:
利用 Flink 丰盛的周边生态,用户能够十分不便地写入各种上游存储,如音讯队列,数据仓库,数据湖等。
Oracle CDC 连接器曾经将底层的 CDC 细节屏蔽,整个实时同步链路,用户只须要几行 Flink SQL,不必开发任何 Java 代码,就能够将 Oracle 的数据变更实时捕捉并发送。
此外,Oracle CDC 连接器也提供两种工作模式,即读取全量数据 + 增量变更数据,和只读取增量变更数据。Flink CDC 框架均保障一条不多一条不少的 exactly-once 语义。
四、详解新增 MongoDB CDC 连接器
MongoDB CDC 连接器并不依赖 Debezium,是在 Flink CDC 我的项目里独立开发。MongoDB CDC 连接器反对捕捉并记录 MongoDB 数据库中实时变更数据,其原理是假装一个 MongoDB 集群里正本 [4],利用 MongoDB 集群的高可用机制,该正本能够从 master 节点获取残缺 oplog(operation log) 事件流。Change Streams API 则提供实时订阅这些 oplog 事件流的能力,能够将这些实时的 oplog 事件流推送给订阅的应用程序。
从 ChangeStreams API 获取的更新事件中,对于 update 事件,没有 update 事件的前镜像值,即 MongoDB CDC 数据源只能作为一个 upsert source。不过 Flink 框架会主动为 MongoDB CDC 附加一个 Changelog Normalize 节点,补齐 update 事件的前镜像值(即 UPDATE_BEFORE 事件),从而确保 CDC 数据的语义正确性。
应用 MongoDB CDC 连接器,用户只须要申明如下 Flink SQL 就能实时捕捉 MongoDB 数据库中的全量和增量变更数据,借助 Flink 弱小的集成能力,用户能够十分不便地将 MongoDB 中的数据实时同步到 Flink 反对的所有上游存储。
整个数据捕捉过程,用户不须要学习 MongoDB 的正本机制和原理,极大地简化了流程,升高了应用门槛。MongoDB CDC 也反对两种启动模式:
- 默认的 initial 模式是先同步表中的存量的数据,而后同步表中的增量数据;
- latest-offset 模式则是从以后工夫点开始只同步表中增量数据。
此外,MongoDB CDC 还提供了丰盛的配置和优化参数,对于生产环境来说,这些配置和参数可能极大地晋升实时链路的性能和稳定性。
五、总结和瞻望
在短短的一年多工夫里,Flink CDC 我的项目获得了景象级的倒退和关注,这离不开 Flink CDC 开源社区的贡献者们的自私奉献,也离不开宽广 Flink CDC 用户的踊跃反馈,正是这两者的良性互动才使得 Flink CDC 我的项目衰弱倒退,这种良性互动也是开源社区的魅力所在。
Flink CDC 社区将会持续做好开源社区建设,在将来布局中,次要有三个方向:
做深 CDC 技术
如形象复用 mysql-cdc 实现,让 Oracle, MongoDB 等也能疾速反对无锁读取、并发读取等个性。
做广数据库生态
咱们会反对更丰盛的数据库 CDC 数据源,如 TiDB, DB2, MS SqlServer 等。
做好数据集成场景
- 更好地集成实时数仓、数据湖的上游生态,包含 Hudi、Iceberg、ClickHouse、Doris 等。
- 进一步升高 CDC 数据入湖入仓的门槛,解决整库同步、表构造变更同步等痛点。
致谢
特别感谢来自 Cloudera 公司的 Marton Balassi, Tamas Kiss 奉献的 Oracle CDC 连接器,来自 XTransfer 公司的 Jiabao Sun 奉献的 MongoDB CDC 连接器。
贡献者列表:
Gunnar Morling, Jark Wu, Jiabao Sun, Leonard Xu, MartijnVisser, Marton Balassi, Shengkai, Tamas Kiss, Tamas Zseder, Zongwen Li, dongdongking008, frey66, gongzhongqiang, ili zh, jpatel, lsy, luoyuxia, manmao, mincwang, taox, tuple, wangminchao, yangbin09
[1] https://cwiki.apache.org/conf…
[2] https://oracle-base.com/artic…
[3] https://docs.oracle.com/cd/E1…
[4] https://docs.mongodb.com/manu…
Flink Forward Asia 2021 重磅开启,寰球 40+ 多行业一线厂商,80+ 干货议题,带来专属于开发者的技术盛宴。
https://flink-forward.org.cn/
另有首届 Flink Forward Asia Hackathon 正式启动,10W 奖金等你来!
https://www.aliyun.com/page-s…
更多 Flink 相干技术问题,可扫码退出社区钉钉交换群
第一工夫获取最新技术文章和社区动静,请关注公众号~