一致性协议之Paxos算法
一、算法提出背景
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算法的更多相关文章
- 搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法 2PC 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议.其中比较著名的有二阶提交协议(2 Phas ...
- 分布式一致性的基石---Paxos算法(1)
分布式一致性的基石---Paxos算法(1) Paxos算法是由微软的工程师Lamport提出,Lamport依靠Paxos算法获得图灵奖: Paxos算法旨在解决相互信任的分布式系统中,多个节点能快 ...
- ZAB协议与Paxos算法
ZooKeeper并没有直接采用Paxos算法,而是采用一种被称为ZAB(ZooKeeper Atomic Broadcast)的一致性协议 ZooKeeper是一个典型的分布式数据一致性的解决方案, ...
- Zookeeper协议篇-Paxos算法与ZAB协议
前言 可以自行去学习一下Zookeeper中的系统模型,节点特性,权限认证以及事件通知Watcher机制相关知识,本篇主要学习Zookeeper一致性算法和满足分布式协调的Zab协议 Paxos算法 ...
- 分布式一致性协议之:Zab(Zookeeper的分布式一致性算法)
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...
- 使用GO实现Paxos分布式一致性协议
什么是Paxos分布式一致性协议 最初的服务往往都是通过单体架构对外提供的,即单Server-单Database模式.随着业务的不断扩展,用户和请求数都在不断上升,如何应对大量的请求就成了每个服务都需 ...
- Zookeeper的一致性协议:Zab(转)
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...
- Paxos算法小结
转自不正直的绅士,因百度空间迁移,无法注明出处,我从其google搜索引擎中的cache进行的copy. 不正直的绅士 是跟我一起工作过的非常有才的一个青年才俊. Paxos的使用非常广泛.sanlo ...
- Zookeeper的一致性协议:Zab
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况: ...
随机推荐
- pull同步远程仓 笔记
一.远程仓库删除文件 远程仓 1.py 本地仓 1.py 2.py pull后 本地仓 1.py 这里的2.py 是没有改动过的情况,如改动了要解决冲突的,见:https://www.cnblogs ...
- MySQL 慢查询日志切换
low_query_log_file日志变得很大,对它进项分析变得很不方便,我们就想按天每天产生一个slow_query_log_file文件,每天分析这个日志文件. 如何按天切割呢? 我们想到了这么 ...
- orzdba_monitor.sh脚本使用
1.orzdba_monitor.sh脚本使用 ./orzdba_monitor.sh 主要是用nohup同时在后台调用orzdba,启动下面三个命令 [root@node02 scripts]# p ...
- JAVA中的IO流介绍(2)
一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端, ...
- IBM AIX创建lv
#lsvg 查看当前有哪些vgrootvgvgdb02vgdb01datavg#lslv maindb_index 查看maindb_index这个lv 位于哪个vg上,新的lv也要与之相同.LOGI ...
- 一步步实现 Redis 搜索引擎
来源:jasonGeng88 github.com/jasonGeng88/blog/blob/master/201706/redis-search.md 如有好文章投稿,请点击 → 这里了解详情 场 ...
- 【CVE】CVE-2018-4304 Apple多个操作系统函数拒绝服务漏洞
TextImpact: Processing a maliciously crafted text file may lead to adenial of serviceDescription: A ...
- python 3389爆破机
前言: = =上学后的第一个星期假期,写了个3389爆破器 - 0x01 准备: hydra 钟馗之眼API 0x02代码: import optparse import os import requ ...
- 用Theano学习Deep Learning(三):卷积神经网络
写在前面的废话: 出了托福成绩啦,本人战战兢兢考了个97!成绩好的出乎意料!喜大普奔!撒花庆祝! 傻…………寒假还要怒学一个月刷100庆祝个毛线………… 正题: 题目是CNN,但是CNN的具体原理和之 ...
- Python图片转字符
前段时间学习pillow写的,可以通过改变font_map改变转换的深度和字符.思路是先转换黑白大小,读取黑白值取范围读font_map转变. from PIL import Image,ImageD ...