zookeeper 中的“观察者”节点可以以陈旧的结果响应吗?

use*_*246 3 distributed-computing apache-zookeeper

这个问题是参考https://zookeeper.apache.org/doc/trunk/zookeeperObservers.html

观察员是一个集合的无投票权成员,他们只听到投票结果,而不是导致投票结果的协议协议。除了这个简单的区别之外,观察者的功能与追随者完全相同——客户端可以连接到它们并向它们发送读取和写入请求。观察者像追随者一样将这些请求转发给领导者,但他们只是等待听到投票结果。因此,我们可以在不损害投票性能的情况下,随心所欲地增加观察者的数量。

观察者还有其他优势。因为它们不投票,所以它们不是 ZooKeeper 集合的关键部分。因此,它们可能会失败,或与集群断开连接,而不会损害 ZooKeeper 服务的可用性。对用户的好处是观察者可以通过比追随者更不可靠的网络链接进行连接。事实上,观察者可用于与来自另一个数据中心的 ZooKeeper 服务器通信。Observer 的客户端将看到快速读取,因为所有读取都在本地提供,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少。

1)合奏团的无投票权成员- 有投票权的成员投票什么?

2)观察者的更新请求是如何工作的- 当 ZK 领导者收到更新请求时,它需要法定人数的节点来响应。观察者节点似乎不被视为法定节点。这是否意味着观察者节点在更新方面落后于领导者节点?如果这是真的,它如何确保观察者节点在读取过程中不响应陈旧数据?

3)观察者的客户端将看到快速读取,因为所有读取都是在本地提供的,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少- 来自所有其他节点的读取也将是本地只是因为它们与领导者同步,不是吗?我没有得到关于写入的部分。

这些问题应该有助于理解zookeeper和分布式系统。感谢这些问题的详细答案。提前致谢 !

Chr*_*oth 5

1)合奏团的无投票权成员- 有投票权的成员投票什么?

整体的典型成员(不是观察员)对由领导者协调的提议变更的成功/失败进行投票。在ZooKeeper: Wait-free Coordination for Internet-scale systems 一文中对细节进行了一些进一步的讨论。

2)观察者的更新请求是如何工作的- 当 ZK 领导者收到更新请求时,它需要法定人数的节点来响应。观察者节点似乎不被视为法定节点。这是否意味着观察者节点在更新方面落后于领导者节点?如果这是真的,它如何确保观察者节点在读取过程中不响应陈旧数据?

您是正确的,观察者节点不被视为法定人数的必要参与者。一般来说,更新延迟会受到观察者和领导者之间的网络延迟的影响。(这是否明显取决于特定的外部因素,例如观察者和领导者是否在具有低延迟网络链接的同一数据中心。)

请注意,即使不使用观察者,也不能保证集成中的每个服务器总是完全最新的。关于一致性保证的 Apache ZooKeeper 文档包含以下免责声明:

有时,开发人员错误地假设了 ZooKeeper 实际上没有提供的另一种保证。这是:

同时一致的跨客户端视图 ZooKeeper 不保证在每个时间实例中,两个不同的客户端将具有相同的 ZooKeeper 数据视图。由于网络延迟等因素,一个客户端可能会在另一个客户端收到更改通知之前执行更新。考虑两个客户端A和B的场景,如果客户端A将一个znode /a的值从0设置为1,然后告诉客户端B读取/a,客户端B可能会读取旧值0,具体取决于哪个服务器它连接到。如果客户端 A 和客户端 B 读取相同的值很重要,客户端 B 应该在执行读取之前从 ZooKeeper API 方法调用 sync() 方法。

然而,ZooKeeper 的客户端永远不会通过从他们已经读取的数据之前的时间点读取陈旧数据来“回到过去”。这是通过将单调递增的事务 ID(称为“zxid”)附加到每个 ZooKeeper 事务来实现的。当 ZooKeeper 客户端与服务器交互时,它会将客户端最后看到的 zxid 与服务器当前的 zxid 进行比较。如果服务器在客户端后面,那么它将不允许该服务器处理客户端的下一次读取。

3)观察者的客户端将看到快速读取,因为所有读取都是在本地提供的,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少- 来自所有其他节点的读取也将是本地只是因为它们与领导者同步,不是吗?我没有得到关于写入的部分。

重要的是要注意,文档中的这一声明是在观察者的一个重要用例的上下文中编写的:多个数据中心部署,不同数据中心之间具有更高的网络延迟。在这个声明中,“本地服务”是指从与客户端位于同一数据中心内的 ZooKeeper 服务器提供服务,因此它不会受到连接到另一个数据中心的较长延迟的影响。对于完整的上下文,这里是完整报价的副本:

事实上,观察者可用于与来自另一个数据中心的 ZooKeeper 服务器通信。Observer 的客户端将看到快速读取,因为所有读取都在本地提供,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少。