Paxos算法是分布式系统中常用的一个保持系统一致性的算法,由美国计算机科学家Leslie B. Lamport提出。原文链接。 今天特意学习了一下Paxos的原理,为防忘记,记录下来。(看了的东西没过几天会忘的精光 T_T 。。)

1. 算法要解决的问题

在一个系统中有多个独立的提案者,他们的地位是平等的,都可以就某一问题提出自己的提案(proposal),系统也不存在一个居中的仲裁者来决定采纳哪个。那么如何保证系统最终采纳一个唯一的提案,并且使得每个提案者都获悉这个被采纳的提案呢。Paxos算法要解决的就是这个问题。

一个常用的场景是分布式系统中的leader选举。

2. 算法描述

2.1 三个抽象角色

  • Proposer 提案者
    负责提出议案,并告知acceptor

  • Acceptor 临时决议者
    暂决并暂存提案,并为Proposal的prepare阶段提供支持

  • Learner 状态检查者
    检测系统是否决策出一个提案(原文意思应该为获悉决策结果,感觉译为检测更符合他的行为),并告知其他learner

这三个角色都是抽象的,不是一个单独的进程。

2.2 何为选定一个提案?

原文的定义:

The value is chosen when a large enough set of acceptors have accepted it. How large is large enough? To ensure that only a single value is chosen, we can let a large enough set consist of any majority of the agents.

即系统的大部分acceptor接受了这个议案,可以将大部分定义为过半数。

2.3 算法过程

Phase 1. (a) A proposer selects a proposal number n and sends a prepare request with number n to a majority of acceptors.(b) If an acceptor receives a prepare request with number n greater than that of any prepare request to which it has already responded, then it responds to the request with a promise not to accept any more proposals numbered less than n and with the highest-numbered proposal (if any) that it has accepted.

Phase 2. (a) If the proposer receives a response to its prepare requests (numbered n) from a majority of acceptors, then it sends an accept request to each of those acceptors for a proposal numbered n with a value v, where v is the value of the highest-numbered proposal among the responses, or is any value if the responses reported no proposals.(b) If an acceptor receives an accept request for a proposal numbered n, it accepts the proposal unless it has already responded to a prepare request having a number greater than n.

  • 阶段一: (a)一个Proposer选取一个数字 n 作为一个提案的编号,然后向大部分acceptor发送一个prepare request 。(b) 如果一个acceptor收到一个prepare request ,提案的编号为n,并且n大于任何他所回复过的提案的编号,那么他将返回他已经接受了的最大编号的提案,并且承诺不会再接受任何编号小于n的提案。

  • 阶段二:(a) 当Proposer收到来自大部分acceptor的回复,他将向大部分acceptor发送一个accept request, 请求acceptor接受这个编号为n的提案。如果acceptor回复了所接受了的最大编号的提案,那么编号为n的提案的内容应该设置为Proposer所收到的编号最大的提案的内容,如果acceptor没有返回提案,那么由Proposer自己决定提案的内容。(b)当一个acceptor收到一个提案的编号为n的accept request ,如果该acceptor之前没有回复过一个编号大于n的提案,那么接受该提案。

阶段一和阶段二是主要的部分,在accept一个提案之后可以通知Learner检查一下系统是否选定了一个提案。如果已经选定就可以终止了。

3. 算法证明

要证明的问题有俩个:

  • 1.该方法确实会使得系统达成一致。
  • 2.当达成一致后,后续的proposal不会影响系统状态。即一旦达成一致后,后续的proposal都不可能改变系统已经达成的对某一问题的决议结果。

3.1 先论述第一个问题:

首先假设 系统不会进入原文 2.4 所描述的困境。那么首先多个Proposer提出提案,最初acceptor都未接受过提案,因此在最初肯定有一个或多个Proposer自行决定了提案的内容。(在阶段一可能有某些提案被acceptor丢弃)现在进入阶段二,Proposer请求大部分acceptor接受自己的提案。因为已经假设不会进入原文2.4描述的困境,那么阶段二之后肯定存在了已经接受了提案的acceptor。此时Learner检查系统是否已经选定一个提案,若已存在某一提案被大部分acceptor接受,那么不再提议新的提案,并将选定的提案告知其他Learner,Paxos过程结束。

若未选定,那么整个系统中肯定存在一个编号最大的提案,那么根据阶段二中描述的提案内容的决定方法,在后续的提议中这个编号最大的提案的内容将被不断扩散。(注意不是提案被扩散,只是其内容,一个提案应该由内容和其编号构成。) 可想而知,经过几轮提议之后该内容肯定会被大部分acceptor所接受。

实质上是三个过程:首先大家都提出一个提案,然后从中选择一个编号最大的提案,最后扩散这个提案的内容。扩散的时候不断赋予新的编号(编号是递增的)。

原文对于原文2.4所描述问题的解决方法是系统中设置一个Leader,只能由Leader提出proposal。这样确实解决了2.4描述的困境,不过私以为与最初描述的问题不符了。对此个人提出的解决办法是,将acceptor承诺不再接受编号小于n的提案改为在一段时间内不再受理新的prepare request,因此会使得一部分acceptor在某一时间内被一个proposer所独占,避免了2.4所描述的竞争囧态。

3.2 第二个问题证明

在之前已经论述了系统肯定会在某一个时刻达成共识。假设这个被选定的提案的编号为m 。现在假设编号 n-1的提案与编号m的提案具有相同的内容(n>m),证明编号为n的提案也具有相同的内容。(数学归纳法)

