卡夫卡集群可以切成两半吗?

时间:2019-02-10 20:02:36

标签: apache-kafka apache-zookeeper

场景:您在不同的DC中有一个Kafka-Cluster,但它们被配置为一个集群。因此,无法通过MirrorMaker或类似帽子进行镜像。 DC离彼此并不遥远。但是它们在物理上是分开的。

现在,如果两个DC之间的连接断开,您要怎么做才能确保群集在两个SIDES上均具有故障保护功能?因此,生产者和消费者双方都应该继续工作。

我会猜测:您需要在两侧都有多个Zookeeper,并需要多个Kafka节点。

但是足够了吗?重新连接后群集会自行恢复吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

我假设您的“距离其他地方不太远”的数据中心基本上是可用区(AZ)。

在多个可用区上分布群集是很常见的。但是,通常不希望或不可能每个“切片”都可以独立生存。

最直接的问题是Zookeeper,其设计可防止出现裂脑情况。因此,如果拆分ZK群集,则只有一个“切片”(至多)将继续工作。因此,处于无法正常工作的ZK群集一侧的代理将无法正常工作。

那我们可以说双方都可以继续工作。当您再次加入双方时会发生什么?

由于客户端分别将数据写入双方,因此数据可能会有所不同。现在,您可以拥有具有相同偏移量的不同消息的相同分区,并且由于两个选项均为“有效”,因此无法解决冲突。

我希望这表明了为什么这不是可行的解决方案。实际上,如果AZ脱机,则直到它重新联机后,它才起作用。

已连接到脱机AZ的客户端应重新连接到另一个AZ(使用多个引导服务器),而处于故障AZ的客户端应重新设置为另一个。

如果配置正确,Kafka可以幸免于AZ中断(即使实际上,最好有3个AZ)并保持所有资源可用。同样在这种情况下,当失败的可用区返回时,群集将自动返回到良好状态。