Paxos算法
Paxos算法是分布式系统中常用的一个保持系统一致性的算法,由美国计算机科学家Leslie B. Lamport提出。原文链接。 今天特意学习了一下Paxos的原理,为防忘记,记录下来。(看了的东西没过几天会忘的精光 T_T 。。)
1. 算法要解决的问题
在一个系统中有多个独立的提案者,他们的地位是平等的,都可以就某一问题提出自己的提案(proposal),系统也不存在一个居中的仲裁者来决定采纳哪个。那么如何保证系统最终采纳一个唯一的提案,并且使得每个提案者都获悉这个被采纳的提案呢。Paxos算法要解决的就是这个问题。
一个常用的场景是分布式系统中的leader选举。
2. 算法描述
2.1 三个抽象角色
Proposer 提案者
负责提出议案,并告知acceptorAcceptor 临时决议者
暂决并暂存提案,并为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算法的更多相关文章
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- Zookeeper学习之:paxos算法
paxos算法的重要性众所周知,它给如今的分布式一致性提供了迄今为止最好的解决方案.无论是Lamport自己的论文描述,还是网上的诸多资料,对paxos的描述都是及其简洁的,给人的感觉是paxos看似 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- [译] Paxos算法详解
1. 概述 Paxos算法被用来实现一个容错的分布式系统,一直以来以晦涩难懂著称.这可能是因为该算法最开始使用希腊文表述的.事实上,它是所有分布式算法中最简单易懂的.Paxos算法的本质其实就是一个共 ...
- Paxos算法与Zookeeper分析
1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...
- Ceph剖析:Paxos算法实现
作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...
- Paxos算法细节详解(一)--通过现实世界描述算法
Paxos分析 最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bit ...
- 一定要学会paxos算法!
paxos算法 http://blog.csdn.net/dellme99/article/details/14162159
- [转] Paxos算法2-算法过程(实现)
请先参考前文:Paxos算法1 1.编号处理 根据P2c ,proposer在提案前会先咨询acceptor查看其批准的最大的编号和value,再决定提交哪个value.之前我们一直强调更高编号的pr ...
随机推荐
- zoj3672 Gao The Sequence
原地踏步了半年,感觉一切都陌生了~ 题意:a[i]-一个任意的数,这个数要等于a[1]~a[i-1]每个数减去任意一个数,经过多次这样的变换到达目标b序列,能到达就yes不能到达距no. 一开始各种分 ...
- thinkphp中的分表方法
public function getPartitionTableName($data=array()) { // 对数据表进行分区 if(isset($data[$this->partitio ...
- 【ZZ】MySql语句大全:创建、授权、查询、修改等
http://blog.csdn.net/evankaka/article/details/45580845
- iOS利用单例实现不同界面间的数据传输
首先写一个单例类,继承NSObject check.h文件中 @property(strong ,nonatomic) UITable * Table; @property(strong ,nonit ...
- textarea 中的换行符问题
下面是我对这个问题的解决过程,最后算是完全搞懂了,真是阴沟里险些翻船 1.必须知道textarea中的换行符是 \n (个人检测发现按回车键是\n,好像在linux下是\r\n) 2.用nl2br之 ...
- 利用 Composer 一步一步构建自己的 PHP 框架(二)——构建路由
本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 上一篇中我们已经建立了一个空的 Composer 项目 ...
- Spket在Eclipse/MyEclipse下的安装和配置支持Ext(图文教程)
一.安装Spket 第一种方法:网上更新方式 1.插件首页:http://www.spket.com2.插件名称:Spket IDE3.更新连接(Update Site):http://www.spk ...
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。
var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...
- Objective-C基础笔记一
这里开始了我OC旅程 花了8天的时间粗略的学习了新知识Objective-C(简称OC),虽然只是学习了其中的基础部分,但经过这一周的学习也算是入门了.对面向对象的封装.继承.多态以及其中所包含的方法 ...
- oracle11g asm standalone 单实例重建
原文地址:oracle11g asm单实例重建has 作者:datapeng 最近到客户那里处理故障,客户说,他们修改了一下hostname,导到has出现了问题,当然,他们的数据库也就无法再启动,把 ...