ZooKeeper如何提供顺序一致性

bpzcxfmw  于 5个月前  发布在  Apache
关注(0)|答案(2)|浏览(57)

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”。这会破坏顺序一致性吗?

dnph8jn4

dnph8jn41#

ZooKeeper使用了一个特殊的原子消息协议,称为**ZooKeeper Atomic Broadcast (ZAB),它确保了集合体(Zookeeper服务器组)中的本地副本永远不会分散。
ZAB协议是原子的,因此该协议保证更新成功或失败。
在Zookeeper中,每个写操作都要经过leader,leader会生成一个transaction id(称为
zxid**),并将其分配给这个写请求。
zxid是一个长(64位)整数,分为两部分:

  • 时代
  • 计数器

zxid表示在所有副本上应用写入的顺序。epoch表示领导权随时间的变化。epoch是指给定服务器行使领导权的时间段。在epoch期间,leader广播提案并根据计数器识别每个提案。
如果领导者收到来自多数者的确认,则写入被认为是成功的。
zxid用于保持服务器同步并避免您所描述的冲突。


的数据

s4chpxco

s4chpxco2#

当连接到一个节点时,客户端提交它看到的最新zxid。如果这个zxid比节点看到的最后一个zxid新,它将拒绝连接。
因此,客户端写入但随后断开连接并重新连接到过时的follower的场景不会发生(重新连接被节点拒绝)。

相关问题