上图展示了 Flink CDC 的实现原理。
Flink CDC Connector 只做对源端数据的读取,即只负责将数据从数据源读到 Flink 引擎。
当前的 Flink CDC Connector 主要分为以下三类:
- MySqlSource :实现了最新的 source 接口以及并发读取。
- DebeziumSourceFunction :基于 Debezium 实现了 SourceFunction,支持旧版 MySQL、Oracle、MongoDB、SqlServer、PostgreSQL。
- OceanBaseSourceFunction :实现了 SourceFunction 接口,分别基于 JDBC 和 logproxy-cilent 实现了全量和增量读取。
上图展示了 Flink CDC OceanBase Connector 的数据路径。
增量数据首先通过 logproxy 进行拉取, logproxy-client 会监听到增量日志的数据流,数据流进入到 Flink CDC 之后通过 Flink CDC 的处理逻辑写入到 Flink 。全量数据通过 JDBC 进行拉取。
当前 Flink CDC OceanBase Connector 支持的能力,主要受限于 logproxy,目前能够支持从指定时间拉取数据。但由于 OceanBase 是分布式数据库,无法精确地找到日志增量数据的起点,而通过时间戳来指定可能会存在一些重复数据。
在全量阶段,又因为 OceanBase 社区版没有表锁,因此全量数据的读取也无法通过加锁来确定数据边界。
基于以上两方面的考虑,目前暂时只支持 at-least-once 工作模式,还未实现 exactly-onece。
三、Flink CDC OceanBase
应用场景
Flink CDC 是全增量一体化, OceanBase Connector 对数据表的读取支持正则匹配。针对分库分表的一些场景,可以通过 OceanBase Connector 创建动态表来读取数据源的数据,然后写入到一张表中,实现表数据的汇聚。
OceanBase 是多租户系统,目前对于社区版的 MySQL 租户还未实现跨租户的访问能力。因此,如果需要读取跨租户的数据,还需通过多个数据库的连接来实现分别读取。而 Flink CDC 天然适合这项工作,相当于每个租户都对应一个动态表来做数据源读取的通道,然后在 Flink 中汇聚。