Paxos算法-基于消息传递的一致性算法

1.来源

Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法。

1.1.故事

在古希腊,有一个叫做Paxos的小岛,岛上通过议会的形式来通过法令,议会中议员通过信使来传递消息。议员和信使都是兼职的,他们随时有可能离开会议厅,并且信使可能会重复的传递消息,也可能丢失消息。因此议会要保证在这种情况下法令仍然能够正确地产生,并且不会出现冲突。

1.2.波折

1990年,The Part-Time Parliament,完成并投稿,无人能懂,被拒
1996年,上述论文被重审,Nancy Lynch公布修改版Revisiting the Paxos Algorithm
1998年,The Part-Time Parliament终于被ACM TOCS接收
2001年,Lamport本人重新讲述原文,发表了论文Paxos Made Simple

2.分布式事务的CAP理论

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition Tolerance)

三者不可兼得

3.常见一致性协议

  • 两阶段提交
  • 三阶段提交
  • ZAB协议
  • Paxos协议
  • Raft协议

3.1.限定

  • 只有被提出的提案才能被选定
  • 在被提出的提案中,只有一个提案会被选定
  • 如果没有被提出,那么就不会有被选定的提案
  • 当一个提案被选定后,进程可以获取被选定的提案信息
  • 任一进程认为被选定的那个提案,必须是真的被选定的那个

4.Paxos算法

4.1.角色

Proposer(选举中对某个职位提出候选人的倡议者)

  • 发送Prepare请求给Acceptor
  • 发送Accept请求给Acceptor

Acceptor(对倡议者提出的候选人进行投票的参与者)

  • 接收Prepare请求,并回复Prepare请求
  • 接收Accept请求,并发送Result给Learner

Learner(类似于没有投票权的群众)

  • 接收Result

4.2.通信方式

  • 不同角色之间可以通过发送消息来进行通信,那么:每个角色以任意的速度执行,可能因出错而停止,也可能会重启
  • 一个value被选定后,所有的角色可能失败然后重启,除非那些失败后重启的角色能记录某些信息,否则等他们重启后无法确定被选定的值
  • 消息在传递过程中可能出现任意时长的延迟,可能会重复,也可能丢失。但是消息不会被损坏,即消息内容不会被篡改

4.3.推导

4.3.1.一个Acceptor

假设只有一个Acceptor(可以有多个Proposer),只要Acceptor接受它收到的第一个提案,则该提案被选定,该提案里的value就是被选定的value。这样就保证只有一个value会被选定。

缺陷:唯一的Acceptor宕机,就彻底崩溃了

4.3.2.多个Acceptor

4.3.2.1.约定

  • P1:一个Acceptor必须接受它收到的第一个提案
    一个提案被选定需要被半数以上的Acceptor接受,那么一个Acceptor必须能够接受不止一个提案
    • P1a:一个Acceptor只要尚未响应过任何编号大于M的Prepare请求,那么他就可以接受这个编号为M的提案
  • P2:如果某个value为v的提案被选定了,那么每个编号更高的被选定提案的value必须也是v
    • P2a:如果某个value为v的提案被选定了,那么每个编号更高的被Acceptor接受的提案的value必须也是v
    • P2b:如果某个value为v的提案被选定了,那么之后任何Proposer提出的编号更高的提案的value必须也是v
    • P2c:对于任意的M和V,如果提案[M, V]被提出,那么存在一个半数以上的Acceptor组成的集合S,满足以下两个条件中的任意一个:
      • S中每个Acceptor都没有接受过提案
      • S中Acceptor接受过的最大编号的提案的value为V

4.3.2.2.推论

4.3.2.2.1.满足P2b

Proposer生成提案之前,应该先去“学习”已经被选定或者可能被选定的value,然后以该value作为自己提出的提案的value。如果没有value被选定,Proposer才可以自己决定value的值。这样才能达成一致。这个学习的阶段是通过一个“Prepare请求”实现的。

4.3.2.2.2.满足P1a

如果Acceptor收到一个编号为M的Prepare请求,在此之前它已经响应过编号大于M的Prepare请求。该Acceptor不可能接受编号为M的提案。因此,该Acceptor可以忽略编号为M的Prepare请求。当然,也可以回复一个error,让Proposer尽早知道自己的提案不会被接受。

4.3.2.3.提案生成

  • Proposer选择一个新的提案编号M,然后向某个Acceptor集合(半数以上)发送Prepare请求,要求该集合中的每个Acceptor做出如下响应:
    • 向Proposer承诺保证不再接受任何编号小于M的提案
    • 如果Acceptor已经接受过提案,那么就向Proposer响应已经接受过的编号小于M的最大编号的提案
  • 如果Proposer收到了半数以上的Acceptor的响应,那么它就可以生成编号为M,Value为V的提案[M,V]。其中V是所有的响应中编号最大的提案的Value。如果所有的响应中都没有提案,那么此时V就可以由Proposer自己选择。
  • 生成提案后,Proposer将该提案发送给半数以上的Acceptor集合,并期望这些Acceptor能接受该提案。称该请求为Accept请求。

4.3.2.4.接收提案

  • Acceptor接收到Prepare请求编号M,
    • 当前响应的最大编号>M,则忽略或回复error
    • 当前响应的最大编号<M,
      • 当前已接受[N,B]的Accept请求,则回复M,B
      • 当前未接受,则记录M,返回ACK
  • Acceptor接收到Accept请求[M,V]
    • 当前响应的最大编号>M,则忽略或回复error
    • 当前响应的最大编号<M,
      • 当前未接受,则记录[M,V],并通知Learner,V
      • 当前已接受[N,B]的Accept请求,则
        • N>M,则忽略或回复error
        • N<M,则记录[M,V],并通知Learner,V

4.3.2.5.流程

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

推荐阅读更多精彩内容

  • Paxos算法在分布式领域具有非常重要的地位。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更...
    Jeffbond阅读 16,823评论 25 87
  • Paxos是什么 Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有...
    jiangmo阅读 1,473评论 0 6
  • 此文知识来自于:《从Paxos到Zookeeper分布式一致性原理与实践》第二章分布式入门基础知识,由于博主对其理...
    李文文丶阅读 1,842评论 0 0
  • 原文:Paxos Made Simple作者:Leslie Lamport时间:01 Nov 2001 1 Int...
    随安居士阅读 1,531评论 1 2
  • 试试发新帖
    aidm阅读 170评论 0 0