为什么一些分布式系统(如 Solr 或 Kafka)需要 ZooKeeper,而一些分布式系统(如 Cassandra)不需要?
ZooKeeper 为关键系统状态提供强一致性存储。许多系统,例如Storm和Kafka依靠ZooKeeper进行服务发现和领导者选举。由于ZooKeeper的ZAB协议落在CAP定理的CP端,因此它可以保证两个客户端不会看到同一系统的不同视图。因此,例如,Kafka 不会错误地认为节点 A 和节点 C 都是同一分区的领导者。
这些系统仅使用 ZooKeeper,因为它是一种经过充分测试和验证的技术,用于存储此类关键元数据。 ZooKeeper 充当协调的中心点。然而,Cassandra 拥有更加去中心化的架构,并实现了自己的共识算法(Paxos),而不是像 ZooKeeper 这样依赖外部 CP 存储。根据 Cassandra 如何使用其八卦和共识协议,它可能只是做出一些让步,而 Kafka 和 Solr 等系统则不会。这使得 Cassandra 不再依赖于 ZooKeeper 等外部系统,而 ZooKeeper 通常比 HA 系统能够容忍更少的故障。
需要Zookeeper的系统依靠它来进行集群协调。 Cassandra 架构有所不同,因为它是一个点对点系统。因此,协调是“分布”在每个节点之间的。
请参阅下面的 2024 年更新
在Kafka中,主题的消费者将自己注册到ZooKeeper中,以便相互协调并平衡数据的消耗。 消费者还可以通过设置offsets.storage=zookeeper将他们的偏移量存储在ZooKeeper中。
Solr 嵌入并使用 Zookeeper 作为集群配置和协调的存储库 - 将其视为包含所有 Solr 服务器信息的分布式文件系统。
除此之外,zookeeper 还用于许多其他系统,例如 Hadoop Highavailabilty、HBase。
Kafka 早在 2022 年 8 月就开始致力于删除 ZooKeeper 并用 KRaft 替代,到 24 年 4 月左右 KRaft 将成为唯一的选择