一致性问题要求多个process对一个值达成一致。基于消息传递的分布式系统中,在不考虑消息篡改等拜占庭错误的情况下,Paxos可以解决在进程退出,消息延迟,丢失,重复等异常发生的环境中对某个值达成一致的问题。

考虑Paxos最基本的形式:

两个角色:Proposer和Acceptor,Proposer提出Value(决议值),Acceptor处理是否Accept Value

两个阶段:Prepare和Propose,第一阶段Prepare用于确认第二阶段的Value,第二个阶段Proposer请求Acceptor Accept Value

每个参与Paxos协议的server可以同时担任两个角色。当一个Value被majority的server Accept,则这个Value达成一致。

Acceptor的状态:MaxAcceptRoundNumber,Accept的最大的轮次号,MaxPrepareRoundNumber,Promise(回复PrepareReq OK)的最大的轮次号

RoundNumber全局唯一。轮和轮之间是并行的。每一轮都有一个coordinator,即发送proposal的server。

算法

Prepare阶段:

Proposer给所有Acceptor发送PrepareReq(RoundNumber)请求,

如果Acceptor的max(MaxAcceptRoundNumber, MaxPrepareRoundNumber)大于RoundNumber,则拒绝PrepareReq(RoundNumber)。Proposer接收到拒绝请求,直接选择一个新的round number,进入下一轮的Prepare阶段。

如果Acceptor的max(MaxAcceptRoundNumber, MaxPrepareRoundNumber)小于RoundNumber,则Promise该PrepareReq(RoundNumber),更新本地的MaxPrepareRoundNumber为RoundNumber,并且发送PrepareRes(MaxAcceptRoundNumber,Value)给Proposer。

Accept阶段:

Proposer接收到了majority的Acceptor的PrepareRes(MaxAcceptRoundNumber,Value)后,从所有接收到的PrepareRes中选出最大的MaxAcceptRoundNumber对应的Value,然后发送AcceptReq(RoundNumber,Value)给所有的Acceptor。Accept接收到AcceptReq (RoundNumber,Value)后,如果max(MaxAcceptRoundNumber, MaxPrepareRoundNumber) 大于RoundNumber,则拒绝AcceptReq(RoundNumber,Value),否则更新本地的MaxAcceptRoundNumber为RoundNumber,并且Accept AcceptReq(RoundNumber,Value)。如果Proposer接收到majority的Acceptor回复没有Accept过任何AcceptReq,则Proposer任意选择一个Value,并且给所有的Acceptor发送AcceptReq(RoundNumber,Value)。收到majority的AcceptRes后,给所有的Acceptor发commit消息。

算法的正确性的证明关键在于证明:

如果有AcceptReq(m,Vm) 第一次被majority的Acceptor Accept,则对于AcceptReq(j, Vj),j > m -> Vj=Vm

证明

数学归纳法:

  1. 对于j = m, 显然Vj=Vm
  2. 假设j = k, k > m,有Vk = Vm,即第[m,k]轮AcceptReq(j, Vj) 都有Vj=Vm 。只需要证明j = k+1,有Vk+1=Vm

i用来索引Acceptor

显然第k+1轮能够发出AcceptReq(k+1,Vk+1),说明第k+1轮成功的收到了majority的PrepareRes(Xi, Vxi),由于Prepare阶段的限制,显然xi < k+1,即xi <= k,从而max(Xi) <= k。由于Accept阶段的限制,只能Accept比本地已经Accept的Req更大的,由于m已经被majority Accept了,故至少有一个PrepareRes(Xi,Vxi)中的Xi >= m, 从而max(Xi) >=m

综上所述有,对于第k+1轮来说,有 m <= max(Xi)<= k,又由于h ∈[m,k]轮的所有的AcceptReq(h,Vh)都有Vh=m(数学归纳法的假设),即第h轮收集到的PrepareRes中最大的AcceptRoundNumber对应的value(即 Vh)是m,故AcceptReq(k+1, Vk+1)的Vk+1=Vm ,得证。

参考文献

Paxos made simple

Fast Paxos

