Paxos算法概述 Paxos算法又被称为两阶段算法,请注意不是实现分布式事务的两阶段提交协议。Paxos算法的工作场景是基于CAP原理构建的分布式系统,是在这样的环境中如何高效率的达到数据的最终一致性;而两阶段/三阶段提交协议的工作场景是基于AICD原则的数据强一致性系统。 Paxos算法中有四个角色Client(议题产生者)、Proposer(正式提议者)、Acceptor(投票决策者)和Learner(最终结果学习者),这四个角色中Client和Learner角色是两个广义的概念,而真正完成算法的是Proposer角色和Acceptor角色,所以很多技术文章中都是重点讲解后两个角色的工作过程。Proposer角色是真正的提议发起者,负责发起提议投票、总结提议投票结果以及变更后发起新的投票;Acceptor角色是决策者,对于某个提案发表自己的投票结果,并交由Proposer角色进行处理,各个Acceptor角色都有自己的投票结果,不受其它Acceptor角色的影响。 总的来说Paxos算法在处理这样一个场景:当分布式系统中的多个Proposer对于某件事的结果不能达成一致时,就发起一个提案,由多个Acceptor负责进行投票并让多个Proposer对于这件事的结果达成最终一致。“这件事”可以是各种事情,例如“选主”,再例如K所代表的变量被同时赋予V1和V2两个值甚至更多的值,等等。这就是最终一致性的一种表现:每个Proposer对某件事情的判断过程可能在某段时间内可能是不一致的,但最终在客户端Client上呈现的结果将是一致的。 需要说明的是,Paxos算法最早由莱斯利·兰伯特(Leslie Lamport)提出,在他的论文中《The Part-Time Parliament》本来就介绍了Paxos算法的多种变体,加上在实际应用中各技术人员又加入了自己的理解,所以才出现了Paxos算法许多不一样的实现版本,但实际上这些算法版本中各角色的工作都有其处理原则,只要掌握了这些处理原则,理解Paxos就不难了。 Basic-Paxos算法理论 虽然说Paxos算法和两阶段提交协议的设计思路完全不一样,但前者借鉴了后者的一些思想——即分为准备阶段(Prapare)和赋值阶段(Accept) 。为了顺利的完成数据最终一致性这个工作目标,在整个工作过程中Proposer角色和Acceptor角色要分别保持以下的的工作原则: lProposer和Acceptor一个负责发起提议,一个负责响应提议。后者要尽量回复前者的每一个请求,无论这次请求根据Acceptor的处理原则是成功了还是失败了。如果Proposer在规定的时间内没有获得Acceptor的响应,则往最坏的情况来进行考虑。 l针对一个提议X的多轮投票,各个Proposer需要保证自己发起的后一轮投票轮次编号(vote)一定大于前一轮投票轮次编号。而各个Proposer不必保证自己的投票轮次是全局最大的,当然为了减少在第一阶段的授权冲突,也可以保证新的投票轮次全局最大(这个原因分析在后文中会详细讨论)。 l什么情况下针对一个议题X,Proposer不再发起新一轮投票并认为得到了最终一致的数据呢?当Proposer收集了各个Acceptor的最终投票值,并发现其中至少N/2 + 1个Acceptor的最终值都是V,则认为议题X的最终结果为V。实际上这个工作规则属于Proposer角色,但很多时候Proposer、Proposer、Acceptor都是一个应用程序。 l在Prapare阶段,Acceptor需要保证不接受投票轮次编号(vote)小于等于当前PrepareVote的投票轮次的授权(发起)申请。 l在Accept阶段,Acceptor需要保证不接受投票轮次编号(vote)小于当前PrepareVote的投票轮次的赋值申请。以上两条工作原则是最重要,为什么Pasox算法会有若干种变体呢?其原因就是在算法应用实现阶段,具体的算法实现在保证这两个基本工作原则下,为了提高工作效率而对实现过程进行微调。 Basic-Paxos算法过程 一、Prapare准备阶段首先需要介绍几个在Acceptor角色上需要被持久化保存的数据属性: lPrepareVote保存了当前Acceptor接收到的已完成投票授权的最大投票轮次 lAcceptedVote保存了当前Acceptor在赋值阶段完成投票赋值的投票轮次 lAcceptedValue保存了当前Acceptor在赋值阶段被赋予的值 1.第一个阶段Proposer和Acceptor至少要完成一次网络通讯,其主要目的是确定针对提议X的当前投票轮次是否能被授权。换句话说,根据Acceptor在准备阶段的工作原则,即使确定当前投票轮次的编号值是大于Acceptor中记录的PrepareVote的值。处理过程很简单,即Proposer向所有Acceptor发出关于发起提议X的新一轮投票的申请,并等待各个Acceptor进行响应。当然会有一个超时时间,如果超过这个时间还没有得到Acceptor的响应,则认为已经被拒绝。如果有超过N/2 + 1个节点在规定的时间内没有回复响应,那就说明整个选举系统发现了问题,则终止操作抛出错误,向客户端反馈异常信息。 (责任编辑:本港台直播) |