生活中的Paxos,原来你我都在使用——对Paxos生活化的解读

5月 15th, 2016

 

目录

引言    1

什么?老婆要在家里搞民主…    2

全民献计第一战,明确分工    2

一波未平一波又起,你不能总是变    4

没想到啊没想到,献计献策变成了处处抢占先机    6

让我们做一个规范总结吧    8

一切并未结束    9

写在最后    11

 

引言

 

前段时间,老婆给家里一岁半的小宝买了一套 克里斯.费利 博士的《宝宝的物理学》丛书,包括 《宝宝的量子物理学》,《宝宝的牛顿力学》,《宝宝的光学》等。小宝爱不释手,天天缠着我们读给他听,在整个过程中我也有很大的收获。在同一时间,由于工作需要,我也一直在啃计算机分布式系统中号称最难理解的协议——Paxos。看PPT、读论文、找相关文章,跟同事讨论,一段时间下来,总的来说也有一定的收获。两件事一结合,当时就萌生了一个想法,我能不能也像 费利 博士这样,用比较通俗易懂的文字(图画做不到,没这个功底…)来描述Paxos,让更多的人能够理解,进而使用。

 

有了这个想法后,一发不可收拾,隔三差五就会从大脑中蹦出来,我也一直在构思应该怎么来写,如何动笔,时至今日,感觉基本上成熟了,也就落笔开始了下面的这篇文章。全文以家庭中的日常生活为背景,以生活中的小例子为引子(故事情节纯属YY…),来逐步揭开Paxos协议的原理,希望阅读的朋友们能够从中获益!

 

什么?老婆要在家里搞民主…

 

作为一个典型的技术人,经常被老婆说是一根筋,除了技术,生活中的很多常识都不懂。正因如此,生活中的大小事宜,都是由老婆大人一手操办,而我也落得清闲。

 

但是,不久前的一天,老婆不知道哪根筋抽着了,突然跟我说:家里所有的事都有她来操办决策,不太好,希望全家人都能一起来献策献计,家庭也能够更加和谐。当时我一听就懵逼了,这唱的是哪一出戏?连忙回应道:现在这样很好,非常和谐,老婆您能者多劳,家里由你来主政,那一切必须是妥了又妥。但是,很多阅读此文的男性朋友大概也能感同身受,一旦老婆决定的事,那是很难更改的。因此我们全家也就被迫进入了一个全民献计献策的时代…

 

全民献计第一战,明确分工

 

先简单介绍下我们家的成员情况。我、老婆、一岁半的小宝,外加老婆的父母(跟我们一起住,帮我们来带小宝),五口人蜗居在杭州的一小间公寓里,过着简单的生活,全家倒也是其乐融融。

 

进入全民献计之后,由于小宝还小,自动被我们给忽略了。小宝的外公外婆也发话了:对杭州不熟,因此提不出太多意见,我们的意见提出来,他们一起决策倒是可以。数来数去,全民献计,只有我硬着头皮上了。开始我也反复琢磨,老婆虽然说是这么说来着,但是伴君如伴虎,谁知道真实的想法是啥啊。再加上对于生活中的大小事宜,我也确实缺乏想象。因此刚开始我也不敢对家庭生活中的各种事项妄加评论,还是以老婆大人马首是瞻。但是这样一来,又惹老婆不高兴了。没办法,那就尽量参与,提提意见呗。至此,家庭中的五人,第一轮分工完毕,对于家庭生活中的事宜,老婆和我共两人可以提出意见和建议,老婆、我外加小宝外公外婆可以进行决策,小宝太小,作为被动的接受方。

 

