ZooKeeper如何提供顺序一致性

时间:2018-06-25 08:14:44

标签: apache-zookeeper distributed-computing consistency

here中 有人说:

  

”即使您每次都从其他关注者那里朗读,也永远不会   在看到版本4之后,再查看数据的版本3。“

因此,如果我有3个节点的Zookeeper仲裁,如下所示:

zk0 -- leader
zk1
zk2

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

  • 时代
  • 柜台

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

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

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

enter image description here