我们此前介绍的一些 CDC 开箱即用方案往往都是一张表对应一条独立的链路(作业),需要一个独立的数据库连接,在表数量很大的情况下,会对数据库造成很大压力,同时过多的 Flink 作业会不易于管理和维护,为众多小表创建独立的采集作业也浪费了资源。此外,使用 Flink SQL 针对每张表定义 CDC 作业也是一项繁重的工作,如果能简化或省略编写大量 SQL 的工作也是一项重要的改进。所以,一种更为实用的解决方案是:使用一个 Flink 作业完成整库 / 多表的 CDC 数据接入工作。本文我们会详细介绍一下这一方案的具体实现。
另一方面,多张数据表接入到 Kafka 上,是公用一个 Topic 还是一张表对应一个 Topic 也是需要考量的,两种方式各有优劣:
- 一个 Topic 接收所有表的数据:好处是避免创建大量的 Topic,便于维护;但是会给下游的 consume 消息增加复杂度,需要实现分流逻辑
- 一个 Topic 接收一张表的数据:对下游非常友好,无需进行额外的消息过滤和分流,但是 Topic 的数量会比较多
本文,我们会分别实现上述两种方案,并更细致地讨论它们的优缺点。 此外,要实现上述设计目标,还有一个非常重要的前提条件:Kafka 中的消息必须要包含两个关键字段,就是这条 CDC 数据所属的数据库名和数据表名。这两项信息既是使用
debezium-json
格式在 Kafka 上构建下游表时必须的两个关键字段,同是也是对数据进行分流(写入表所对应 Topic)时需要要知道的两个字段。
本文提供完整可云行的项目源码,演示
版权归原作者 Laurence 所有, 如有侵权,请联系我们删除。