在 ZooKeeper Programmer's Guide 的Consistency Guarantees部分中,它指出 ZooKeeper 将提供“单一系统映像”保证:
无论客户端连接到哪个服务器,客户端都将看到相同的服务视图。
根据 ZAB 协议,只有超过一半的追随者确认提案,领导者才能提交交易。所以很可能不是所有的追随者都处于相同的状态。
如果follower的状态不同,ZooKeeper怎么保证“单系统状态”呢?
参考:
在 ZooKeeper Programmer's Guide 的Consistency Guarantees部分中,它指出 ZooKeeper 将提供“单一系统映像”保证:
无论客户端连接到哪个服务器,客户端都将看到相同的服务视图。
根据 ZAB 协议,只有超过一半的追随者确认提案,领导者才能提交交易。所以很可能不是所有的追随者都处于相同的状态。
如果follower的状态不同,ZooKeeper怎么保证“单系统状态”呢?
参考:
领导者只等待来自法定人数的追随者的响应,以确认提交交易。这并不意味着一些追随者不需要确认交易或可以“说不”。
最终,随着其他追随者处理来自领导者的提交消息或作为同步的一部分,将具有与主服务器相同的状态(有一些延迟)。(不要与最终一致性混淆)
追随者的状态可以延迟多长时间取决于配置项syncLimit和tickTime(https://zookeeper.apache.org/doc/current/zookeeperAdmin.html)
追随者在被丢弃之前最多可以落后于 syncLimit * tickTime 时间单位。
该文件有点误导,我做了一个公关。
见https://github.com/apache/zookeeper/pull/931。
事实上,zookeeper 客户端保留了一个 zxid,因此如果它从较新的服务器读取了一些数据,它不会连接到较旧的追随者。
在被认为成功之前,所有读取和写入都会进入大多数节点,因此写入后的读取不可能不知道先前的写入。至少有一个节点知道它。(否则 n/2+1 + n/2+1 > n,这是错误的。)如果许多人(最多只有一个人)对世界有过时的看法,这并不重要,因为他们中至少有一个人知道这一点全部。
如果有足够多的节点崩溃或网络被分割,以至于没有能够相互通信的节点组占多数,Zab 将停止处理请求。如果您确认的更新被一组消失且永远不会重新联机的节点接受,则您的集群将丢失一些数据(但只有当您要求它继续前进并将其死节点留在后面时)。
处理两个以上的请求是通过一次处理两个请求来完成的,直到只剩下一个状态。