从 Kafka 重构数据库

Posted

技术标签:

【中文标题】从 Kafka 重构数据库【英文标题】:Reconstitute a database from Kafka 【发布时间】:2020-04-27 23:17:20 【问题描述】:

我正在设计一个依赖于 Kafka 并拥有数据库的系统的概念证明。

使用 Debezium(一个用于从数据库中捕获更改数据的开源分布式平台),当发生更改时,我将向 kafka 集群生成事件。

在 Kafka 上有一些保留日期,我想想象一个我的数据库崩溃的场景,我想从 Kafka 集群中恢复数据..

设计这种恢复系统的最佳方法是什么?

我正在考虑映射数据库索引和 Kafka 索引。当数据库索引出现问题/数据丢失时,我会从正确的 Kafka 索引重新构建它

你们觉得呢?

【问题讨论】:

看看 Confluent JDBC Sink 连接器。您可以将它指向 Debezium 生成的输出,它可以将该数据写回数据库。 听起来你在正确的轨道上,你遇到了什么问题? 【参考方案1】:

我设计了我们的复制产品(来自 IBM 的 IDR)来回答这样的场景,而问题空间实际上比最初看起来要复杂得多。我不能告诉你我们所有的秘密,但也许你可能需要考虑一些领域,如果这对你有价值的话。

您可能需要事务一致性的概念。您必须有一种方法来确保您从 Kafka 应用回源数据库的数据在复制集中的所有表中在事务上是一致的。

也就是说,您要确保如果您应用来自事务 33 中的数据进入主题 1(代表表 1),您还需要确保您应用来自事务 33 中的数据进入主题 1主题 2(代表表 2)。您还需要确保在事务边界处结束,否则您的数据库已损坏,因为部分事务不太可能被接受。最后,如果源数据库上存在引用完整性,则需要相对顺序,这意味着当从写入多个主题的事务中应用数据时,如果源表具有 RI,则需要确定哪个在另一个之前。这些是一些基本的,然后您开始研究边缘情况以及如何处理重复。

我在 2018 年旧金山 kafka 峰会上讨论了我们的解决方案及其背后的理论。如果您有兴趣,请听一听.....

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

【讨论】:

以上是关于从 Kafka 重构数据库的主要内容,如果未能解决你的问题,请参考以下文章

重构为 Kotlin

Flink 1.14.0 消费 kafka 数据自定义反序列化类

Flink 实战系列Flink 同步 Kafka 数据到 HDFS parquet 格式存储 snappy 压缩

Flink 实战系列Flink 同步 Kafka 数据到 HDFS parquet 格式存储 snappy 压缩

Flink实战系列Flink 1.14.0 消费 kafka 数据自定义反序列化器

为啥我的数据库项目升级脚本包括从引用的数据库项目中重构?