多个表之间 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 连接器是不是保证跨更改跟踪表的排序?
成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC