动物园管理员负责人崩溃后状态不一致?



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

假设一个 3 台服务器的 zookeeper 集群,领导者服务器向两个关注者发送一个提案(比如 setdata:foo=1(,然后崩溃,但至少有一个关注者将此提案记录到其事务日志文件中。根据"Zab论文"的说法,另外两个服务器仍然可以形成有效的法定人数并选举新的领导者。并且新的领导者仍然可以提出并提交这个提议(setdata:foo=1(。

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

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

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

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

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

最新更新