Paxos共识算法


paxos是一族用来解决分布式系统共识的基础算法,共识过程就是在一组节点上达成一个一致的结果。由于节点可能会错误,通讯消息也可能会丢失,所以建立共识是一个比较复杂的过程。

paxos算法的假定

Processors(可理解为节点)

  • Processor以任意速度运行
  • Processor可能会出错
  • Processor失败失败后会重新配置恢复到网络中
  • Processor不会撒谎或者是违反协议,即不会发生拜占庭错误

Network

  • 一个节点可以给任何其他节点发送消息
  • 消息可以被异步发送,传输过程可以花费任意时间
  • 消息可能会丢失、重复或者是顺序错乱
  • 消息在传输过程中不会被篡改、破坏,即不发生拜占庭错误

节点数量

一般情况下,共识算法用\(2f+1\)各节点,以保证\(f\)个节点发生错误时,系统依然可以正常运作。

Roles(角色)

Paxos算法中根据不同节点的行为将其分为不同的角色:client、proposer、acceptor、learner、leader。在算法实现中,一个节点可以承担一个或多个角色。

  • Client

    Client向分布式系统发起一个请求,并等待回应。比如,在分布式文件系统中,发起一个写文件的请求。

  • Acceptor

    Acceptor被分成组(Quorum),每个组中包含大多数的Acceptor。任何发送给某个acceptor的消息,都必须给组内的任意节点都发该消息。如果一个acceptor收到一个消息,但是该消息的副本没有发送给组内所有的acceptor,那么该消息将会被忽略。

  • Proposer

    提出一个倡议的值,并试图让acceptor在该值达成一致,当出现冲突时,会承担一个协调者的角色

  • Learned

    当达成一致时,动作的执行者。当一个client的请求,被acceptor一致接收,那么learner会执行该请求,并返回。

  • Leader

    一个卓越的Proposer用来推进达成共识的过程。很多节点都可能认为他们自己是leader。

Quorums

理解为一个组,这个组里包括了大多数(超过半数)的acceptor,这样任何两个Quorum都会至少有一个共同的节点。比方说,节点{A,B,C,D}中,然和三个节点都可以组成一个Quorum。可以给每个节点一个权重,一个Quorum中所有节点的权重之和大于50%。

Basic Paxos

共识的过程一般是这样的,client向分布式系统发起一个请求,然后proposer将该请求(proposal)发送给acceptor,当取得一致时候,learner来执行请求。

Proposal的形式是这样的,用一个整数N表示其ID,每个节点发出的proposal的ID是不断增大的,然后proposal的提议值用value表示。

共识过程的建立有以下四个步骤完成

1. Prepare

Proposer先将proposal的ID(用N表示)发送给一个Quorum的acceptor(即发送给大多数节点)。

2. Promise

Acceptor收到Prepare消息,如果消息中的N是目前为止收到的最大的值,那么就会返回一个Promise消息。如果之前有收到更大的N值,那么本次收到的Prepare消息便被忽略。如果本Acceptor节点之前有接受的proposal,那么会在返回的promise消息上,加上之前已接收的proposal的N与value值。

3. Accept Request

如果Proposer收到足够多的promise,那么就需要给该proposal设置value值。如果在收到的promise消息中,有已经被Acceptor接受的proposal,那么会从中选出N值最大的proposal,并用其中的value值设置本次proposal。

然后proposer给一个Quorum的Acceptor发送“Accept Request”消息,消息中包含了本次proposal的ID及value。

4. Accepted

当一个Acceptor收到一个“Accept Request”消息时,只要改accept还没有promise更大的ID的proposal,那么就必须接受该proposal。注册该proposal的Value值,发送一个Accepted消息给Proposer和每一个Learner。

需要注意的是,Acceptor可以接受proposal,这些proposal可能有着不一样的value值。但是,Paxos协议可以保证最终只会在一个值上达成一致。

Paxos过程的消息流程如下图所示:

