Debezium 初始数据快照和相关实体顺序

Posted

技术标签:

【中文标题】Debezium 初始数据快照和相关实体顺序【英文标题】:Debezium initial data snapshot and related entities order 【发布时间】:2020-12-06 23:11:31 【问题描述】:

第一次启动后,Debezium 将对已有数据进行初始数据快照。

假设我有两张桌子 - AB。表 B 对 ANOT NULL FK 约束。根据 Debezium 默认方法 - Debezium 将为来自表 AB 的数据创建两个单独的 Kafka 主题。

据我了解,我很有可能会尝试在新表B 中创建记录,而适当的记录A 将不会出现在适当的新表A 中。这样我就会遇到违反约束的错误。

我是否需要使用一些内部 3rd 方缓冲区并自己组织插入接收器数据库的正确顺序,或者 Debezium 中有一些标准机制来处理这种情况?

例如 - 我可以使用 Debezium 主题路由 https://debezium.io/documentation/reference/configuration/topic-routing.html 来解决此类问题吗?我可以潜在地将主题路由配置为将所有相关事件(来自我上面示例中的表 A 和 B)发送到同一主题。对于具有单个分区的 Kafka 主题,必须以正确的方式对所有事件进行排序。它会起作用吗?这样我会为初始快照数据加载获得正确的相关实体顺序吗?

【问题讨论】:

【参考方案1】:

IBM IDR(数据复制)产品通过一种解决方案解决了这个问题,该解决方案允许只使用一次语义并重新创建事务中的操作顺序和事务顺序。

Kafka 内置的恰好一次功能具有一些超出性能的限制,您不会固有地通过操作对事务进行重新排序,这对于应用引用完整性约束之类的事情很重要。

因此,在我们的产品中,我们有一个适当的穷人解决问题的方法。穷人的是将所有表的所有数据发送到一个主题。显然这是次优的,但如果您这样做,我们的产品将从单个生产者按操作顺序生成数据。您可能希望使用幂等性来避免批次出现乱序。

现在解决此问题的专业级方法是称为 TCC(事务一致性消费者)的功能。

我不确定您是否需要企业级解决方案的性能和功能。

如果这是一个非关键项目,您可能会发现以下讨论对我们如何交付您正在寻找的功能很有用。

https://www.confluent.io/kafka-summit-sf18/a-solution-for-leveraging-kafka-to-provide-end-to-end-acid-transactions/

这是我们关于该功能的文档以供参考。

https://www.ibm.com/support/knowledgecenter/en/SSTRGZ_11.4.0/com.ibm.cdcdoc.cdckafka.doc/concepts/kafkatcc.html

这应该提供背景,说明为什么这个问题难以解决,以及解决方案的内容。

【讨论】:

感谢您的回答。现在我也在研究 AWS DMS。看起来他们也使用单主题方法以防使用 Apache Kafka 作为 AWS Database Migration Service 的目标docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kafka.html 我不确定 AWS DMS 中的 TCC,所以只会验证它。 当我们的客户写入 AWS 中的 Kafka 时,他们能够利用 TCC,因为它对 Kafka 基础设施本身是透明的。它只要求消费者应用程序使用我们的 API。 很遗憾,我无法将 IBM IDR 产品整合到当前的解决方案中。必须使用 AWS 堆栈或 Debezium

以上是关于Debezium 初始数据快照和相关实体顺序的主要内容,如果未能解决你的问题,请参考以下文章

Debezium SQL Server 连接器 Kafka 初始快照

Debezium Embedded Engine with AWS Kinesis - PostgreSQL 快照加载和事务元数据流

Debezium的增量快照

Debezium的增量快照

Debezium系列之:基于数据库信号表和Kafka信号Topic两种技术方案实现增量快照incremental技术的详细步骤

MySQL 的 Debezium 刷新超时和 OutOfMemoryError 错误