为了能够胜任新的职责,我也是好好恶补了一下各种生活小常识,对于日常中经常讨论的吃什么、去哪玩等问题,我也渐渐能够提出一些比较好的意见,能够被全家所接受。为此,老婆还好好的表扬了我一番。不知道哪一位先贤哲人曾经说过:权利是最好的chun药。太有道理了,对生活一两次指手画脚之后,尝到了瘾头,发现根本停不下来。慢慢的一些问题也凸显了出来,其中最大的一个问题,是家庭四人决策小组,有时候根本达不成一致。经常出现我跟小宝外公赞同一个方案,老婆和小宝外婆赞同另一个方案的情况,2 vs 2,经常僵持不下… 这种事情多了,难免会影响家庭和谐。这个时候,还是小宝的外公识大体,主动要求退出家庭决策圈,剩下3人决策,对于两个提案,总不至于再出现打平手,这个最大的问题也就迎刃而解。经过一段时间的摸索,对老婆提的家庭全民献计的想法,也有了一定的心得,将家庭人员分工明确了下来:

 

  • 提议人:老婆、我。两人。
  • 决策人:老婆、我、小宝外婆。三人。
  • 参与人:小宝外公、小宝,外加小宝外婆、老婆和我。五人。

 

一波未平一波又起,你不能总是变

 

家庭人员分工明确之后,全民献计基本上进入了正轨。大部分时候,还是老婆的生活经验最为丰富,建议也最多,三人一起表决通过,皆大欢喜。少部分时候,我也能够灵光一现,出一些鬼点子,老婆和小宝外婆外公也很满意。难得针对一件事,我跟老婆有不同的想法,每个想法先各自占有一票的情况下,小宝的外婆也能选择其中一方,形成2比1的投票结果,少数服从多数。小宝的外公落得清闲,全家人一起干啥他都是乐呵呵。而小宝呢,只要跟妈妈在一起,也是干啥都开心。

 

看起来是没有任何问题了,但生活上就是这样,一波未平一泼又起,这次出问题的是小宝外婆。小宝外婆有一个特点,比较善良,也比较纠结。在少数几次我跟老婆都有提议的时候,小宝外婆经常会改变主意。以中午出去吃啥为例,一个典型的场景如下:

 

老婆:中午不想做饭了,出去吃啥好?

我:吃XXX吧,好久没吃了。

小宝外婆:嗯,这个可以。

老婆:这个不好,上次吃过了,还是YYY吧。

小宝外婆:好好,想吃这个好久了。

我:要不ZZZ也不错,我朋友们一直推荐。

小宝外婆:听起来不错,去试试。

老婆:… …

小宝外婆:… …

我:… …

 

最后,老婆受不了了:妈,您老不能总是变来变去啊… 这不,又得立规矩了不是。经过家庭决策小组(小宝外公也参与了)的多次讨论,在明确分工之外,又新增了一条新规矩:如果一个方案已经在决策小组中获得了多数派的认同,那么就不能被改变了。针对前面提到的典型场景,如果使用了这条新规矩,会怎么样:

 

老婆:中午不想做饭了,出去吃啥好?

我:吃XXX吧,好久没吃了。

小宝外婆:嗯,这个可以。(画外音:此时我的方案已经被我和小宝外婆同时认可,形成多数派,不可更改。)

老婆:这个不好,上次吃过了,还是YYY吧。

小宝外婆:这次就听孩他爸的吧,下次再换YYY。

我:OK。

老婆(内心哪怕不情不愿):OK。

