论文地址:Zookeeper的原子广播协议:理论与实践——Medeiros 2012。

    也许在阅读了昨天关于Zab的论文之后,你会觉得你对Zookeeper的原子广播是如何在封面下工作有了一个很好的理解。不幸的是我有消息要告诉你-你没有!*不过,这不是你的错——事实证明ZooKeeper的实现(至少到2012年为止,我还没有读到最新的源代码)与论文中描述的一些关键领域不匹配。而且它并不是随着时间的推移而从纸质版本中游离出来的,它的实现似乎从未与纸质版本相匹配。至少,这是今天的报纸选择所宣称的。

    (*)除非您已经独立更新了实现,或者已经阅读了今天的选择。
    尽管bug正在被积极修复,但经验告诉我们必须谨慎地处理分布式协调问题。事实上,Zookeeper的唯一目的就是妥善处理这些问题……然而,Zookeeper的发展也经历了这些被引用的问题。其中一些问题来自于Junqueira等人的已实现协议和已发布协议之间的差异。。显然,这种差异自开发之初就存在,这意味着早期的优化尝试。

    本文的第一部分是对我们昨天检查的Zab协议的总结。回想一下,该协议有三个关键阶段,并且隐藏了如何选择领导者(“有一个先知”)。我们可以认为领袖选举是一个“0阶段”:
    在第一阶段开始时,同侪检查其投票,并决定是否应成为追随者或领导者。因此,领导人选举有时被称为第0阶段。
    我们将在论文的第4节“实现”中讲述这个故事

    Apache ZooKeeper是用Java编写的,我们用来研究实现的版本是3.3.3。版本3.3.4是最新的稳定版本(到目前为止),但是在Zab层中差别很小。不过,最近不稳定的版本有重大变化。大部分源代码都是专门用于ZooKeeper的存储功能和客户机通信的。负责Zab的类位于实现的内部…

    (截至本文发表之日,最新的稳定版本是3.4.6)。
    Zab的Java实现大致遵循算法1、2和3。在源代码中添加了一些优化,这使得实际的实现看起来与我们在上一节[原始文件]中看到的明显不同。特别是,阶段0的默认领导人选举算法与阶段1的实现紧密耦合。
    该算法被称为快速领导者选举(FLE),通过选择具有最新历史的对等节点来尽量减少领导者选举时的状态转移。因此,在协议的第1阶段和第2阶段之间没有明确的区别,因此这些阶段在概念上被组合在一起,被称为第0阶段(FLE)之后的恢复阶段,并假设领导者在法定人数中有最新的历史记录。修订后的恢复阶段工作如下:

    • 当leader从follower收到FOLLOWERINFO消息时,它会发送一个带有leader的最新事务id的NEWLEADER响应。
    • 然后,leader发送三条消息之一:SNAP、DIFF或TRUNC,用于同步leader和follower之间的状态。如果客户端太过时,将发送包含状态完整快照的快照消息。如果客户机只是有点过时,将发送一条DIFF消息,其中只包含客户机丢失的状态。但,若客户机领先于领导者,则会发送一条TRUNC消息。
    • 当跟随者收到NEWLEADER消息时,它会检查它的epoch数是否高于跟随者自己的epoch数,如果没有,则转换到选举状态以执行阶段0。
    • 当跟随者收到快照时,它会将快照复制到其数据库并提交更改。如果它收到DIFF,它将接受DIFF中的所有提议并提交更改。但是,如果跟随者已收到TRUNC(带有事务id),则它将中止从TRUNC id以后知道的所有建议。
    • 在SNAP、DIFF或TRUNC的处理之后,跟随者发送回一个新的leader确认。
    • 一旦领导者有了确认的法定人数,协议就转换到第3阶段。

    此同步的目的是使副本保持相互一致的状态。为了这样做,任何副本中提交的事务都必须以相同的顺序提交到所有其他副本中。此外,必须放弃不应再提交的拟议事务,以便没有对等方提交它们。消息SNAP和DIFF负责前一种情况,TRUNC负责后一种情况。
    让我们知道把注意力转向FLE协议本身。
    在FLE中,选举州的同僚投票给其他同僚,以选举具有最新历史的领导人。对等点交换有关其投票的通知,并且当发现具有更新历史记录的对等点时,它们更新自己的投票。FLE的本地执行将终止返回对单个对等机的投票,然后过渡到恢复阶段。如果投票是针对同侪本身的,它将转移到州领导(和跟随自己),否则它将转移到州跟随。
    “由于与设计的协议不同,实现的协议出现了一些问题……”其中两个问题被描述,一个与循环行为有关,在循环行为中,系统可能会在FLE和恢复阶段之间陷入反弹,另一个与在收到TRUNC消息时放弃建议的方式有关。
    把这些协议弄对很难。我们之前已经看到了AmazonGoogle如何使用正式技术来发现分布式系统中的深层漏洞。在“SAMC:语义感知模型检查以快速发现云系统中的深层漏洞”中,Leesatapornwongsa等人。描述一种非常有前途的技术,它在动物园管理员中发现了许多已知存在的深层昆虫,还发现了一些新的昆虫(以及纱线和卡桑德拉)。我们将在以后的晨报上看到这项工作。