Jam*_*ang 3 consistency distributed-computing apache-zookeeper
在这里 有人说:
“即使你每次都从不同的追随者那里读到数据,在看到第 4 版之后,你永远也看不到第 3 版的数据。”
因此,如果我有 3 个节点 zookeeper 仲裁,如下所示:
zk0 -- leader
zk1
zk2
Run Code Online (Sandbox Code Playgroud)
假设仲裁“3”中有一个值并且我有一个客户端连接到zk1,然后我的客户端发送一个写入请求(将“3”更新为“4”)并且zk0(领导者)写入该值然后随后收到来自zk1. 我的客户可以看到新的(“4”),因为它连接到zk1.
现在我的问题是,如果我将我的客户从 切换zk1到zk2(领导者没有收到来自 的写确认zk2,所以zk2在法定人数之后)我会看到该值是“3”而不是“4”。它会破坏顺序一致性吗?
ZooKeeper 使用称为ZooKeeper Atomic Broadcast (ZAB)的特殊原子消息传递协议,它确保整体(Zookeeper 服务器组)中的本地副本永远不会发散。
ZAB 协议是原子的,因此该协议保证更新要么成功要么失败。
在 Zookeeper 中,每次写入都经过领导者,领导者会生成一个事务 ID(称为zxid)并将其分配给此写入请求。
zxid 是一个长(64 位)整数,分为两部分:
zxid 表示在所有副本上应用写入的顺序。该划时代表示一段时间在领导的变化。时代是指给定服务器行使领导权的时期。在一个纪元期间,领导者广播提案并根据计数器识别每个提案。
如果领导者收到大多数人的确认,则认为写入成功。
zxid 用于保持服务器同步并避免您描述的冲突。