【问题标题】:Do FKs(foreign keys) present a problem if we set up RDBMS replication through Apache Kafka?如果我们通过 Apache Kafka 设置 RDBMS 复制,FK(外键)会出现问题吗?
【发布时间】:2018-12-13 05:09:12
【问题描述】:

我想知道 Apache Kafka 是否可以用于具有关系数据库的容错环境,一个源和多个,通过 kafka 实例复制。

我是 Kafka 新手,互联网上的很多消息来源都说这可以通过 Kafka Connect 轻松完成,但是我从未找到任何解释这个问题的几个方面:

我们如何保证在复制过程中不会违反外键? 我已经看到连接器将数据更改发送到数据库中每个表的单独 kafka 主题,但是我们如何以创建它们的相同顺序读取它们,以便在复制期间不违反 FK?即使我们将所有更改放在一个主题中,这个主题也可能会被分区,那么我们将如何以相同的顺序读取它们?这是否意味着我们只能使用单个分区的单个主题?或者也许我们应该删除目标数据库中的所有 FK 约束并且从不关心它们的完整性?

我确实认为将关系数据库用于只读目的是不合适的,但是有很多旧客户端,我们无法一次全部重写。

【问题讨论】:

  • 我猜你可以将 Kafka 用作数据库复制器,但它并不是真的要以这种方式使用。而是让应用程序(独立于 Connect)直接使用来自 Kafka 的 CDC 事件

标签: apache-kafka rdbms kafka-consumer-api kafka-producer-api


【解决方案1】:

我目前在一个项目中,该项目在 RDBMS 数据库上使用 CDC(变更数据捕获)。

在我的例子中,CDC 为数据库中的一个表写入单个主题,并且分区数实际上是 1(以确保所有消息都按顺序出现)。

不幸的是,Kafka 不保证 FK 约束的完整性。我的意思是,如果数据库中的完整性有效,那么它将在 Kafka 上,但没有检查 FK 约束的验证系统(您可以加入不是 Kafka Streams 的 FK 的字段)。

使用 Kafka Stream,您当然可以进行“加入”操作,但您必须知道源数据库上的 FK 约束才能执行一些有效的业务代码。

编辑: 当然,您可以使用 CDC 写入的每个主题并将其生成到具有更多分区的其他主题中,然后您将根据需要重新分配数据(甚至使用新模式)。

【讨论】:

  • 关系查询不受约束(包括 FK)的限制。任何表都可以在任何条件下连接。约束用于禁止无效状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多