Client   Proposer      Acceptor     Learner
| | | | | | |
X-------->| | | | | | Request
| X--------->|->|->| | | Prepare(1)
| |<---------X--X--X | | Promise(1,{Va,Vb,Vc})
| X--------->|->|->| | | Accept!(1,Vn)
| |<---------X--X--X------>|->| Accepted(1,Vn)
|<---------------------------------X--X Response
| | | | | | |

Paxos共识算法的更多相关文章

  1. 诸葛 VS 庞统,拿下 Paxos 共识算法

    前言 分布式确实是一个有趣的话题,只要你留心观察,分布式在生活中无处不在. 悟空哥最开始学习分布式是从一篇非常用心写的技术征文开始的,而且这篇文章获得了征文第一名,在此感谢掘金社区提供的平台.想学习的 ...

  2. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  3. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...

  4. Paxos分布式系统共识算法?我愿称其为点歌算法…

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 分布式系统共识算法Paxos相信大家都不陌生,它被称为最难理解的算法不是没有道理的,首先,它的发表之路就充满了坎 ...

  5. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...

  6. raft共识算法

    raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...

  7. 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html

    Hyperledger Fabric共识算法 区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本.在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟 ...

  8. 共识算法:PBFT、RAFT

    转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...

  9. 分布式共识算法 (四) BTF算法(区块链使用)

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 前面介绍的算法,无论是 Paxos ...

随机推荐

  1. Day6 重载构造

    带参数方法 [1]无参数,无返回值 void 方法名(){方法体:} [2]无参数,有返回值 int 方法名(){方法体:} [3]有参数,无返回值 void 方法名(int num){方法体:} [ ...

  2. Python自动化之django orm之Q对象

    Python自动化之django orm之Q对象 什么是Q对象? Encapsulates filters as objects that can then be combined logically ...

  3. 【转】np.linspace()、np.logspace()、np.arange()

    转自:https://blog.csdn.net/ui_shero/article/details/78881067 1.np.linspace() 生成(start,stop)区间指定元素个数num ...

  4. SVN提交的动作解释

    今天更新svn,发现有很多动作,其中字母代表的意思半知半解,就随手记录下来: A:add,新增 C:conflict,冲突 D:delete,删除 M:modify,本地已经修改 G:modify a ...

  5. 知乎live考研数学冲刺135+资料分享

    前言 各位学弟学妹,您好,live中本来是给出了我的邮箱,通过邮箱来获取资料,但是没有想到,后来我每天打开邮箱,都是需要回复的邮件,少则一两封,多则四五封,每天如此,也是一个比较繁琐费时的方式.我决定 ...

  6. 面向对象之this关键字

    方法之间调用,可以通过方法名进行调用.但构造方法,无法通过构造方法名来相互调用. 构造方法之间的调用,可以通过this关键字来完成. l  构造方法调用格式: this(参数列表); l  构造方法的 ...

  7. MySQL的安装步骤

    MySQL5.6.43下载地址:链接: https://pan.baidu.com/s/1v0HZU_OnDClNxd5QIKDRMg 提取码: jy9s 1.解压mysql-5.6.43-winx6 ...

  8. 简单利用Clover四叶草安装U盘安装黑苹果

    配置是I5-7600K+技嘉Z270X-UD3+GTX 1050+简单利用Clover四叶草安装U盘安装黑苹果 <ignore_js_op><ignore_js_op> 成功黑 ...

  9. 微信支付JsApi 40163错误

    微信支付JsApi 40163错误错误:未定义数组索引:openid .经过检查发现是 :微信支付授权获取 openId {“errcode”:40163,“errmsg”:“code been us ...

  10. pandas对excel处理过程中的总结

    在处理excel数据时需要将一组具有相同标签值的数据给按标签抽取出来,同样的标签值对应着同一个类别,这项操作让我对pandas的聚合功能有了更深刻的认识. 所谓聚合groupby,实际上是指将向量或者 ...