多个表之间 CDC 事件的 Debezium 排序

Posted

技术标签:

【中文标题】多个表之间 CDC 事件的 Debezium 排序【英文标题】:Debezium Ordering of CDC Events between multiple tables 【发布时间】:2021-10-15 15:47:12 【问题描述】:

嗨,我是 debezium 的新手

我计划使用 debezium 进行实时数据库(mysql 和 mongo)集成 从每个数据库我需要将数据同步到目标数据库(mysql和mongo) 从 mysql 和 mongo 我只需要分别来自每个数据库的 X 个表和 y 个集合

在那些 x 个表和 y 个集合中,我只需要基于每个表和集合的条件的特定数据集

这里的条件不是直截了当的,我的意思是,例如,如果我们使用 mysql 数据库,我需要通过将一个表(我想要捕获 cdc 的表)与一个特定的表连接起来并仅捕获匹配的记录来获取记录

以上是我的要求,我对要求有一些疑问

    根据基于每个表创建主题的 debezium 文档, 对于每个主题,如果我们将 cdc 数据推送到该主题的特定分区,则顺序是有保证的,因此在使用多个表时,它将 cdc 数据推送到每个表的主题分区,在这种情况下,我如何实现多个之间的事件顺序表 我的意思是我需要在 mysql binlog 上执行的事件的确切顺序 处理多个表时是否保证顺序,因为我需要按照与源数据库的 binlog 相同的顺序在目标数据库上进行同步??

    如果我想要基于 mysql 或 mongo 连接条件与表或集合的数据,我如何从 debezium 实现这一目标

这是我的两个主要问题 请帮我解决这个问题

谢谢

迈克

【问题讨论】:

【参考方案1】:

自从我发布这个问题 15 天以来,到目前为止我没有收到任何答案,所以我自己进行了测试并找到了订购的答案我对 debezium mysql 连接器进行了测试

我已经测试了有 7 次操作的交易

1.tableA 插入

2.tableA 更新

3.tableB 插入

4.tableA 更新

5.tableB 插入

6.tableA 更新

7.tableC 插入

我使用默认连接器配置并观察了 5 次更改我可以看到订单不是我执行的顺序 所以我进行了配置更改以将默认主题分区设置为 1 然后我可以观察到数据中的每个主题都是有序的,但是整个顺序并不存在,然后当我设法通过拥有一个主题和一个分区来实现它时,则保证了交易顺序

这是单个分区

"topic.creation.default.replication.factor": 1,
"topic.creation.default.partitions": 1,

这是针对单个主题的

         "transforms":"dropPrefix",
         "transforms.dropPrefix.type":"org.apache.kafka.connect.transforms.RegexRouter",  
         "transforms.dropPrefix.regex": "(.*)([^0-9])(.*)",
         "transforms.dropPrefix.replacement": "yourtopic",

请注意,我已经使用 kafka 版本 2.7.0 进行了测试,我遇到了 2.6.0 的问题

我在 golang 中创建了一个库,可用于提取所需数据

https://github.com/ahamedmulaffer/cdc-formatter

希望对某人有所帮助

谢谢

迈克

【讨论】:

以上是关于多个表之间 CDC 事件的 Debezium 排序的主要内容,如果未能解决你的问题,请参考以下文章

多表 Debezium 连接器是不是保证跨更改跟踪表的排序?

Debezium-Flink-Hudi:实时流式CDC

Debezium-Flink-Hudi:实时流式CDC

成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC

使用选定列更改表 - debezium 抛出 ArrayIndexOutOfBoundsException

Kafka Connect JDBC 与 Debezium CDC