ZooKeeper 如何提供顺序一致性

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.

现在我的问题是,如果我将我的客户从 切换zk1zk2(领导者没有收到来自 的写确认zk2,所以zk2在法定人数之后)我会看到该值是“3”而不是“4”。它会破坏顺序一致性吗?

Nic*_*Ben 5

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

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

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

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

  • 时代
  • 柜台

zxid 表示在所有副本上应用写入的顺序。该划时代表示一段时间在领导的变化。时代是指给定服务器行使领导权的时期。在一个纪元期间,领导者广播提案并根据计数器识别每个提案。

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

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

在此处输入图片说明

  • 我最近发现zookeeper只读取客户端连接的zknode的读取数据。因此,如果原帖中提到的 zk2 节点是未发送 ACK 的关注者,是否意味着结果将为“3”。读取请求从本地 zknode 读取 (http://www.corejavaguru.com/bigdata/zookeeper/how-zookeeper-works) ZAB 是否会阻止通过非 acked follower 读取旧数据? (2认同)