首页 > 解决方案 > Zookeeper 领导崩溃后状态不一致?

问题描述

我试图了解动物园管理员的内部。

假设一个 3-server 的 zookeeper 集群,leader server 向两个 follower 发送了一个提案(比如 setdata: foo=1)然后崩溃了,但是至少有一个 follower 将这个提案记录到它的事务日志文件中。据《Zab 论文》称,另外两台服务器仍然可以组成有效的 quorum 并选举出新的领导者。并且新的领导者仍然可以提出并提交这个提议(setdata: foo=1)。

我的问题是在这种情况下,客户端认为这个请求没有完成(因为leader crash并且没有响应或者客户端超时),但实际上它在zookeeper集群中仍然是成功的。这是不一致的吗?

标签: apache-zookeeperdistributed-systemconsensusraft

解决方案


事实上,这是一个不一致的,但它不是一个问题。
在 zookeeper程序员指南中,有一行:

如果客户端获得成功的返回码,则更新将被应用。在某些故障(通信错误、超时等)上,客户端将不知道更新是否已应用。我们采取措施尽量减少失败,但唯一的保证是只有成功的返回代码。(这在 Paxos 中称为单调性条件。)

这意味着当您获得成功的返回码时您知道您的更新成功,但是当您没有收到返回码时您无法知道它是成功还是失败。

但这不是问题,当你的更新因为leader crash而失败时,你可以重试更新操作。这次您的更新将失败,因为您指定的版本落后于实际版本号,您将收到通知。然后您可以调用 get 方法来检索数据以查看数据是否等于您指定的值。


推荐阅读