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 ...
随机推荐
- Solr服务在Linux上的搭建详细教程
一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...
- PCB布线经验
查看: 3645|回复: 11 [经验] PCB设计经验(1)——布局基本要领 [复制链接] ohahaha 927 TA的帖子 0 TA的资源 纯净的硅(中级) 发消息 加好友 电 ...
- 【js】按下enter键禁止表单自动提交
//enter键盘事件 document.onkeypress=function(){ if(event.keyCode==13){ return false; } }
- Scala集合学习总结
遍历集合可以使用迭代器iterator的那套迭代方式.Seq是一个有先后次序的序列,比如数组或列表.IndexedSeq可以通过下标进行任意元素的访问.例如ArrrayBuffer. Set是一组没有 ...
- JavaEE笔记(八)
第一个Spring Student(学生) bean package com.my.bean; import java.io.Serializable; public class Student im ...
- easybcd删除win10启动项如何恢复?
制作windows启动盘: u盘启动 开始安装,选择左下角的"修复计算机": 运行命令 bcdboot c:\windows /l zh-cn 从系统盘C:\Windows目录中复 ...
- cogs 1330 [HNOI2008]玩具装箱toy
cogs 1330 [HNOI2008]玩具装箱toy 瞎扯,急忙AC的请跳过 感觉数据结构写的太多了有点晕=+ 发现还没学斜率优化+- 于是来学一学QwQ 上次这题打了个决策优化直接水过了..理论O ...
- Spring boot jpa @Column命名大小写问题
一.问题 驼峰命名会被自动转成数据库下划线命名,指定@Column的name也不起作用 举例: @Column(nullable = false,name = "resolvedDate&q ...
- Linux常用系统命令大全
最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...
- 【搭建RAC报错】搭建RAC,第二个节点执行root.sh报错:CRS-2800、CRS-4000
Creating /etc/oratab file...Entries will be added to the /etc/oratab file as needed byDatabase Confi ...