Apache ZooKeeper: 写操作是如何工作的

24

Apache ZooKeeper是一种面向小对象的高可用数据存储系统。ZooKeeper集群由多个节点组成,它们都将整个数据集保存在内存中。该数据集被称为“始终一致”,这意味着每个节点始终具有相同的数据。

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

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

问题:为什么对于Leader节点来说只需要等待一半的节点回复?如果某个节点上连接了未接收更新的客户端,则会得到过时的结果(只包含本地值的本地读取)。

1个回答

27
为了实现高读取可用性,Zookeeper 在副本中保证了弱一致性:读取总是可以由客户端节点回答,并且返回的答案可能是过期的值(即使新版本已经通过领导者提交)。
然后由用户来决定读取响应是否可以过期,因为并非所有应用程序都需要最新信息。所以提供以下选择:
1)如果您的应用程序不需要最新值进行读取,则可以直接从客户端请求数据以获得高读取可用性。
2)如果您的应用程序需要最新值进行读取,则应在读取请求之前使用“同步”API将客户端版本与领导者同步。
因此,Zookeeper 提供了可定制的一致性保证,用户可以决定可用性和一致性之间的平衡。
如果想了解更多关于 Zookeeper 的内部工作原理,请参考这篇论文:ZooKeeper: Wait-free coordination for Internet-scale systems。上述策略在第4.4节中有描述。

1
值得一提的是,Zookeeper 还会将版本 ID 与 znode 数据一起存储。如果客户端决定要覆盖数据,则可以在写入请求中指定它已经看到的版本 ID。如果客户端看到的数据版本比领导者拥有的旧版本更老,领导者将拒绝写入请求。这对于客户端在同步请求和写入请求之间错过写入操作时很有帮助。 - Pradeep Anchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接