1 介绍

之前通过MIT6.824课程,我对Raft算法有了深度的理解,自然而然地也就对被誉为“世界上唯一的一致性算法”的Paxos产生的兴趣,这篇文章就是阅读算法论文后的总结。我阅读的文章是Paxos Made Simple,可以在这里阅读。同时这篇博客的图片以及部分内容参考了这篇博客。对于Paxos我也是初学,叙述有误的地方还请多多指教。

2 算法

2.1 算法出现背景

在传统的服务中,我们会让一个服务器去处理多个客户端的请求。当这个服务器宕机后,用户就要骂人,这时就要思变,同时使用多个服务器来应对复杂的情况,即使说有某些服务器不能工作,整个集群依然可以保证服务。为了实现这样一个思路,需要某种算法来保证集群中的服务器们在出现机器宕机或者网络异常的情况下快速正确地对某一个值达成共识,paxos是这些算法中被认为最有效的,这里说的值根据具体的系统会有所不同,比如在存储系统里它可能会是一个读/写命令。

2.2 算法相关概念

假设目前有一些进程可以在集群系统内部提出(propose)一个值,假如有很多值被提出来,一致性算法需要保证选出(choose)唯一的一个值。如果没有值被提出,就不需要选出值,一旦某个值被选中,所有这些进程就要获取(learn)这个值。Paxos对安全性提出了一些定义:

  • 只有被提出的值会被选中
  • 只会有一个值被选中
  • 只有选中的值会被进程获取

这些定义可能比较绕,但它为后面的推倒奠定了基础。
Paxos算法为每个进程定义了三种角色,每个进程都会扮演不止一个角色:

  • proposer : 提出一个值
  • acceptor : 判断proposer提出的值是否可接收
  • learner : 获取值

最后算法执行过程中,各个角色需要通过发送消息来通信,而且需要满足:

  • 每个角色以任意的速度执行,可能因出错而停止,也可能会重启。一个value被选定后,所有的角色可能失败然后重启,除非那些失败后重启的角色能记录某些信息,否则等他们重启后无法确定被选定的值。
  • 消息在传递过程中可能出现任意时长的延迟,可能会重复,也可能丢失。但是消息不会被损坏,即消息内容不会被篡改(拜占庭将军问题)。

以上概念叙述完毕可以进行进一步推导。

2.3 算法推导

选择值如前所述是一个很核心的问题,Paxos推导的方式是从最原始的方案出发,根据这种方案遇到的问题再增添一些约束,最终实现一种行之有效的方法。这个最原始方案就是使用一个唯一的acceptor来接收值,acceptor会接收它受到的第一个值。这个方案的问题在于这个唯一的acceptor可能会宕机,所以我们需要做出一些改进,那就是使用多个acceptor来接受值,同时我们要求一个值被propose后需要acceptor集合中的大多数接收后才能认为被选中了。我们将这个改进写成约束:

  • P1P1P1 : 一个acceptor必须接收它第一个收到的值

针对P1提出的改进,新的问题出现了,如图所示,出现出现多个值被提出,然后被不同的acceptor接收,出现没有一个值被大多数acceptor接收的情况。

新出现的问题如何解决呢?其实根据P1和大多数接收这一要求,我们可以让每个acceptor接收多个值,同时,我们需要将proposer直接提出值的操作升级为提出一个议案(proposal)。议案由议案号和值构成,写作<N,V>,其中议案号N是独一无二的,它也表示了议案提出的顺序。在这个基础上,我们提出第二条约束:

  • P2P2P2 : 如果某个值为v的value被选中,那么每个编号更高的被选定提案的value必须也是v

一个提案只有被Acceptor接受才可能被选定,因此我们可以把P2约束改写成对Acceptor接受的提案的约束P2a:

  • P2aP2^aP2a:如果某个value为v的提案被选定了,那么每个编号更高的被Acceptor接受的提案的value必须也是v

