自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. npm & cli & node.js

    npm & cli & node.js https://www.npmjs.com/ https://www.npmjs.com/settings/xgqfrms/packages h ...

  2. GitHub Learning Lab

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

  3. Android Kotlin 数据驱动模板

    Android开发人员文档: 数据绑定入门 数据绑定库 生成的绑定类 布局和绑定表达式 1. 搭建环境build.gradle:app apply plugin: "kotlin-kapt& ...

  4. 15_MySQL·WHERE子句中条件执行的顺序

  5. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

  6. 010_HTML5

    目录 初识HTML 什么是HTML HTML发展史 HTML5的优势 W3C标准 常见IDE IDEA开发HTML IDEA创建HTML文件,并用浏览器打开 配置浏览器 HTML基础 HTML基本结构 ...

  7. InnoDB存储引擎——页和记录(行)

    一.InnoDB页 InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的.而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写 ...

  8. vue3中使用axios如何去请求数据

    在vue2中一般放在created中,但是在vue3中取消了created生命周期,请求方式有两种 直接在setup中去获取数据 setup(props) { const data = reactiv ...

  9. fastjson 请求dnslog

    目录 payload 利用java.net.Inet[4|6]Address 参考 Fastjson <= 1.2.47 远程命令执行漏洞利用工具及方法记录 payload rmi://.lda ...

  10. Nginx解析漏洞复现以及哥斯拉连接Webshell实践

    Nginx解析漏洞复现以及哥斯拉连接Webshell实践 目录 1. 环境 2. 过程 2.1 vulhub镜像拉取 2.2 漏洞利用 2.3 webshell上传 2.4 哥斯拉Webshell连接 ...