本文讨论的方案将是本博客以往介绍的所有关于 CDC 数据同步方案中最贴合实际生产需要的,因为以往介绍的开箱即用方案往往都是一张表对应一个 Kafka Topic,在数据库和数据表数量很大的情况下,这种模式是不实用的,主要问题在于:每张表都对应一个单独的 Flink 作业,占用一个单独的数据库连接,表的数量一多,对数据库造成的压力是不可接受的。此外,针对每张表使用 Flink SQL 定义 CDC 作业也是一项繁重的重复性工作,如果能简化或省略也是很实用的一项改进。所以,实用的解决解决方案应该是:使用一个 Flink 作业完成整库 / 多表的 CDC 数据接入工作。
另一方面,多张数据表接入到 Kafka 上,是公用一个 Topic 还是一张表对应一个 Topic 也是需要考量的,两种方式各有优劣:
- 使用一个 Topic 接受所有表的 CDC 数据:好处是避免创建大量的 Topic,便于维护;但是会给下游的 consume 消息增加额外负担
- 一个 Topic 对应一张表:对下游非常友好,无需进行额外的消息过滤,但是 Topic 的数量会比较多
本文,我们分别实现上述两种方式,并更细致地讨论它们的优缺点。
此外,要实现上述设计目标,还有一个非常重要的前提条件:Kafka 中的消息必须要包含两个关键字段,就是这条 CDC 数据所属的数据库名和数据表名。这两项信息既是使用 debezium-json 格式在 Kafka 上构建下游表时必须的两个关键字段,同是也是对数据进行分流(写入表所对应 Topic)时需要要知道的两个字段。