paxos算法之粗浅理解
paxos出身
paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport。
paxos为何而生
那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而是为了解决分布式系统的大难题。分布式系统一
般要求具有高可用性,高可用性一般又是通过冗余也就是多副本来解决,多副本接着又带来了一致性问题,所以分布
式系统要解决的问题可简单归结为多副本的一致性问题。怎么解决一致性问题呢?抢答:用事务。何为事务?抢答:
多个操作序列的原子性。何为原子性?抢答:还需要您自己去多看书吧。实现事务的方案有两阶段提交协议,和在这
个基础上进行了增强的三阶段提交协议。 这两个方案都涉及到两个角色,即协调者(coordinator)和参与者(cohort),协
调者要保证操作序列的原子性来实现事务,但它们都存在一些 问题,因此一些著名的系统如Google的Chubby和Yahoo
的Apache ZooKeeper都使用了paxos算法。
两阶段提交协议的消息流程:
Coordinator Cohort
QUERY TO COMMIT
-------------------------------->
VOTE YES/NO prepare*/abort*
<-------------------------------
commit*/abort* COMMIT/ROLLBACK
-------------------------------->
ACKNOWLEDGMENT commit*/abort*
<--------------------------------
end
两阶段提交协议包含投票(Vote)和提交(Commit)两个阶段,它是一个阻塞的协议,如果参与者给协调者发送YES消息后协调者
永久性地挂了,那么参与者将陷入无限等待中,并且会带来数据不一致的问题。
三阶段提交协议的消息流程:
三阶段提交协议在二阶段提交协议的基础上增加了准备提交(Prepared to commit)阶段,解决了协调者挂掉后参与者
无限阻塞和数据可能不一致的问题,但仍然无法解决网络分区的问题。
相对于上面两个协议,由于多数派的特性,paxos可以在节点失效、网络分区、网络延迟等各种异常情况下保证所有
节点都处于同一状态,它的结构图大致如下:
Basic paxos architecure. A picutre from:paxos-by-example
一个典型的paxos应用场景
分布式系统中有多个节点,一般每个节点都是参与者,而其中一个节点既是参与者又是协调者。但是这样还会有单点
故障的问题,即如果协调者节点挂了,那么将无法进行任何事务,系统也就停止了正常运转。如何在还存活的其它节
点中选择一个来担当协调者的角色,使系统可以照常运行,达到山不转水转的目标呢?真的好难,但是有了paxos算
法,我们可以解决这个难题。如果还觉得这个问题抽象,那么可以换一种表述方式,即:如何在分布式系统中确定某
一个变量的值。在这个具体的场景中,这个变量的值指定了哪个节点将被选出来担当新协调者的角色。
paxos角色和规则
从上面的结构图中,我们看到paxos主要涉及三个角色,分别为Acceptor、Proposer和Learner,在实践中,往往每个节
点都具备这三个角色,这里为了让我们大脑少些迷糊,暂且以每个节点只具备一种角色来讨论。
paxos算法主要分为两个阶段:
1. Prepare:
Proposer
向所有Acceptor发送Prepare申请访问权,并携带一个提案号(epoch),Acceptor赋予访问权或拒绝,并且返回
该Acceptor
已经接受的值和对应的提案号。如果Proposer获得超过半数Acceptor的访问权,那么会进入第二阶段;
2. Accept:
1) 如果所有的Acceptor返回值都为空,则Proposer将携带自己预设的值v和自己的epoch号向获取到访问权的Acceptor发送请求;
2)如果Proposer第一阶段获得某些Acceptor的返回值不为空,则将epoch号最大的提案号对应的值f作为自己的预设值,和自己的
提案号一起向Acceptor发送请求(如果第一阶段返回f的Acceptor已经超过了半数,则表示已经形成确定性取值,此时直接返回成
功,不需要进行Accept请求了);
对于Acceptor来说,当它接收到Proposer请求时,需要应用一系列规则来决定如何响应,我们对这些规则可以进行如下概括:
1)喜新厌旧
当Acceptor接收到Prepare请求时,它将当前自己发放了访问权的epoch号和该Prepare请求携带的epoch进行比较,如果前者小
于后者,则将访问权赋予新请求的这个Proposer,否则拒绝发放访问权。这里我们认为epoch值越大的越新。
2) 一视同仁
当Acceptor接收到Accept请求时,它
将当前自己发放了访问权的epoch号和该Prepare请求携带的epoch进行比较,如果前者大于
后者,则拒绝该请求。如果这两个epoch号相等,
并且Acceptor当前接受的取值为空,则接受该Acceptor请求,同时将该Accept
请求的值设置为接受值。如果之后又更大的epoch号申请
到访问权,并发出Accept请求,该值也不会改变,即Acceptor在确定了
值之后不再改变,谁先设置就用谁的值。虽然在发放访问权时是喜新厌旧,但
在取值这个问题上一视同仁,不会因为新epoch号
大而改变取值。这就像某些人,其他女人可以访问他,但老婆只要定了就不会变。
paxos正确性
假
设有N个Acceptor,多数派个数至少为N/2+1。如果有一个以上的Proposer获取到超过半数Acceptor的访问权,那么至少有一个
Acceptor是相同的。具体来说,假设Proposer A在Prepare阶段获取到J个Acceptor的访问权,Proposer
B在Prepare阶段获取到K个Acceptor的访问权,J>=N/2+1,K>=N/2+1,那么必然有这样一个Acceptor
C,C既属于J又属于K,这种情况就是在C给某个Proposer发放访问权后,接着被另一个Proposer抢占到了访问权时发生。
我们假设Proposer A的取值为V1,Proposer B的取值为V2。在Accept阶段,对于Acceptor
C来说,它根据访问权来决定接受谁的Accept请求,如果当前是B获得了访问权,则接受B的取值V2,这样A在Accept阶段将失败,失败之后它可能
会继续生成新的epoch值重新进入Prepare阶段,但是这回它拿到了返回值V2,这样它之后进入Accept阶段时,会将V2作为它的取值向
Acceptor发送申请,最终Proposer A和Proposer B都达成了一致,即V2为最终取值。
以上是本人目前对paxos算法的一点理解,还将继续深入和不断纠正.......
感觉不错的资料,推荐参考:
前百度牛人李海磊的课程:
http://www.tudou.com/programs/view/e8zM8dAL6hM/
这个视频里还讲到了活锁,我看了启发不小:
https://www.youtube.com/watch?v=JEpsBg0AO
http://angus.nyc/2012/paxos-by-example/
http://blog.csdn.net/chen77716/article/details/6166675
原文链接:paxos算法之粗浅理解
paxos算法之粗浅理解的更多相关文章
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- Paxos算法的通俗理解(转)
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- Paxos算法(转)
Paxos算法的难理解与算法的知名度一样令人敬仰,从我个人的经历而言,难理解的原因并不是该算法高深到大家智商不够,而在于Lamport在表达该算法时过于晦涩且缺乏一个完整的应用场景.如果大师能换种思路 ...
- Paxos 算法 :消息传递一致性
网络上有很多关于优秀的关于Paxos 算法的文章,我下面进行整理搜集一下: 分布式理论之一:Paxos算法的通俗理解 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 L ...
- 【转】Paxos算法1-算法形成理论
——转自:{老码农的专栏} Paxos算法的难理解与算法的知名度一样令人敬仰,从我个人的经历而言,难理解的原因并不是该算法高深到大家智商不够,而在于Lamport在表达该算法时过于晦涩且缺乏一个完整的 ...
- zookeeper数据一致性与paxos算法
数据一致性与paxos算法 据说Paxos算法的难理解与算法的知名度一样令人敬仰,所以我们先看如何保持数据的一致性,这里有个原则就是: 在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执 ...
- 分布式一致性协议之:Paxos算法(转)
Paxos算法的难理解与算法的知名度一样令人敬仰,从我个人的经历而言,难理解的原因并不是该算法高深到大家智商不够,而在于Lamport在表达该算法时过于晦涩且缺乏一个完整的应用场景.如果大师能换种思路 ...
- 【转载】分布式系列文章——Paxos算法原理与推导
转载:http://linbingdong.com/2017/04/17/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0 ...
随机推荐
- Topcoder SRMCards ——贪心
选择一个数x会删去x+1和x-1,问可以最多选多少次. 显然,对于一段连续的数列,贪心的从左向右选取是最优的. 然后就可以贪心的统计答案了. #include <map> #include ...
- python:print含有中文的list
Python 的 List 如果有中文的话, 会印出 \xe4\xb8... 等等的编码(如下所示), 要如何印出中文呢? >>> a = ['中文', 'ab']>>& ...
- bootstrap 事件shown.bs.modal用于监听并执行你自己的代码【写hostmanger关联部门遇到的问题及解决方法】
背景:记录写hostmanger中用户下拉框关联部门遇到的问题及解决方法 问题:需求是展示页面展示用户所属的部门,点击修改按钮后,弹出对应的model,这个时候部门的select要默认选中用户所在的s ...
- 我要好offer之 系统基础大总结
1. APUE Unix环境高级编程 (1) Unix基础知识: 内核->系统调用->shell和库函数->应用软件 (2) 文件I/O:read函数返回值.进程的文件描述符表.文件 ...
- QBXT 二月五号整理
给你一列数, 询问和最大的子串. N<=10^6 // N <=10^6 #include<cstdio> #include<iostream> using nam ...
- ROS学习网址【原创】
ROS学习网址 http://www.ros.org/ http://www.ros.org/news/book/ http://wiki.ros.org/ http://blog.exbot.net ...
- PHP获取今天开始和结束的时间戳
$t = time();$start = mktime(0,0,0,date("m",$t),date("d",$t),date("Y",$ ...
- HRBUST 2078:糖果(模拟,贪心)
题不难,但作为一道恶心到了我的题,我还是记录一下的好. 题意:n个人围一圈,要求:相邻两人,分数高的要比分数低的得到更多的糖果,若分数相同则必须得到相同数量的糖果.问满足要求的最少需要分配的糖果数.( ...
- p标签注意事项
<p> 哈哈,我是一个段落哦! <div id="box">我是一个萌萌的div</div> </p> 这样写的后果: 注意: p标 ...
- PythonWeb开发教程(二),搭建第一个django项目
这篇写怎么创建django项目,以及把django项目运行起来. 1.创建django项目 a.使用命令创建,安装完django之后就有django-admin命令了,执行命令创建即可,命令如下: ...