在ZooKeeper程序员指南的Consistency Guarantees部分,它声明ZooKeeper将提供“单一系统映像”保证:
无论服务器连接到哪个服务器,客户端都会看到相同的服务视图。
根据ZAB协议,只有超过一半的粉丝确认提案,领导才能提交交易。所以很可能不是所有的粉丝都处于相同的状态。
如果关注者的状态不同,ZooKeeper如何保证“单一系统状态”?
参考文献:
答案 0 :(得分:2)
领导者仅等待来自法定人数的回复以确认提交交易。这并不意味着一些粉丝不需要承认交易或者可以“拒绝”。
最终,当其他关注者处理来自leader的提交消息或作为同步的一部分时,将具有与master相同的状态(有一些延迟)。 (不要与最终的一致性混淆)
跟随者状态的延迟程度取决于配置项syncLimit& tickTime(https://zookeeper.apache.org/doc/current/zookeeperAdmin.html)
跟随者在删除之前最多可以使用syncLimit * tickTime时间单位。
答案 1 :(得分:1)
在被认为成功之前,所有读取和写入都会转到大多数节点,因此在写入之后无法读取以前的写入。至少有一个节点知道它。 (否则n / 2 + 1 + n / 2 + 1> n,这是假的。)如果很多(最多只有一个)有一个过时的世界观点并不重要,因为至少其中一个人知道这一切。
如果足够的节点崩溃或网络被分区,以便没有能够相互通信的节点组占多数,Zab将停止处理请求。如果您的确认更新被一组消失并且永远不会重新联机的节点接受,则您的群集将丢失一些数据(但仅当您要求它继续前进时,并将其死节点留在后面)。
通过一次处理两个请求来处理两个以上的请求,直到只剩下一个状态。
答案 2 :(得分:1)
该文件有点误导,我已经提出。
请参见https://github.com/apache/zookeeper/pull/931。
事实上,zookeeper客户端会保留一个zxid,因此,如果它已从较新的服务器读取某些数据,它将不会连接到较旧的关注者。