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. codeforce447 D SGU 548 贪心+优先队列

    codeforce447 D - DZY Loves Modification 题意:有一个n*m的矩阵,每次可以选择一行或者一列,可以得到这行或这列的所有元素sum的积分,然后使这一列/行的每一个元 ...

  2. 随意一条查询sql转换为查询结果集相应的数目

    原思路: 像括号配对一样,假设遇见select 就入栈,假设遇见from就出栈,直到栈为空,取得此时的位置.进行字符串截取. 实现方法:遇见字符s而且连续后5个字符elect 就+1,遇见字符f而且连 ...

  3. ios开发——实用技术OC篇》倒计时实现的两种方法

    倒计时实现的两种方法 timeFireMethod函数,timeFireMethod进行倒计时的一些操作,完成时把timer给invalidate掉就ok了,代码如下: secondsCountDow ...

  4. android138 360 小火箭

    package com.itheima52.rocket; import android.app.Service; import android.content.Context; import and ...

  5. perl详解

    http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html

  6. Word2010编号列表&多级列表

    1.引用场景         对于一份标准.漂亮的word文档,编号列表和多级列表的设置时必不可少的,正因为有它们,文档看起来才更专业,使用起来才更加的方便.如下面截图一般,这是十分常见的多级列表设置 ...

  7. 20种常用的DOS命令小结

    先介绍一下通配符的概念. 通配符*和? *表示一个字符串 ?只代表一个字符 注意通配符只能通配文件名或扩展名,不能全都表示.例如我们要查找以字母y开头的所有文件,可以输入以下命令:dir y*.*:如 ...

  8. Kruskal算法 Swordfish

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=203 Swordfish Time Limit: 2 Seconds      ...

  9. Fliptile

      开关题   尺度法  Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3394   Accepted:  ...

  10. Android(java)学习笔记89:泛型概述和基本使用

    package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * ArrayList存储字符串并遍历 ...