自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. React Native & CodePush & App Center

    React Native & CodePush & App Center https://docs.microsoft.com/en-us/appcenter/distribution ...

  2. how to delete the virtual dom that created in memory using js

    how to delete the virtual dom that created in memory using js const virtualDomConvert = (filename = ...

  3. c++ DWORD和uintptr_t

    x86模式 DWORD 是4字节 x86模式 uintptr_t 是4字节 x64模式 DWORD 是4字节 x64模式 uintptr_t 是8字节 std::cout << sizeo ...

  4. 【SpringMVC】 4.2 异常处理

    SpringMVC学习记录 注意:以下内容是学习 北京动力节点 的SpringMVC视频后所记录的笔记.源码以及个人的理解等,记录下来仅供学习 第4章 SpringMVC 核心技术 4.2异常处理   ...

  5. Spring 注解(二)注解工具类

    本文转载自Spring 注解(二)注解工具类 导语 首先回顾一下 AnnotationUtils 和 AnnotatedElementUtils 这两个注解工具类的用法: @Test @GetMapp ...

  6. Docker Tips: 关于/var/run/docker.sock

    本文转载自Docker Tips: 关于/var/run/docker.sock 导语 你可能已经运行过docker hub上的container并且注意到其中的一些需要绑定挂载(mount)/var ...

  7. 经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么

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

  8. 主键策略+mybayisPlus自动增长

    主键策略: 1.自动增长 有一点小缺陷:例如当一张表里的数据过于庞大时我们会进行分表操作,若是用自动增长策略,那么除了第一张表外的每一张表都必须知道上一张的表的的最后ID值.这个操作便会造成效率的变低 ...

  9. TERSUS无代码开发(笔记04)-CSS样式设置

    CSS样式设置 1.常用显示样式 大小尺寸 说明  间距边距 说明  各类颜色 说明  width 宽 margin 外边距         color  颜色        height 高 pad ...

  10. Vue学习笔记-Vue.js-2.X 学习(一)===>基本知识学习

    一  使用环境: windows 7 64位操作系统 二  IDE:VSCode/PyCharm 三  Vue.js官网: https://cn.vuejs.org/ 四  下载安装引用 方式1:直接 ...