在 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 过大问题,但无法彻底解决。
Flink cdc 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 的连接器指标规范,可以查看 FLIP-33 获取每个指标的含义。其中,currentEmitEventTimeLag 指标记录的是 Source 发送一条记录到下游节点的时间点和该记录在 DB 里产生时间点差值,用于衡量数据从 DB 产生到离开 Source 节点的延迟。用户可以通过该指标判断 source 是否进入了 binlog 读取阶段:
即当该指标为 0 时,代表还在全量历史读取阶段;当大于 0 时,则代表进入了 binlog 读取阶段。
2.2 新增 Oracle CDC 连接器
Oracle 也是使用很广泛的数据库, Oracle CDC 连接器支持捕获并记录 Oracle 数据库服务器中发生的行级变更。
其原理是 使用 Oracle 提供的 LogMiner 工具或者原生的 XStream API 从 Oracle 中获取变更数据。
LogMiner 是 Oracle 数据库提供的一个分析工具,该工具可以解析 Oracle Redo 日志文件,从而将数据库的数据变更日志解析成变更事件输出。通过 LogMiner 方式时,Oracle 服务器对解析日志文件的进程做了严格的资源限制,所以