自Paxos问世以来就持续垄断了分布式一致性算法,Paxos这个名词几乎等同于分布式一致性。Google的很多大型分布式系统都采用了Paxos算法来解决分布式一致性问题。在学习了Raft算法之后自然不能错过。

[论文地址]

1. 相关概念

在Paxos算法中,有三种角色:

  • Proposer
  • Acceptor
  • Learners

一个节点可以同时充当多个角色,既是 Proposer ,又是 Acceptor,又是 Learners

2.算法背景

Paxos算法是解决分布式一致性问题的共识算法,使得分布式系统中的各个进程就某个决议达成一致。

Paxos算法运行在允许宕机故障的异步系统中,不要求可靠的消息传递,可容忍消息丢失、延迟、乱序以及重复。但是信息不能被篡改,即属于非拜占庭模型。它利用大多数 (Majority) 机制保证了2F+1的容错能力,即2F+1个节点的系统最多允许F个节点同时出现故障。

  • Proposer:提出proposal。Proposal信息包括提案编号(Proposal ID)和提议的值(Value)。
  • Acceptor:参与决策,回应Proposers的提案。收到Proposal后可以接受提案,若Proposal获得多数Acceptors的接受,则该Proposal被选定。
  • Learner:不参与决策,从Proposers/Acceptors学习最新达成一致的提案(Value)。

推导定理

在论文中通过一系列的推导,引出Paxos的三条规定:

  1. 当一个Acceptor没有响应任何编号大于NPrepare请求,那么他就可以接受这个编号为N的提案。
  2. 一个提案被选定需要被半数以上的Acceptor接受才能被选定
  3. 如果某个value为v的提案被选定了,那么之后任何Proposer提出的编号更高的提案的value必须也是v。

其中1、2很好满足,而第3条需要通过另一个规定进行实现:

  1. 对于任意的N和V,如果提案[N,V]被提出,那么存在一个半数以上的Acceptor组成的集合S,满足以下两个条件中的任意一个:

    • S中每个Acceptor都没有接受过编号小于N的提案
    • S中Acceptor接受过的最大编号的提案的value 为 V。

提案生成算法

基于之前的第四条规定,Proposer生成提案之前,应该先去学习之前的value,避免不一致的提案产生。

因此提案生产可以分为两个步骤:

  1. Prepare阶段:

    Proposer生成一个递增的提案编号N,然后向Acceptor发送请求,要求每个Acceptor做出以下响应:

    (1)向Proposer承诺保证不再接受任何编号小于N的提案

    (2)如果Acceptor中存在小于N的提案,就向Proposer响应已经接受过的编号小于N的最大编号的提案

  2. Accept阶段:

    如果Proposer收到了半数以上的Acceptor的响应,那么它就可以生成编号为N,Value为V的提案[N,V]。这里的V是所有的响应中编号最大的提案的Value。如果所有的响应中都没有提案,那么此时V就可以由Proposer自己生成。

Acceptor接受

Acceptor可以忽略任何请求而不用担心破坏数据的一致性。

而对于接受的场景:

  • 当一个Acceptor没有响应任何编号大于NPrepare请求,那么他就可以接受这个编号为N的提案。
  • 也即对Proposer的承诺(1)

因此一个Acceptor只需记住:1. 已Accept的编号最大的提案 2. 已Prepare请求的最大编号。

Learner学习

最简单的方案是每个 Acceptor 接受提案后,就将该提案发送给所有 Learner。 当Learner收到的提案超过一半时,即认为该提案被选择。但这样需要(M*N)次的网络通信

也可以选择一个主Learner。Acceptor接受一个提案后,就将该提案发送给主Learner,主Learner再通知其他Learner。但主Learner一旦故障会导致系统无法运转(单点故障)。

方案三则是Acceptor发送提案给某个Learner集合,再由Learner集合进行转发,是前两个方案的结合。

保持前进

如前所述,按照Paxos算法的流程,可能会有两个Proposer依次提出编号递增的方案,导致Acceptor在prepare阶段通过请求,在accept阶段拒绝请求。任何proposal都无法被执行,形成活锁。

因此可以选择一个主Proposer,仅有它可以发出提案。

Multi-Paxos算法

在Basic Paxos中只能对一个值进行决议,决议的形成至少需要两次网络来回,在高并发情况下可能需要更多的网络来回,极端情况下甚至可能形成活锁。

实际应用中几乎都需要连续确定多个值,而且希望能有更高的效率。Multi-Paxos正是为解决此问题而提出。Multi-Paxos基于Basic Paxos做了两点改进:

  1. 针对每一个要确定的值,运行一次Paxos算法实例(Instance),形成决议。每一个Paxos实例使用唯一的Instance ID标识。
  2. 在所有Proposers中选举一个Leader,由Leader唯一地提交Proposal给Acceptors进行表决。这样没有Proposer竞争,解决了活锁问题。在系统中仅有一个Leader进行Value提交的情况下,Prepare阶段就可以跳过,从而将两阶段变为一阶段,提高效率。

Multi-Paxos首先需要选举Leader,Leader的确定也是一次决议的形成,所以可执行一次Basic Paxos实例来选举出一个Leader。选出Leader之后只能由Leader提交Proposal,在Leader宕机之后服务临时不可用,需要重新选举Leader继续服务。在系统中仅有一个Leader进行Proposal提交的情况下,Prepare阶段可以跳过。

