Paxos的推演和直观理解

Paxos在分布式系统中的重要性无需多言。我们能在网络上找到非常多解析Paxos原理的文章,这些文章大部分只讲协议的过程,有些深入的文章还会讲协议的证明,我总感觉缺少对Paxos协议“生动直观”的理解。最终我认为最直观解释Paxos的文章是作者Lamport在2001年发表的《Paxos Made Simple》。作者写这篇文档的目的是因为1998年发表的paxos原文《The part-time parliament》被很多人吐槽晦涩难懂。在《Paxos Made Simple》文中作者对Paxos协议做了一次从简单场景到完整协议的推演。我写这篇文章没有什么新奇的地方,仅仅写我对《Paxos Made Simple》的推演过程的消化理解。

Paxos协议要解决的问题:

在一个不可靠的分布式环境中,各个实体达成一个一致的状态。

如果系统中只有一个proposal,那么这个proposal的提议在大多数acceptor存活时,必须要被接受。因此

P1.  An acceptor must accept the first proposal that it receives.

如果有多个proposal,每个acceptor只接受第一个proposal而拒绝后续所有的proposal的话。那么就可能会导致每个proposal都不能被大多数acceptor接受,导致协议无法收敛。因此:

每个acceptor接受的proposal不止一个,当然,只有被大多数acceptor接收的proposal才会被chosen

因此,我们允许多个proposal被选中,但是必须保证:这些被选中的proposal都有同样的value。也就是说:

P2. If a proposal with value v is chosen, then every higher-numbered proposal that is chosen has value v.

如何来保证只要一个value为v的proposal被chosen,后续的proposal的值都为v呢?

P2a. If a proposal with value v is chosen, then every higher-numbered proposal accepted by any acceptor has value v.

简单啊,只要保证后面的被acceptor的proposal的值都为v就好了。那么如何保证后面的被accept的prososal都是v呢?

P2b. If a proposal with value v is chosen, then every higher-numbered proposal issued by any proposer has value v.

简单啊,只要后面proposer发出的proposal都为v就好了。(这不废话吗)

那么,如何保证一旦一个proposal被chosen,后续的proposal都跟之前的proposal有相同的value呢?

P2c. For any v and n, if a proposal with value v and number n is issued, then there is a set S consisting of a majority of acceptors such that either (a) no acceptor in S has accepted any proposal numbered less than n, or (b) v is the value of the highest-numbered proposal among all proposals numbered less than n accepted by the acceptors in S.

意思是我们要把好proposal的出口这一关,就是说proposal不能瞎jb提,这样才能保证“达成一致”的这个过程最快速的收敛。P2c翻译一下的意思就是:对于任何一个proposal(n,v)(n是提案编号,v是提案值),如果要提出这个proposal,必须要满足一下的两个条件之一:

1. 大多数的acceptor都没有accept小于n的proposal; 或者

2. 大多数的acceptor accept的提案都小于n,这其中序号最大的一个提案的值就是v

怎么理解这两个条件呢?直观一点讲就是,如果你想提案,要么1)大多数acceptor没有接受过任何提案;要么2)你的提案跟之前最大编号的提案一样。

好,其实paxos本质上就是通过约束每个proposer要提出的proposal来达到快速达成一致的目的(收敛)。

那么如何来约束proposor提出的proposal呢?根据之前提出了两个条件,因此proposer在提出proposal之前,必须先“学习”,学习当前(大多数acceptor)最大提案的值。这个学习的过程叫做"Prepare":

Prepare阶段

一个Proposer要想提案,它首先得知道当前要么大部分acceptor没有接受过任何提案,要么找到一个在大部分acceptor组成的集合中最大的提案值。因此Proposer首先获取一个新的提案编号,然后使用这个编号N向大部分acceptor发送prepare请求。这些acceptor给proposer响应

1)要么大多数acceptor从来没有接受过任何提案

2)要么有部分acceptor告诉proposer当前最大的提案编号和提案值

    2.1 有部分Acceptor的接受的最新的提案大于等于N,不可能。因为Acceptor只返回小于N的最大编号和提案值。一个acceptor不会响应一个小于它当前提案编号的proposal。

    2.2 所有的提案编号都小于N。

3)有返回的acceptor没有达到大多数(proposal无法继续)

我们再看Acceptor在Prepare阶段的逻辑:

1)如果Acceptor没有承诺/接受过任何提案,那么向Proposal直接返回承诺,也就是后续不会接收小于N的proposal

2)如果Acceptor 承诺过一个小于N的提案,那么Aceeptor可以直接向Proposal再次承诺N,也就是之前的小于N的Proposal将永远不会被自己Accept

3)如果Acceptor接受过一个小于N的提案,那么返回这个提案编号和提案值

4)如果Acceptor承诺过一个大于N的提案,那么忽略当前为N的提案(承诺也没用,因为就算承诺了N,也不可能接受N)

5)如果Acceptor接受过一个大于N的提案,那么忽略当前为N的提案

一旦Acceptor给出了Prepare阶段的响应,意味着这个Acceptor将不会接受小于N的提案。什么意思呢?只要一个Proposal通过了Prepare阶段,也就意味着任何一个小于N的Proposal如果还没有Prepare,他将不能通过Prepare阶段,如果通过了Prepare,它也不会被大多数acceptor接受。相当于对整个acceptor集群做了一个锁定操作,即锁定不会有一个小于N的proposal被chosen。

但是也会出现这个问题,当为N的proposal在通过prepare阶段之后但是还没有还没有发送acceptor请求之前,另一个proposer发起了一个编号为N+1的proposal,这个时候N+1也可以通过Prepare阶段,接着另一个Proposor可能再发起一个N+2的proposal,这样整个协议过程将无法收敛。

Accept阶段

Proposer在Acceptor阶段的逻辑:当第一阶段学习(Prepare)完成后,Proposal收到了大部分Acceptor的响应。

1. 如果有一个最大的Proposal被接受,也就以为着当前没有任何一个大于N的proposal被chosen。那么Proposer将会用自己选用的Proposal编号和学习到的当前最大Proposal的值作为新提案发起Accept请求。 (是否意味着有可能已经有小于N的proposal被chosen?有可能。是否意味着有可能有多个小于N的proposal被chosen?有可能。但是没关系,因为这些已经被chosen的提案值和当前将要发出的提案值都一样)。

2. 如果大部分的Acceptor没有接受过任何Proposal,那么Proposer可以自己指定任何提案值发起Accept请求。

Acceptor在Accept阶段的逻辑:

P1a. An acceptor can accept a proposal numbered n iff it has not responded to a prepare request having a number greater than n.

也就是,如果Acceptor没有承诺过大于N的proposal,那它就可以accept N。(如果他Accept过小于N的proposal呢?)。一个Acceptor需要记住两样东西:

1. 已经承诺过的最大提案编号,用来忽略大于此编号的prepare和accept请求

2. 已经接受过的最大提案编号和提案值,用来约束后续的提案值(通过后续提案的prepare请求)

到此为止,这个协议的逻辑算讲完了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容