Paxos共识算法
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共识算法的更多相关文章
- 诸葛 VS 庞统,拿下 Paxos 共识算法
前言 分布式确实是一个有趣的话题,只要你留心观察,分布式在生活中无处不在. 悟空哥最开始学习分布式是从一篇非常用心写的技术征文开始的,而且这篇文章获得了征文第一名,在此感谢掘金社区提供的平台.想学习的 ...
- 分布式共识算法 (二) Paxos算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...
- 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...
- Paxos分布式系统共识算法?我愿称其为点歌算法…
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 分布式系统共识算法Paxos相信大家都不陌生,它被称为最难理解的算法不是没有道理的,首先,它的发表之路就充满了坎 ...
- [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...
- raft共识算法
raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...
- 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html
Hyperledger Fabric共识算法 区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本.在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟 ...
- 共识算法:PBFT、RAFT
转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...
- 分布式共识算法 (四) BTF算法(区块链使用)
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 前面介绍的算法,无论是 Paxos ...
随机推荐
- python range函数与numpy arange函数,xrange与range的区别
转自:https://www.cnblogs.com/ymjyqsx/p/6426764.html 1.range()返回的是range object,而np.arange()返回的是numpy.nd ...
- Vue2.5开发去哪儿网App 从零基础入门到实战项目
第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...
- FFMpeg笔记(一) 使用FFmpeg将任意格式图片转换成任意格式图片
void SrcToDest(char* pSrc, char* pDest,unsigned int nSrcWidth, unsigned int nSrcHeight, AVPixelForma ...
- springboot activiti 整合项目框架源码 druid 数据库连接池 shiro 安全框架
官网:www.fhadmin.org 工作流模块---------------------------------------------------------------------------- ...
- javascript中个别方法注意事项
1.键值对new Array()的length值只统计下标是数字的键,可以使用for(var key in arr)的方式进行遍历所有元素.例如 <script type="text/ ...
- 三、用Delphi10.3 创建一条JSON数据的第三种方法,非常简洁的写法
一.用Delphi10.3构造一个JSON数据的第三种方法,并格式化输出,代码如下: uses // System.JSON, System.JSON.Types, System.JSON.Write ...
- 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586)
习题 3-3 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586) 给出一种物质的分子式(不带括号),求分子量.本题中的分子式只包含4种原子,分别为C,H,O,N, ...
- 利用IPC通道进行进程间通信(C#)
有一个解决方案,其中包括一个Windows服务和一个Windows应用程序,两者之间需要进行通信.查了下,可以使用多种方法,如Web service(适用于不同系统及跨平台情况)..NET Remot ...
- 【SDOI2011】工作安排
题面 题解 如果没有分段函数的限制的话就很好做了 但是我们发现分段函数的段很少,我们就可以将每一段拆开, 强制限制一定流量就可以了 代码 #include<cstdio> #include ...
- SpringCloud-微服务网关ZUUL(六)
前言:前面说过,由于微服务过多,可能某一个小业务就需要调各种微服务的接口,不可避免的就会需要负载均衡和反向代理了,以确保ui不直接与所有的微服务接口接触,所以我们需要使用一个组件来做分发,跨域等各种请 ...