有了上面的约束,我们现在考虑一个情况,假定一个现在有一个从未接收过提案的acceptor,命名为c,而proposer在宕机一段时间恢复后发送了一个提案号较高,但是value不同的提案给c,根据P1,c会接收提案,但是这种情况与P2aP2^aP2a矛盾。
为了解决这个问题,我们需要对proposer的行为做约束,得到:

  • P2bP2^bP2b: 如果某个value为v的提案被选定了,那么之后任何Proposer提出的编号更高的提案的value必须也是v

上面这个约束如何保证?我们需要新的约束:

  • P2cP2^cP2c:P2c:对于任意的N和V,如果提案[N, V]被提出,那么存在一个半数以上的Acceptor组成的集合S,满足以下两个条件中的任意一个:
    1 S中每个Acceptor都没有接受过编号小于N的提案。
    2 S中Acceptor接受过的最大编号的提案的value为V。

基于上面的约束,我们现在要想出一个算法,当proposer提出一个议案号为n的议案时,议案的值必须是小于n且最大的的议案的值。Paxos提供了prepare请求算法来保证这一点:

  • Proposer选择一个新的提案编号N,然后向某个Acceptor集合(半数以上)发送请求,要求该集合中的每个Acceptor做出如下响应(response)。
    (a) 向Proposer承诺保证不再接受任何编号小于N的提案。
    (b) 如果Acceptor已经接受过提案,那么就向Proposer响应已经接受过的编号小于N的最大编号的提案。

  • 如果Proposer收到了半数以上的Acceptor的响应,那么它就可以生成编号为N,Value为V的提案[N,V]。这里的V是所有的响应中编号最大的提案的Value。如果所有的响应中都没有提案,那 么此时V就可以由Proposer自己选择。
    生成提案后,Proposer将该提案发送给半数以上的Acceptor集合,并期望这些Acceptor能接受该提案。我们称该请求为Accept请求。(注意:此时接受Accept请求的Acceptor集合不一定是之前响应Prepare请求的Acceptor集合)

接下来讨论一下acceptor的行为。它会收到两种请求,一种是prepare请求,一种是accept请求,对于这两种请求的约束,我们可以加一个约束:

  • P1aP1^aP1a:如果一个acceptor还没有响应过议案号大于n的prepare请求,那么它就可以接受议案号为n的acceptor请求。

最后谈一谈一个简单的优化,当一个acceptor收到一个议案号为n的prepare请求时,但它已经响应了一个大于n的prepare请求,这种情况下acceptor将不会回复任何议案号为n的请求。通过这个优化,acceptor需要记得两个变量(无论是宕机或是重启):

  • 它接受过的最大议案号
  • 已经响应过的最大议案号

2.4 算法流程

通过上面的推导,现在正式整理一下算法执行流程。这个算法分为两个阶段。

  • 阶段1
    a. proposer给半数以上acceptor发送议案号为n的prepare请求。
    b. 如果一个acceptor收到这个请求,议案号n大于它响应过的任何请求,它就会响应这个请求,承诺不会接受小于n的请求,而且会把它接受过的议案号最大的提案返回过去(如果有的话)。
  • 阶段2
    (a) 如果proposer的prepare请求(议案号为n)收到了一半以上acceptor的响应,他就会发送一个accept请求给响应的acceptor,这个accept请求的值是响应中议案号最大的议案的值。
    (b) 当一个acceptor收到议案号为n的accept请求,如果它没响应过议案号大于n的prepare请求,就接收这个请求。

2.5 获取被选择的值

前面算法流程里learner没有出现,现在我们考虑如何让learner来获取到取得一致的值。论文里提出了三种方案:

  • acceptor每次接收一个方案,就发送给所有learner。这样做的缺点是通信次数太高。
  • 选择一个主learner,由主learner来通知其他learner。这样做的缺点是主learner可能会挂
  • 使用一个learner集合来通知其他learner。

2.6 活锁问题

活锁问题是这样一个问题,假设目前有两个proposer,它们是p1和p2,由p1提出一个议案号为n1的议案,在prepare阶段获得半数以上acceptor响应,这是p2提出一个议案号为n2(n2 > n1)的议案,在prepare阶段获得半数以上acceptor响应,故p1的acceptor议案不会获得响应,它重发议案号n3的议案再次让n2失效…如此陷入死循环,称之为活锁。
活锁的解决也很简单,就是使用唯一的主proposer。至此,paxos算法的主要内容叙述完毕。

