一、算法提出背景

  Paxos算法需要解决的问题就是如何在一个可能发生诸如宕机或网络异常情况的分布式气筒中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。

二、问题描述

  假设有一组可以提出提案的进程集合,那么对于一个一致性算法来说需要保证一下几点:

  (1)在这些被提出的提案中,只有一个会被选定。

  (2)如果没填被踢出,那么久不会有被选定的提案。

  (3)当一个提案被选定后,进程应该可以获取被选定的提案信息。

  对于一致性来说,安全性需求如下:

  (1)只有被提出的提案才能被选定

  (2)只有一个值被选定

  (3)如果某个进程认为某个提案被选定了,那么这个提案必须是真的被选定的那个。

  在对Paxos算法的讲解过程中,我们不去精确地定义其活性需求,从整体上来说,Paxos的目标就是要保证最终由有一个天会被选定,当提案被选定后,进程最终也能获取到被选定的提案。

  在该一致性算法中,有三种参与角色,我们用Proposer、Acceptor和Learner来表示。在具体的实现中,一个进程可能充当不止一种角色,在这里我们并不关心进程如何映射到各种角色。假设不同参与者之间可以通过收发信息来进行通信,那么:

  (1)每个参与者以任意的速度执行,可能会因为出错而停止,也可能会重启。同时,即使一个天被选定后,所有的参与者也都有可能失败或重启,因此除非那些失败或重启的参与者可以记录某些信息,否则将无法确定最终的值。

  (2)消息在传输过程中可能会出现不可预知的延迟,也可能会重复或丢失,但是消息不会被损坏,即消息内容不会被篡改。

 三、算法陈述

  结合Proposer和Acceptor对提案的处理逻辑,就可以得到如下类似于两阶段提交的算法执行过程。

  阶段一

  1.Proposer选择一个提案编号M(n),然后向Acceptor的某个超过半数的子集成员发送编号为M(n)的Prepare请求。

  2.如果一个Acceptor收到一个编号为M(n)的请求的编号,那么他就会将它已经批准过得最大编号的天作为相应反馈给Proposer,同时该Acceptor会承诺不会再批准任何编号小于M(n)的提案。举个例子来说,假定一个Acceptor已经响应过的所有Prepare请求对应的天编号分别为1、2、...5和7,那么该Acceptor在接收到一个编号为8的Prepare请求后,就会将编号为7的提案作为响应反馈给Proposer。

  阶段二

  1.如果Proposer收到来自半数以上的Acceptor对于其发出的编号为M(n)的Prepare请求和响应,那么它就会发送一个针对[M(n),V(n)]提案的Accept请求给Acceptor。注意,V(n)的值就是收到的响应中编号最大的提案的值,如果响应中不包含任何提案,那么他就是任意值。

  2、如果Accept收到这个针对[M(n),V(n)]提案的Accept请求,只要改Acceptor尚未对编号大于M(n)的Prepare做出响应,他就可以通过这个提案。

  当然,在实际运行过程中,每一个Proposer都可能会产生多个提案,但只要每个Proposer都遵循如上所述的算法运行,就一定能够保证算法执行的正确性。值得一提的是,每个Proposer都可以在任意时刻丢弃一个提案,哪怕针对该提案的请求和响应在提案被丢弃后会到达,但根据Paxos算法的一系列规约,依然可以保证骑在提案选定上的正确性。事实上,如果某个Proposer已经在视图生成更大的提案,那么丢弃一些旧的提案未尝不是一个好的选择,因此,如果一个Acceptor因为已经收到过更大编号的Prepare请求而忽略某个编号更小的Prepare或者Accept请求,那么它也应当通知其对应的Proposer,以便该Proposer也能将该提案进行丢弃。

四、提案的获取

  在上文中,我们已经介绍了如何来选定一个提案,下面我们再来看看如何让Learner获取提案,答题可以有一下几种方案。

  方案一

    Learning获取一个已经被选定的提案的前提是,该提案已经被板书以上的Acceptor批准。因此,最简单的做法就是一旦Acceptor批准可一个天,就将该提案发送给所有的Learner。

    很显然,这种做法虽然可以让Learner尽快地获取被选定的提案,通知的次数至少为二者个数的乘积。

  方案二

    另一种可行的方案是,我们可以让所有的Acceptor将他们所提案的批准情况,统一发送给一个特定的Learner,在不考虑拜占庭将军问题的前提下,我们坚定Learner之间可以通过消息通信来互相感    知提案的选词能够情况。基于这样的前提,当主Learner被通知的一个提案已经被选定时,它会负责通知其他的Learner。

  方案三

    在讲解方案二的时候,我们提到,方案二最大的问题在于主Learner存在单点问题,即主Learner随时可能出现故障。因此,对方案二进行改进,可以将主Learner的范围扩大,即Acceptor可以将批准的的提案发送给一个特定的Learner集合,该集合中每个Learner都可以在一个提案被选定后通知所有其他的Learner。这个Learner集合中的Learner个数越多,可靠性就越好,但同时网络通信的复杂度也就越高。

