【问题标题】:How ZooKeeper provides sequential consistencyZooKeeper 如何提供顺序一致性
【发布时间】:2018-06-25 21:06:56
【问题描述】:

here 有人说:

“即使你每次都从不同的追随者那里阅读,你永远也不会 看到版本 4 再看版本 3 的数据。”

所以如果我有 3 个节点 Zookeeper 法定人数如下:

zk0 -- leader
zk1
zk2

假设仲裁“3”中有一个值并且我有一个客户端连接到zk1,然后我的客户端发送一个写入请求(将“3”更新为“4”)并且zk0(领导者)写入value 随后收到了来自zk1 的确认。我的客户可以看到新的(“4”),因为它连接到zk1

现在我的问题是,如果我将我的客户从 zk1 切换到 zk2(领导者尚未收到来自 zk2 的写确认,所以 zk2 落后于法定人数)我将看到该值为“ 3”而不是“4”。它会破坏顺序一致性吗?

【问题讨论】:

    标签: apache-zookeeper distributed-computing consistency


    【解决方案1】:

    ZooKeeper 使用称为 ZooKeeper Atomic Broadcast (ZAB) 的特殊原子消息传递协议,可确保集成中的本地副本(Zookeeper 服务器组)永远不会发生分歧。

    ZAB 协议是原子的,因此该协议保证更新成功或失败。

    在 Zookeeper 中,每次写入都要经过领导者,领导者会生成一个事务 id(称为 zxid)并将其分配给这个写入请求。

    zxid 是一个长(64 位)整数,分为两部分:

    • 时代
    • 计数器

    zxid 表示在所有副本上应用写入的顺序。 epoch 代表领导力随时间的变化。时期是指给定服务器行使领导权的时期。在一个 epoch 期间,领导者广播提案并根据计数器识别每个提案。

    如果领导者收到多数人的确认,则认为写入成功。

    zxid 用于保持服务器同步,避免您描述的冲突。

    【讨论】:

    • 我最近发现zookeeper只读取客户端连接的zknode的读取。所以如果原帖中提到的zk2节点是没有发送ACK的follower,那是否意味着结果会是“3”。读取请求从本地 zknode 读取来自 (corejavaguru.com/bigdata/zookeeper/how-zookeeper-works) ZAB 是否阻止通过非 acked 关注者读取旧数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2016-04-09
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多