可以"观察者" zookeeper中的节点响应过时的结果?

时间:2017-01-05 19:09:27

标签: apache-zookeeper distributed-computing

此问题仅供参考https://zookeeper.apache.org/doc/trunk/zookeeperObservers.html

  

观察员是只能听到的合唱团的非投票成员   投票结果,而不是导致他们的协议协议。   除了这个简单的区别,观察者的功能正是如此   跟随者 - 客户可以连接到他们并发送阅读和   向他们写请求。观察员将这些请求转发给领导者   像追随者那样,但他们只是等着听到结果   投票。因此,我们可以增加观察员的数量   如我们所愿,不会损害选票的表现。

     

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

1)无投票权的合唱团成员 - 投票成员投票的是什么?

2)更新请求如何为观察者工作 - 当ZK领导者获得更新请求时,需要法定数量的节点进行响应。 Observer节点似乎不被视为仲裁节点。这是否意味着观察者节点落后于领导节点以进行更新?如果这是真的,那么它如何确保观察者节点在读取期间不响应陈旧数据?

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

这些问题应该对于理解zookeeper和分布式系统一般有用。感谢这些的详细解答。提前谢谢!

1 个答案:

答案 0 :(得分:2)

  

1)无投票权的合唱团成员 - 投票成员投票的是什么?

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

  

2)更新请求如何为观察者工作 - 当ZK领导者获得更新请求时,需要法定数量的节点进行响应。 Observer节点似乎不被视为仲裁节点。这是否意味着观察者节点落后于领导节点以进行更新?如果这是真的,那么它如何确保观察者节点在读取期间不响应陈旧数据?

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

请注意,即使不使用观察者,也无法保证整体中的每个服务器始终完全是最新的。 Consistency Guarantees上的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) Observer的客户端将看到快速读取,因为所有读取都在本地提供,并且写入会导致最小的网络流量,因为缺少投票协议时所需的消息数量较少 - 来自所有其他节点的读取也只是本地的,因为它们与领导者同步,不是吗?我没有得到关于写作的部分。

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

  

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