我:小宝外公,小宝,我们中午去吃XXX咯。(画外音:要把决策下来的方案告诉全家人不是J

 

感觉一切都搞定了,小宝外婆少了纠结,生活中的各种决策更加高效。虽然家庭生活本不是以高效为目的,但立下规矩,更快的达成一致,也能从某种程度上提升和谐指数J

 

没想到啊没想到,献计献策变成了处处抢占先机

 

生活中和工作中,每当我们认为所有的问题都得到解决时,后面接踵而来的新问题很快就会戳穿这个假象。有了明确的提议人、决策人、参与人的分工,又有了一条新规矩,难道还有什么问题是搞不定的?有,新问题不仅有,而且还不止一个,而且追根溯源,还都是新定的这个规矩惹的祸。

 

第一个暴露的新问题,来自小宝的外婆。前面也提到,小宝外婆为人比较善良,也比较纠结。新规矩实施之后,每当她刚同意一人,形成多数派决议之后,提案就不能被更改了。但是小宝外婆看到另外一人欲言又止,心里又觉得过意不去。而且,每次都这么杀伐果断,没有个稍微纠结一下的机会,也比较痛苦。

 

如果说第一个暴露的问题还好的话,那么第二个问题就更加严重一点。根据新规矩,基本上是谁先给出提案,谁就能达成多数派的决议。发展到后面就演变为我和老婆两个提议人,都不管提议本身的好坏,抢到先机再说。提议质量没法控制,家庭的生活质量也就随之下降,跟我们的本意反而背道而驰了。

 

没办法,决策小组继续坐下来一起思考应对之策,这次就比较花时间了,全家人一起想了许久,都没有很好地解决办法。正当大家像无头苍蝇一样乱撞之时,不得不说,还是老婆聪明,想到了一个顶顶好的解决办法,这个解决方法,说起来比较简单:

 

  • 针对处处抢占先机,一轮决策后就不能更改的情况。将现在的一轮决策改为两轮:
    • 第一轮:提议阶段。在这一阶段,我跟老婆可以发起提议,小宝外婆作为决策者,可以选择听谁的提议,但是不做决策。
    • 第二轮:决策阶段。在听了提议后,进入决策阶段,此时小宝外婆可以选择赞成这个提议,也可以选择反对这个提议。
  • 两轮中,第一轮提议阶段可以纠结,可以更改。第二轮决策阶段,这个跟前面提到的规矩保持一致:一旦决策阶段达成了多数派的决议,就不能更改。

 

仍旧是上面生活中同样的例子,现在会变成什么样子:

 

老婆:中午不想做饭了,出去吃啥好?

我:我有一个提议,大家想不想听听?(第一阶段:提议)

小宝外婆:说来听听。

老婆:登登(我的小名),你的肯定不靠谱,其实我也有一个提议。

小宝外婆:那我们就听听琛琛(老婆的小名)的吧。(画外音:提议阶段,可以更改。这一下小宝外婆的问题解决了。)

我:我的提议是…

小宝外婆:登登,你的提议机会被琛琛抢了。(画外音:提议被抢占,我的当前提议作废。)

老婆:我们去YYY吧。

小宝外婆:好,听你的,去YYY。(画外音:决策阶段,老婆和小宝外婆两人形成了多数派的决策,不能更改了。)

我:其实我本来想说是去XXX的。但既然大家都同意去YYY,那就去YYY。小宝外公,小宝,我们中午去YYY咯!(画外音:提议形成多数派的决议之后,就不能被更改,只能被接受。与此同时,我还有义务将接受的提议传达给参与人,小宝外公和小宝。当然,这里我不能撒谎,如果我撒谎了,跟小宝外公和小宝说我们全家最后决定去XXX,那么这两位就被我带到沟里去了…)

 

在老婆给出一个顶顶好的解决办法之后,在原有的基础上,我们全家也尝试实施这个新的两轮的提议方案,在实施的过程中也尝试不断地完善,前面提到的小宝外婆的问题,和一股脑儿处处抢占先机的问题,看起来也都得到了解决。

 

让我们做一个规范总结吧

 

自从老婆提议家庭生活,家庭全体成员一起献计献策之后,也经历了不短的时间。整个过程中,碰到过不少问题,但在全家的同心协力下,也都得到了解决。一天,老婆提议把过程中沉淀下来的经验和规范汇总起来,我想想也有道理,就做了下面这个汇总:

 

  • 家庭成员明确不同的分工。提议人、决策人、参与人。

    其中,提议人和参与人的人数没有限制,视家庭成员而定。但是,决策人的人数最好为奇数,最小人数是3人(3、5、7、9…。不是奇数的话,会碰到我们最早遇到的两个提议相持不下的情况。)

  • 整个过程分为三个阶段。提议阶段,决策阶段,通知阶段。
    • 提议阶段:提议人在这个阶段,可以任意发起提议请求。提议请求可以被更改、抢占。简单起见,我们做了一个规定:新的提议请求可以抢占老的提议请求。
    • 决策阶段:决策一旦达成了多数派,就不能被更改。与此同时,达成多数派决议的决策人,还有义务将当前达成的决议告知其他提议人和决策人,告诉大家本轮决策已经达成了,不用绞尽脑汁YY新的提议。
    • 通知阶段:决策达成之后,最后一个阶段就是通知阶段。将当前决策的内容告诉参与人。此时要坚守一点原则:不能说谎。当然,这也是中华民族的传统美德,我们家里是每个人都能做到的…

 

经验和规范总结起来,好像也没有几条,简单易理解,全家人都能遵守。直到有一天,一位搞技术的朋友到我家来做客,无意中聊起这个,我把这个说给他听,他猛地一拍大腿,跳了起来,嚷嚷道:我kao,这不就是分布式Paxos协议的雏形吗!这时我才知道,原来我们家误打误撞之下,也能够跟大师在同一个层面思考问题了J

 

一切并未结束

 

规矩是死的,人是活的,哪怕严谨如各种法规和法律,都会有人钻空子,更别提我们家里几个臭皮匠YY出来的了。现有的规矩,后面又逐渐暴露出一些漏洞和不足之处。我在这里列举一二:

 

  • 提议更改抢占没完没了

    由于提议阶段可以抢占,后来又发生了几次抢占没完没了的事。仍旧是同样的例子:

老婆:中午不想做饭了,出去吃啥好?

我:我有一个提议,大家想不想听听?(1号提议)

小宝外婆:说来听听。

老婆:登登,你的肯定不靠谱,我也有一个提议。(2号提议,抢占1号)

小宝外婆:那我们就听听琛琛的吧。

我:还是听听我这个吧,我的这个提议肯定更好。(3号提议,又抢占2号)

小宝外婆:那好,登登既然坚持,还是听登登的。

老婆:凭什么他的更好,听我的。(4号提议,叒抢占3号)

小宝外婆:…

我:…

老婆:…

 

在提议阶段一直相互抢占,一直未进入决策阶段。当然,实际生活中肯定不会出现这种情况,对我来说,这不是找抽吗?但是这个风险本身是存在的。

 

  • 碰到连续有几件事情需要决策,效率不高

    一般周末全家出去玩,基本上是一个上午、一个下午,或者是完整的一整天。涉及到去哪玩,开车走哪条路,在哪吃饭等一系列需要决策的问题。如果对每一个问题都这么来一轮,效率太低。而且,这些问题相互之间还有关联性,分开来一个个决策也不好。总不能决定去西溪湿地玩,但是却去钱江新城吃饭,太远了也不现实。

问题总是用来解决的,而且无论是生活还是工作,都是在解决了一个老问题后,等着新问题的到来。有问题不怕,我们需要锻炼的,是坦然面对层出不穷新问题的心态J

 

写在最后

 

写了这么多,也该收笔了。正如文章开始引言部分所说,个人的本意还是想以贴近生活,更加通俗易懂的例子,来解读这个号称分布式系统领域最为难懂的Paxos协议。文章没法覆盖Paxos的方方面面, 而只是作为一个引子,希望能够从不同的视角来说明Paxos协议中各种标准和规范的由来。网上关于Paxos的文章那是多如牛毛,想更深入的了解,Google之。个人最近看得比较多的两篇,一个是Google同学写的《Paxos made live》,另一篇是李凯同学写的《架构师需要了解的Paxos原理、历程及实战》,感觉都非常不错,一并推荐给大家。

 

最后,还是要感谢 克里斯.费利 博士,不管我这篇文章质量如何,下定决心写很大程度上是受到了其《宝宝的量子物理学》系列丛书的影响,家里有小宝宝的同学,也一并推荐给大家,值得买回来读个宝宝听!

  1. 玄风
    7月 2nd, 201617:51

    大赞!

  2. 林间晓风
    7月 31st, 201615:50

    raft 提供的新做法,从工程上讲,是不是可以舍弃 paxos 了
    paxos 只是用来作为学术研究用