Multi-Paxos通过改变Prepare阶段的作用范围至后面Leader提交的所有实例,从而使得Leader的连续提交只需要执行一次Prepare阶段,后续只需要执行Accept阶段,将两阶段变为一阶段,提高了效率。为了区分连续提交的多个实例,每个实例使用一个Instance ID标识,Instance ID由Leader本地递增生成即可。

Multi-Paxos允许有多个自认为是Leader的节点并发提交Proposal而不影响其安全性,这样的场景即退化为Basic Paxos。

参考

[分布式一致性算法——Paxos原理与推导过程]

[Paxos算法详解]

[拜占庭将军问题]

[拜占庭将军问题深入探讨]

Distributed | Paxos的更多相关文章

  1. 《Paxos Made Simple》翻译

    1 Introduction 可能是因为之前的描述对大多数读者来说太过Greek了,Paxos作为一种实现容错的分布式系统的算法被认为是难以理解的.但事实上,它可能是最简单,最显而易见的分布式算法了. ...

  2. zookeeper学习系列:四、Paxos算法和zookeeper的关系

    一.问题起源 淘宝搜索的博客 http://www.searchtb.com/2011/01/zookeeper-research.html  提到Paxos是zookeeper的灵魂 有一篇文章标题 ...

  3. 分布式系统(Distributed System)资料

    这个资料关于分布式系统资料,作者写的太好了.拿过来以备用 网址:https://github.com/ty4z2008/Qix/blob/master/ds.md 希望转载的朋友,你可以不用联系我.但 ...

  4. (分享)Paxos在大型系统中常见的应用场景

    原帖http://timyang.net/distributed/paxos-scenarios/ 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby ...

  5. 分布式学习材料Distributed System Prerequisite List

    接下的内容按几个大类来列:1. 文件系统a. GFS – The Google File Systemb. HDFS1) The Hadoop Distributed File System2) Th ...

  6. [转载] 一篇文章带你了解Paxos算法

    原文: http://dockone.io/article/640 [编者的话]本文是Quora上关于Paxos算法的回答,两位答者分别从不同的角度描述Paxos算法.Vineet Gupta的回答细 ...

  7. Paxos算法 Paxos Made Simple

    Paxos算法 Paxos Made Simple Leslie Lamport 2001.11.1 简介 Paxos算法,纯文本方式描述,非常简单. 1 介绍 为 实现具有容错能力的分布式系统而提出 ...

  8. Paxos Made Simple(译)

    The Paxos algorithm, when presented in plain English, is very simple. 我叫Leslie Lamport,我最屌. 1. 简介 用于 ...

  9. [IR] Bigtable: A Distributed Storage System for Semi-Structured Data

    良心博文: http://blog.csdn.net/opennaive/article/details/7532589 这里只是基础简述 众人说: 链接:http://blog.csdn.net/o ...

随机推荐

  1. iPad Pro 如何通过 USB-C 接口外接机械键盘

    iPad Pro 如何通过 USB-C 接口外接机械键盘 外接机械键盘 Type-C Dock OK,cnblogs 图片文件不能超过20M https://support.apple.com/zh- ...

  2. GitHub Learning Lab

    GitHub Learning Lab https://lab.github.com/ https://github.community/t5/GitHub-Learning-Lab/bd-p/lea ...

  3. RocketMq灰皮书(三)------MQ使用

    RocketMq灰皮书(三)------MQ使用 在使用MQ之前,我们回顾一下前两篇博文的内容. 我们大致了解了RocketMQ的四个概念,分别是:Producer,Consumer,Message和 ...

  4. 2018-1-6-IDEA快速代码生成

    2018-1-6-IDEA快速代码生成 Java 自动生成 Intellij IDEA 利用IDEA编辑器的Live Templates可以实现自定义方法.属性.注释等,下面是我自己的常用模板. 属性 ...

  5. Elasticsearch---DSL搜索实践

    Domain Specific Language 特定领域语言,基于JSON格式的数据查询,查询更灵活,有利于复杂查询 一.普通url路径参数搜索 数据准备 1.建立名字为 shop 的索引 2.手动 ...

  6. 别再恐惧 IP 协议(万字长文 | 多图预警)

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  7. C#正则实现匹配一块代码段

    最近项目,生成聚合网关,但是生成的网关文件中,存在着不必要的代码段,比如一个类A,类B等 之前一直使用手动删除,这么做劳民伤财,浪费时间,考虑使用正则写一个工具实现自动删除. 正则写法: string ...

  8. HDOJ-2222(AC自动机+求有多少个模板串出现在文本串中)

    Keywords Search HDOJ-2222 本文是AC自动机的模板题,主要是利用自动机求有多少个模板出现在文本串中 由于有多组输入,所以每组开始的时候需要正确的初始化,为了不出错 由于题目的要 ...

  9. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  10. 2020年HTML5考试模拟题整理(二)

    1.以下是HTML5新增的标签是: AA.<aside>B.<isindex> C. <samp>D.<s>2.以下不是HTML5的新增的标签是: BA ...