Paxos可容错的一致性协议的更多相关文章

  1. 从Paxos到Zookeeper 分布式一致性原理与实践读书心得

    一 本书作者介绍 此书名为从Paxos到ZooKeeper分布式一致性原理与实践,作者倪超,阿里巴巴集团高级研发工程师,国家认证系统分析师,毕业于杭州电子科技大学计算机系.2010年加入阿里巴巴中间件 ...

  2. Quorum一致性协议

    Quorum一致性协议 一个分布式数据库系统中通常是一系列密切关联的操作组成完整的系统. 分布式系统最基本的要保证一致性, 分区性通常是无法避免的, 在这种情况下尽力通过软件协议做到最大可用性. 根据 ...

  3. [从Paxos到ZooKeeper][分布式一致性原理与实践]<二>一致性协议[Paxos算法]

    Overview 在<一>有介绍到,一个分布式系统的架构设计,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是产生了一系列的一致性协议. 为解决分布式一致性问题,在长期的探索过程中 ...

  4. 搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法

    搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法 2PC 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议.其中比较著名的有二阶提交协议(2 Phas ...

  5. Paxos,Raft,Zab一致性协议-Raft篇

    Raft是一个一致性算法,旨在易于理解.它提供了Paxos的容错和性能.不同之处在于它被分解为相对独立的子问题,它清楚地解决了实际系统所需的所有主要部分.我们希望Raft能够为更广泛的受众提供共识,并 ...

  6. 五:分布式事务一致性协议paxos的应用场景

    1.应用场景 (1)分布式中的一致性 Paxos算法主要是解决一致性问题,关于“一致性”,在不同的场景有不同的解释: NoSQL领域:一致性更强调“能读到新写入的”,就是读写一致性数据库领域:一致性强 ...

  7. 图解 Paxos 一致性协议

    转自:http://blog.jobbole.com/106327/ 前言 Paxos 一致性协议可以说是一致性协议研究的起点,也以难以理解闻名.其实协议本身并没有多难理解,它的难理解性主要体现在:为 ...

  8. 分布式系统理论:一致性协议Paxos

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法. Paxos 算法是一个解决分布式系统中,多个节点之间就某个值(注意是某一个值,不是一系列 ...

  9. [转帖]分布式一致性协议介绍(Paxos、Raft)

    分布式一致性协议介绍(Paxos.Raft) https://www.cnblogs.com/hugb/p/8955505.html  两阶段提交 Two-phase Commit(2PC):保证一个 ...

随机推荐

  1. Android 开发工具类 11_ToolFor9Ge

    1.缩放/ 裁剪图片: 2.判断有无网络链接: 3.从路径获取文件名: 4.通过路径生成 Base64 文件: 5.通过文件路径获取到 bitmap: 6.把 bitmap 转换成 base64: 7 ...

  2. XMind *思维导图的安装步骤(图文详解)

    不多说,直接上干货! XMind中文官网:  http://www.xmindchina.net/ 这一款软件,是非常实用和棒,也帮助我了很多地方.推荐给大家 需要正版和激活的,请见博文最下端的QQ技 ...

  3. Chapter 3 Phenomenon——3

    It took every ounce of my concentration to make it down the icy brick driveway alive. 我用所有我的注意力去确定车道 ...

  4. Redis笔记(六):Java中使用Redis

    Java程序使用Redis 添加依赖包 Maven依赖方式 <dependency> <groupId>redis.clients</groupId> <ar ...

  5. C#对json数据的解析

    一,基础知识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...

  6. Beta阶段——Scrum 冲刺博客第五天

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 完成部分answer界面的制作,将题目与用户输入的答案.正确答案依次列出来 ...

  7. 【WePY小程序框架实战一】-创建项目

    最近两个小程序项目使用了微信自己出的框架wepy开发,开发完的感受就是比原生小程序顺溜很多.我就从安装到一些重点和整个项目把wepy使用整理下 全局安装WePY命令行工具 npm install we ...

  8. jQuery通过input标签的name获取值

    jquery根据name属性查找 $("div[id]") 选择所有含有id属性的div元素 $("input[name='keleyicom']") 选择所有 ...

  9. Java基础之Object类

    类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...

  10. maven配置Mac平台

    Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录.例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven cl ...