在here中 有人说:
”即使您每次都从其他关注者那里朗读,也永远不会 在看到版本4之后,再查看数据的版本3。“
因此,如果我有3个节点的Zookeeper仲裁,如下所示:
zk0 -- leader
zk1
zk2
假设仲裁“ 3”中有一个值,并且我有一个客户端连接到zk1
,然后我的客户端发送一个写请求(将“ 3”更新为“ 4”)和zk0
(领导者)写入值,然后从zk1
收到确认。我的客户可以看到新的(“ 4”),因为它已连接到zk1
。
现在我的问题是,如果我将客户从zk1
切换到zk2
(领导者尚未收到zk2
的写确认,因此zk2
落后于法定人数)我将看到值是“ 3”而不是“ 4”。会破坏顺序一致性吗?
答案 0 :(得分:2)
ZooKeeper使用称为 ZooKeeper Atomic Broadcast (ZAB) 的特殊原子消息协议,该协议可确保集合(Zookeeper服务器组)中的本地副本永远不会发散。
ZAB协议是原子的,因此该协议保证更新成功或失败。
在Zookeeper中,每次写操作都要经过领导者,领导者会生成一个事务ID(称为 zxid ),并将其分配给该写请求。
zxid是一个长整数(64位),分为两个部分:
zxid表示在所有副本上应用写操作的顺序。 时代代表随着时间的推移领导层的变化。时期是指给定服务器行使领导权的时期。在某个时期,领导者广播提案并根据计数器识别每个提案。
如果领导者收到了大多数人的确认,则认为写成功。
zxid用于保持服务器同步并避免您所描述的冲突。