ZooKeeper如何保证"Single System Image"?

How ZooKeeper guarantees "Single System Image"?

ZooKeeper 程序员指南的 Consistency Guarantees 部分指出 ZooKeeper 将提供 "Single System Image" 保证:

A client will see the same view of the service regardless of the server that it connects to.

根据ZAB协议,只有超过半数的follower认可一个提案,leader才能提交交易。所以很可能并不是所有的关注者都处于相同的状态。

如果followers不在同一个状态,ZooKeeper怎么保证"Single System Status"?


参考文献:

在被认为成功之前,所有读取和写入都会转到大多数节点,因此写入之后的读取不可能不知道先前的写入。至少有一个节点知道它。 (否则 n/2+1 + n/2+1 > n,这是错误的。)是否有许多人(最多只有一个)对世界的看法已经过时并不重要,因为至少有一个他们中的所有人都知道。

如果有足够多的节点崩溃或网络被分区,以至于没有一组能够相互通信的节点占多数,Zab 将停止处理请求。如果你确认的更新被一组节点接受,这些节点消失并且永远不会重新联机,你的集群将丢失一些数据(但只有当你要求它继续前进,并将其死节点留在后面时)。

处理两个以上的请求是通过一次处理两个请求来完成的,直到只剩下一个状态。

领导者只等待来自法定人数的追随者的回应以确认提交交易。这并不意味着一些追随者不需要确认交易或可以 "say no".

最终,当其余的追随者处理来自领导者的提交消息或作为同步的一部分时,将具有与主人相同的状态(有一些延迟)。 (不要与最终一致性混淆)

follower状态能延迟多长时间取决于配置项syncLimit & tickTime(https://zookeeper.apache.org/doc/current/zookeeperAdmin.html)

跟随者在被丢弃之前最多可以落后 syncLimit * tickTime 时间单位。

文档有点误导,我已经pr了

参见 https://github.com/apache/zookeeper/pull/931

事实上,zookeeper 客户端保留了一个 zxid,因此如果它从较新的服务器读取了一些数据,它将不会连接到较旧的 follower。