五、通过选主Proposer保证算法的活性

  假设存在一个极端的情况,有两个Proposer依次提出了一系列编号递增的议案,但是最终都无法被选定,具体流程如下:

  Proposer P1提出一个编号为M1的提案,并完成了上述阶段一的流程。但是与此同时,另外一个Proposer P2提出一个编号为M2(M2>M1)的提案,同样也完成了阶段一的流程,于是Acceptor已经不再承诺批准编号小于M2的提案了。因此,当P1进入阶段二的时候,其发出的Accept请求将被Accept忽略,于是P1再次进入阶段一并提出了一个编号为M3(M3>M2)的提案,这又导致P2在第二阶段的Accept请求被忽略,以此类推,提案的选定过程将陷入死循环,如上图所示。

  为了保证Paxos算法流程的可持续性,以避免陷入上述提到的死循环,就必须选择一个主Proposer,并规定只有Proposer才能提出议案。这样一来,只要主Proposer和过半的Acceptor能够正常进行网络通信,那么但凡主Proposer提出一个编号更大的提案被提出或正在接受批准,那么他会丢弃当前这个编号较小的天,并最终能够选出一个编号足够大的提案。因此,如果系统中有足够多的组件能够正常工作,那么通过选择一个主Proposer,整套Paxos算法流程就能够保持活性。

一致性协议之Paxos算法的更多相关文章

  1. 搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法

    搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法 2PC 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议.其中比较著名的有二阶提交协议(2 Phas ...

  2. 分布式一致性的基石---Paxos算法(1)

    分布式一致性的基石---Paxos算法(1) Paxos算法是由微软的工程师Lamport提出,Lamport依靠Paxos算法获得图灵奖: Paxos算法旨在解决相互信任的分布式系统中,多个节点能快 ...

  3. ZAB协议与Paxos算法

    ZooKeeper并没有直接采用Paxos算法,而是采用一种被称为ZAB(ZooKeeper Atomic Broadcast)的一致性协议 ZooKeeper是一个典型的分布式数据一致性的解决方案, ...

  4. Zookeeper协议篇-Paxos算法与ZAB协议

    前言 可以自行去学习一下Zookeeper中的系统模型,节点特性,权限认证以及事件通知Watcher机制相关知识,本篇主要学习Zookeeper一致性算法和满足分布式协调的Zab协议 Paxos算法 ...

  5. 分布式一致性协议之:Zab(Zookeeper的分布式一致性算法)

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  6. 使用GO实现Paxos分布式一致性协议

    什么是Paxos分布式一致性协议 最初的服务往往都是通过单体架构对外提供的,即单Server-单Database模式.随着业务的不断扩展,用户和请求数都在不断上升,如何应对大量的请求就成了每个服务都需 ...

  7. Zookeeper的一致性协议:Zab(转)

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  8. Paxos算法小结

    转自不正直的绅士,因百度空间迁移,无法注明出处,我从其google搜索引擎中的cache进行的copy. 不正直的绅士 是跟我一起工作过的非常有才的一个青年才俊. Paxos的使用非常广泛.sanlo ...

  9. Zookeeper的一致性协议:Zab

        Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况: ...

随机推荐

  1. C# 7.0 新特性收集

    1.out-variables(Out变量) 2.Tuples(元组) 3.Pattern Matching(匹配模式) 4.ref locals and returns (局部变量和引用返回) 5. ...

  2. Unit05: 实战技巧 、 资费列表 、 拦截器

    Unit05: 过滤器解决表单写中文乱码.拦截器 1. 使用过滤器解决表单中文参数值乱码问题 注意: a. 表单提交方式必须为POST. b. 过滤器的编码应该与浏览器端设置的编码一致. 2. 拦截器 ...

  3. Unit07: 状态管理-Session

    Unit07: 状态管理-Session web package web; import java.io.IOException; import java.io.PrintWriter; import ...

  4. 谈谈GPU与FPGA的一些看法

    从几个方面来介绍一下GPU和FPGA. 从峰值性能来说,GPU(10Tflops)远远高于FPGA(<1TFlops).GPU上面成千上万个core同时跑在GHz的频率上还是非常壮观的,最新的G ...

  5. UVALive7261(2015ACM/ICPC北京赛区现场赛A)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  6. Centos6-7安装Python3.5以及SSL的编译安装,识别https

    Python3中无法导入ssl模块的解决办法 如果你发现在python3脚本运行过程中发现涉及到ssl模块都无法运行的情况下.那么需要进行如下步骤 第一步: yum install openssl o ...

  7. 一种SequenceFile的格式研究

    最近仔细研究了以下公司中使用的SequenceFile文件格式,SequenceFile的格式比较紧凑,实现了从中间读取文件内容(便于hadoop将文件进行适当地切分),同时也可以支持仅读取文件的元数 ...

  8. hadoop Partiton中的字符串Hash函数改进

    最近的MapReduce端的Partition根据map生成的Key来进行哈希,导致哈希出来的Reduce端处理任务数量非常不均匀,有些Reduce端处理的数据量非常小(几分钟就执行完成,而最后的pa ...

  9. 文档主题生成模型(LDA)

    一.问题描述 1.1文本建模相关 统计文本建模的目的其实很简单:就是估算一组参数,这组参数使得整个语料库出现的概率最大.这是很简单的极大似然的思想了,就是认为观测到的样本的概率是最大的.建模的目标也是 ...

  10. Tkinter place() 方法

    Python GUI - Tkinter place() 方法的使用例子:   这个的几何管理器组织放置在一个特定的位置,在他们的父widget部件. 语法: widget.place( place_ ...