从 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 重构数据库的主要内容,如果未能解决你的问题,请参考以下文章
Flink 1.14.0 消费 kafka 数据自定义反序列化类
Flink 实战系列Flink 同步 Kafka 数据到 HDFS parquet 格式存储 snappy 压缩
Flink 实战系列Flink 同步 Kafka 数据到 HDFS parquet 格式存储 snappy 压缩