22

Apache ZooKeeper 是一种用于小对象的高可用数据存储。ZooKeeper 集群由一些节点组成,这些节点都将整个数据集保存在它们的内存中。该数据集被称为“始终一致”,因此每个节点每次都有相同的数据。

根据文档和博客文章,集群中的每个节点都可以回答读取并接受写入。

  • 读取总是由节点在本地回答,因此不涉及与集群的通信。
  • 写入被转发到指定的“Leader”节点,该节点将写入请求转发给所有节点并等待它们的回复。如果至少有一半的节点回答,则认为写入成功。

问题:为什么leader等待一半的节点回复就够了?如果有人连接到没有收到更新的节点之一,他会得到一个过时的结果(仅本地读取到本地值)。

4

1 回答 1

27

为了实现高读取可用性,Zookeeper 保证副本的弱一致性:读取始终可以由客户端节点回答,并且返回的回答可能是陈旧的值(即使是通过领导者提交的新版本) )。

然后,用户有责任决定读取的答案是否“过时”,因为并非所有应用程序都需要最新信息。因此提供了以下选择:

1) 如果您的应用程序不需要最新的读取值,您可以通过直接从客户端请求数据来获得高读取可用性。

2) 如果您的应用程序需要最新的读取值,您应该在读取请求之前使用“同步”API 将客户端版本与领导者同步。

所以总而言之,Zookeeper 提供了可定制的一致性保证,用户可以决定可用性和一致性之间的平衡。

如果你想了解更多关于 Zookeeper 的内部结构,我推荐这篇论文:ZooKeeper:互联网规模系统的无等待协调。上述策略在第 4.4 节中描述。

于 2011-03-24T19:52:06.010 回答