3 Paxos和Raft对比

通过上面的叙述,其实可以发现Raft与Paxos是高度等价的。算法中的角色对应关系如下:

  • Leader(Raft) : proposer,acceptor,learner
  • Follower(Raft) : acceptor,learner

Raft设计了自己的选举算法来保证主proposer正常工作,这一点在Paxos中没有给出一个具体的算法。至于Learner,很显然Raft采用的是由主learner来通知其他learner的方式,这个主learner就是Leader节点。怪不得paxos的作者被问到怎么看待Raft时说:"I don’t know of it"了,属实有底气。

Paxos算法论文总结相关推荐

  1. 共识算法论文——Paxos Made Simple

    基础概念 业界一般将 Lamport 论文里最初提出的分布式算法称之为 Basic Paxos,这是 Paxos 最基础的算法思想.Basic Paxos 算法的最终目标是通过严谨和可靠的流程来使得集 ...

  2. 深入浅出理解Paxos算法

    Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的「La」)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法. Paxos算法一开始非常难以理解,但是一 ...

  3. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  4. Raft 一致性算法论文译文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  5. 通俗理解Paxos算法

    维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...

  6. 微信PaxosStore:深入浅出Paxos算法协议

    引言 早在1990年,Leslie Lamport(即 LaTeX 中的"La",微软研究院科学家,获得2013年图灵奖)向ACM Transactions on Computer ...

  7. 一步一步理解Paxos算法

    一步一步理解Paxos算法 作者:jw (360电商技术组) 背景 Paxos算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lampo ...

  8. raft算法与paxos算法相比有什么优势,使用场景有什么差异?

    Raft协议比paxos的优点是 容易理解,容易实现.它强化了leader的地位,把整个协议可以清楚的分割成两个部分,并利用日志的连续性做了一些简化:(1)Leader在时.由Leader向Follo ...

  9. Raft 一致性算法论文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

最新文章

  1. linux 五种IO模型 简介
  2. gdb coredump
  3. 深入学习Redis(3):主从复制
  4. sdn和nfv的区别—Vecloud微云
  5. EOS账户系统(2)账户和钱包
  6. 文件名不能为null_色即是空,空即是色---java有关null的几件小事
  7. Codeforces 1375H Set Merging (分块)
  8. ARM平台YUV转RGB888(转)
  9. html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】
  10. Oracle数据库exp和imp方式导数据
  11. three.js 笑脸雨
  12. nc加载不了java,用友NC系统使用过程中常见问题和解决方法
  13. 安丘妇幼保健院智能照明监控系统的设计与应用-安科瑞耿敏花
  14. 解决idea导入项目中文乱码intellij
  15. 社区发现研究报告——基于信息熵和局部相关性的多标签传播重叠社区发现算法
  16. 如何申请CSDN博客专栏
  17. Jshop小程序商城系统说明
  18. 数据可视化(箱线图、直方图、散点图、联合分布图)
  19. 使用Busybox制作根文件系统
  20. kaggle竞赛官网注册邮箱验证码收不到

热门文章

  1. 服务不断迭代升级,九巨龙细节传爱意
  2. python openpyxl #Value!
  3. ecshop开发心得(简短篇)
  4. 高中英语话题阅读 计算机,高中英语说课稿:Unit 3 Computers Reading Task Who Am I ?
  5. idea不配置jdk也能运行_安装idea用配置jdk环境变量吗
  6. 【紧急警报】微信绑定手机号疑似存在安全漏洞,黑客可通过微信号获取用户手机号!
  7. 近邻传播 Affinity Propagation(AP) 聚类算法原理及实现
  8. 中国改名最成功的5所大学:改名如改命
  9. 荣耀magicwatch2鸿蒙,小猪搞机的评测 篇二十三:荣耀MagicWatch 2 上那些实用小功能盘点 功能还不是一般的丰富...
  10. 生成50道100以内加法/减法算式的习题_软件构造_羊卓的杨