卡夫卡集群可以减半吗?

Can a Kafka-Cluster be cut in half?

场景:您在不同的 DC 中有一个 Kafka 集群,但它们被配置为一个集群。所以没有通过 MirrorMaker 或类似帽子的东西进行镜像。 DC 离彼此不远。但他们在物理上是分开的。

现在,如果这两个 DC 之间的连接断开,您需要做什么来确保集群在两端都是故障安全的?所以在双方生产者和消费者应该仍然工作。

我猜:你需要在双方都有多个 Zookeeper 和多个 Kafka 节点。

但这就够了吗?重新连接后集群是否自行修复?

提前致谢。

我假设您的数据中心 "are not very far from eatch other" 基本上是可用区 (AZ)。

将一个集群分布在多个 AZ 上是很常见的。然而,每个 "slice" 都可以独立生活通常是不希望的或不可能的。

眼前的问题是 Zookeeper,它通过设计防止裂脑情况。因此,如果一个 ZK 集群被拆分,那么只有一个 "slice"(最多)会继续工作。因此,位于非工作 ZK 集群一侧的代理将无法正常工作。

那么假设双方继续工作是可能的。当你再次加入双方时会发生什么?

由于客户端分别向每一方写入数据,因此数据可能存在差异。现在你可能有相同的分区,但相同的偏移量有不同的消息,并且无法解决冲突,因为两个选项都是 "valid".

我希望这能说明为什么这不是一个可能的解决方案。实际上,如果 AZ 脱机,则在重新联机之前无法使用。

连接到离线 AZ 的客户端应重新连接到另一个 AZ(使用多个 bootstrap 服务器),并且故障 AZ 中的客户端应重新配置到另一个 AZ。

如果配置正确,Kafka 可以在 AZ 中断时幸存下来(即使在实践中,最好有 3 个 AZ)并保持所有资源可用。同样在这个场景中,集群会自动return到一个好的状态,当失败的AZ returns.