【问题标题】:How ZooKeeper guarantees "Single System Image"?ZooKeeper 如何保证“单一系统镜像”?
【发布时间】:2016-11-25 03:53:05
【问题描述】:

在 ZooKeeper 程序员指南的 Consistency Guarantees 部分,它声明 ZooKeeper 将提供“单一系统映像”保证:

无论客户端连接到哪个服务器,客户端都会看到相同的服务视图。

根据 ZAB 协议,只有超过一半的追随者确认提案,领导者才能提交交易。所以很可能不是所有的关注者都处于相同的状态。

如果follower状态不同,ZooKeeper怎么保证“单系统状态”?


参考资料:

【问题讨论】:

    标签: apache-zookeeper distributed-system consistency 2phase-commit


    【解决方案1】:

    领导者只等待来自法定人数的追随者的响应以确认提交交易。这并不意味着一些追随者不需要确认交易或可以“说不”。

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

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

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

    【讨论】:

      【解决方案2】:

      文档有点误导,我做了pr。

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

      实际上,zookeeper 客户端保存了一个 zxid,所以如果它从较新的服务器读取了一些数据,它就不会连接到较旧的 follower。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2022-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-19
          • 2020-08-26
          • 1970-01-01
          相关资源
          最近更新 更多