由于编号为n-1的提案被系统所选定,那么存在过半的acceptor接受了这个提案。现在产生提案n, 首先询问超半数的acceptor,acceptor返回已经接受了的编号最大的提案。因为过了半数,因此在返回的提案中肯定存在编号为n-1的提案,毫无疑问,该提案是所有返回的提案中编号最大的。那么新产生的编号为n的提案的内容设置为编号为n-1的提案的内容。然后发出accept request, 请求acceptor接受这个新的编号为n的提案。因为编号为n的提案的内容与编号为n-1的提案的内容一致,而n-1又与编号为m的提案的内容一致。所以整个系统所达成的共识并没有改变,反而增强了。

在假设部分并没有假设编号n-1的提案被系统选定,其实是被系统选定了的。令n=m+1,那么n-1即为m, 推得编号n的提案的内容也是被系统选定的内容。

Acceptor会舍弃编号小于已经接受的最大编号的提案,因此即使有多个Proposer,也可以保证提案的编号是不断变大的,可能不连续,但没影响。

3.3 为什么Acceptor要承诺不再接受编号小于n的提案?

To maintain the invariance of P2c, a proposer that wants to issue a proposal numbered n must learn the highest-numbered proposal with number less than n, if any, that has been or will be accepted by each acceptor in some majority of acceptors.Learning about proposals already accepted is easy enough; predicting future acceptances is hard.

这是原文的解释,即保证后续的proposal 不会改变已经选定的提案的内容,后续的proposal的内容应该优先设置为acceptor返回的编号最大的proposal的值(提案的内容),但是编号最大的提案可能已经被acceptor所接受,也可能将要被acceptor所接受。对于“将要”这种情况太难操作,预测未来是困难的,因此规定Acceptor需作出不会接受编号小于n的提案的承诺。

若出现编号大于n的提案仍然需要接受,因为此时可以认为编号为n的提案是过时的提案,可以被舍弃。

这篇博客是在原文的基础上写的,算是一个读后感,原文是循序渐进的,讲述了算法的不断完善的递进过程。建议先看原文

Paxos算法的更多相关文章

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

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

  2. 分布式理论之一:Paxos算法的通俗理解

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

  3. Zookeeper学习之:paxos算法

    paxos算法的重要性众所周知,它给如今的分布式一致性提供了迄今为止最好的解决方案.无论是Lamport自己的论文描述,还是网上的诸多资料,对paxos的描述都是及其简洁的,给人的感觉是paxos看似 ...

  4. 分布式数据库中的Paxos 算法

    分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...

  5. [译] Paxos算法详解

    1. 概述 Paxos算法被用来实现一个容错的分布式系统,一直以来以晦涩难懂著称.这可能是因为该算法最开始使用希腊文表述的.事实上,它是所有分布式算法中最简单易懂的.Paxos算法的本质其实就是一个共 ...

  6. Paxos算法与Zookeeper分析

    1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...

  7. Ceph剖析:Paxos算法实现

    作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...

  8. Paxos算法细节详解(一)--通过现实世界描述算法

    Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bit ...

  9. 一定要学会paxos算法!

    paxos算法 http://blog.csdn.net/dellme99/article/details/14162159

  10. [转] Paxos算法2-算法过程(实现)

    请先参考前文:Paxos算法1 1.编号处理 根据P2c ,proposer在提案前会先咨询acceptor查看其批准的最大的编号和value,再决定提交哪个value.之前我们一直强调更高编号的pr ...

随机推荐

  1. 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)

    今天修改一个bug,利用ajax查询数据,在谷歌浏览器下可以获取到最新数据,而在IE中获得是旧数据,无法获得最新的数据,经查资料,才发现时IE缓存再作怪. 发现此ajax请求用的get方式,每次请求的 ...

  2. [Ramda] Basic Curry with Ramda

    var _ = R; /***************************************** C U R R Y I N G E X A M P L E **************** ...

  3. iOS开发——实用篇Swift篇&保存图片到相册

    保存图片到相册 最近在深入的学习关于swift相关技术,虽然海做不出什么好的东西,但是感觉收获不少,相信总有一样能用到,所以就总结了一下,希望大家喜欢! 1.OC中的写法 在OC中,我们需要保存图片到 ...

  4. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  5. jQuery Pagination Ajax分页插件中文详解(转)

    一.相关demo 基本demo页面 Ajax demo页面 参数可编辑demo页面 二.简介与说明 此jQuery插件为Ajax分页插件,一次性加载,故分页切换时无刷新与延迟,如果数据量较大不建议用此 ...

  6. yii2 model源码解读

    模型yii\base\Model 模型主要实现了验证规则和验证器确保输入的数据是安全和正确的. 模型的流程: 1.从请求中读取数据.使用load或者loadMultiple或者手动赋值.load会根据 ...

  7. springMVC2 1入门程序

    1入门程序 .1需求 实现商品列表查询 .2需要的jar包 使用spring3.2.0(带springwebmvc模块) .1前端控制器 在web.xml中配置: <?xml version=& ...

  8. mysql修改表结构

    表 linksus_gov_running_trans 和 linksus_gov_running 的 is_mulsplit_id 字段需要改成 bigint(20)原:`is_mulsplit_i ...

  9. 用DAEMON TOOLS打开rational ross 的bin文件并安装过程梳理

    最近要开始准备毕业设计了,学习熟悉了一些UML用例图.类图之类的,开始准备用自家PC电脑画图的时候发现Rational Ross没安装. 本以为简单,却碰上bin文件.琢磨好久,终于把Ross安上了. ...

  10. 通过 Session 操纵对象

    Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. Session 具有一个缓存, 位于缓存中的对 ...