Apache ZooKeeper:写入如何工作

时间:2011-03-24 13:39:52

标签: synchronization replication apache-zookeeper

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

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

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

问题:为什么领导者等待一半的节点回复呢?如果有人连接到没有收到更新的其中一个节点,他会得到一个过时的结果(只有本地读取到本地值)。

1 个答案:

答案 0 :(得分:22)

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

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

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

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

因此,作为结论,Zookeeper提供了可定制的一致性保证,用户可以决定可用性和一致性之间的平衡。

如果您想了解更多关于Zookeeper内部的信息,我推荐这篇论文:ZooKeeper: Wait-free coordination for Internet-scale systems。上述策略在第4.4节中描述。