在here中,有人说:
“即使你每次都从不同的关注者那里阅读,你也永远不会在看到版本4后看到版本3的数据。”
因此,如果我有3个节点zookeeper quorum如下:
zk0 -- leader
zk1
zk2
字符串
假设quorum中有一个值“3”,我有一个客户端连接到zk1
,然后我的客户端发送一个写请求(更新“3”到“4”),zk0
(leader)写了这个值,然后收到了来自zk1
的确认。我的客户端可以看到新的(“4”),因为它连接到zk1
。
现在我的问题是,如果我把我的客户端从zk1
切换到zk2
(leader还没有收到来自zk2
的写确认,所以zk2
在quorum后面),我会看到值为“3”而不是“4”。这会破坏顺序一致性吗?
2条答案
按热度按时间dnph8jn41#
ZooKeeper使用了一个特殊的原子消息协议,称为**ZooKeeper Atomic Broadcast (ZAB),它确保了集合体(Zookeeper服务器组)中的本地副本永远不会分散。
ZAB协议是原子的,因此该协议保证更新成功或失败。
在Zookeeper中,每个写操作都要经过leader,leader会生成一个transaction id(称为zxid**),并将其分配给这个写请求。
zxid是一个长(64位)整数,分为两部分:
zxid表示在所有副本上应用写入的顺序。epoch表示领导权随时间的变化。epoch是指给定服务器行使领导权的时间段。在epoch期间,leader广播提案并根据计数器识别每个提案。
如果领导者收到来自多数者的确认,则写入被认为是成功的。
zxid用于保持服务器同步并避免您所描述的冲突。
的数据
s4chpxco2#
当连接到一个节点时,客户端提交它看到的最新zxid。如果这个zxid比节点看到的最后一个zxid新,它将拒绝连接。
因此,客户端写入但随后断开连接并重新连接到过时的follower的场景不会发生(重新连接被节点拒绝)。