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. CentOS7.2安装mysql

    1. 下载Mysql yum包 http://dev.mysql.com/downloads/repo/yum/ 复制链接使用wget下载 wget http://repo.mysql.com/mys ...

  2. HDU 2141 Can you find it? (二分)

    题目链接: Can you find it? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/ ...

  3. 笔记:long、longlong、int、float、NSString相互转换

    NSString *"; // 1.字符串转int int intString = [string intValue]; // 2.int转字符串 NSString *stringInt = ...

  4. 第二章 Js语法

    来博客园已经有二年了,看了看自己发布的内容,少的可怜.完全背离了自己的初衷.how time fly,想着自己两年后,还是没写什么东西,岂不是白白浪费时间!有感于王宝强说的那句话,“好好活着,做有意义 ...

  5. Nivo Slider用法

    示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. MongoDB初学笔记(1)

    学习目标 理解MongoDb的特点和体系结构 掌握常用的MongoDB命令 MongoDB是一种介于关系数据库和非关系数据库中的一种数据库.它支持的数据结构非常松散,类似于JSON的BJSOn格式,所 ...

  7. 用NI的数据采集卡实现简单电子测试之2——绘制三极管输出特性曲线(面)图

    本文从本人的163博客搬迁至此. 想设计几个实验,既能展示NI的LabVIEW和数据采集卡的功能特点,又能够让普通电类专业本科学生可以理解,自然首先想到了<电子技术基础>课程的内容.第一个 ...

  8. VB6 XArrayDB | Xarray ReDim 用法

    用法解释 官方解释:http://helpcentral.componentone.com/nethelp/truedblist8/default.htm#!redimmethodxarraydb.h ...

  9. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  10. 成都Uber优步司机奖励政策(4月22日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...