【分布式协调】之理解paxos
感叹一下
不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘:web2.0、移动应用、云计算、大数据。互联网的浪潮一波接着一波,我们这代人也鉴证了在一次次的革命中科技企业的兴衰成败。貌似说的有些远了,其实我只是想说,互联网的繁荣会产出大规模的数据,必定给分布式技术带来的无比巨大的挑战,所以我们应该理解其基本原理来更好的投身于我们的事业之中~
进入正题。我是根据wiki上的算法描述来解释的,第一次看wiki的描述感觉摸不着头脑,有些地方总觉得不对,但是后来细细品味,wiki的文字并没有疏忽。
另外本人利用闲暇时间开发出了一个类Paxos的工程实现,借鉴了chubby以及zookeeper等项目的一些工程化方法,代码已经开源:https://github.com/15Koala/cocklebur 目前已经实现自动选主,数据服务还在开发阶段。后续我会把实现的具体细节以博客的形式发表出来,希望能和大家多多交流!
用Paxos做什么?
Paxos是一种使多个个体达成一致的一种协议,他被广泛的应用在分布式领域当中。然而大家在真正用它的时候都会选择类paxos去实现,而paxos则被认为是各种版本的类paxos的源头。Paxos致力解决在消息重复、丢失、延迟的情况下分布式系统消息传递一致性的保证,如果每个节点都遵守该协议那么就可以一致。
可能说道这里,有些人会感到困惑,什么叫达成一致呢?这跟整个集群有什么关系?好,那我说个具体的例子,比如:你想让一个集群启动后自动的选举出一个主节点作为master,你可能会说,我配置好了就OK了,但是master挂了怎么办?Paxos可以让集群自动选举出master,“选举”要比“任命”更鲁棒。而选举的过程其实就是修改节点状态(节点上的数据)的过程,大家根据统一的约定(Paxos协议)去选出一个master。
Paxos协议的描述
现在我们过一遍Paxos算法的内容,此时一定不要想太多工程实现上的细节问题,现在我们只需了解它怎么去工作就好了,因为具体实现与下面陈述的大相径庭。
首先,过程涉及三种角色,提案者(proposer),评议者(acceptor),使用提案的人(learner)。通俗点说就是proposer们要给acceptor们提一些提案,让acceptor最终敲定一个提案,敲定之后再通告所有的learner们。补充一句,为了打消你的一些疑虑,补充下面几点:1. proposer可以提交很多次自己的提案(因为这相当于消息重发);2. 也可以没让某些acceptor收到自己的提案(因为这相当于丢包了,但不能全部都收不到啊,这样这个提案就完全没意义了),3. Acceptor收到的提案可以顺序错乱的(这相当某些消息延迟了);4. 每个proposer都没有说违心的话,都有啥说啥了(这相当于没有拜占庭问题,发送的信息都是正确无误的)。
OK,到了现在人物出场完毕,接下来解释一下提案过程所涉及的概念:
提案(value):每个proposer向acceptor们提交提案时都会附带一个序号(自增的,你可以把提交的时间戳作为它的序号),之所以需要这个编号,是让它作为acceptor取舍提案的依据。但是value是提案的唯一标识,比如,一个proposer提了两次value = v1的提案,虽然第二次的序号要比第一次大,但是依然是同一个提案。
多数派(majority):多数派是所有acceptor的一个子集,元素个数多余一半就称之为多数派。他代表了某一群acceptor。根据抽屉原理,任意两个多数派之间必然有交集。 接受(accept):acceptor总会接收它收到的第一个提案;如果序号比之前接受的提案序号都高,那么它也会接收提案; 批准(chosen):一个多数派接受了一个提案,并且在该proposer发送accept请求确认之后,那么我们说该提案被批准。 prepare请求:提案请求,proposer 向acceptor多数派发送提案请求。 accept请求:批准请求,proposer 征求acceptor批准自己的提案。
OK,我们来看一下Paxos提案两个阶段:
A.准备(prepare)阶段:
1.proposer 选择一个提案编号 n (在proposer 角度看永远是自增的,但是在acceptor角度看就不一定了,因为可能延迟,你懂的)并将提案(value)发送给 acceptors 中的一个多数派(就是说超过一半的acceptor接收到了,但不能说是proposer 发送给了多一半的人,因为这并不能保证多数派收到提案,时时刻刻要提醒自己,发送不一定能收到!要仔细体会前面几句的区别哦);
2.acceptor 收到提案后,如果提案的编号大于它已经回复的所有提案的编号,接收该提案(约束P1a,见wiki百科)。acceptor 将自己上次接受的提案回复给 proposer(其实这里主要是为了优化用的,因为proposer如果知道了有跟自己不一样且编号较大的提案,他自己就不会再去申请了),然后,并承诺给该proposer不再回复小于 n 的提案;
B.批准(chosen)阶段:
1.当一个 proposor 收到了多数 acceptors 对 prepare 的回复后,就进入批准(chosen)阶段。他要向回复提案请求的 acceptors 发送 accept 请求,包括编号 n 和他的value(注意,此时可能会有多个proposor 认为自己已经被多数派认可,因为acceptors 在接受proposor1之后可能有来了一个持有更大编号的proposor2,实际上此时多数派可能更支持proposor2。另外需要再次强调一下,多数派一旦持有一个意见之后,不可能在找出持有其他意见的多数派,因为任意两个多数派必有交集,所以可以反证之);
2.在不违背自己向其他 proposer 的承诺的前提下(上文提到过这个承诺-不再接收编号更小的提案,言外之意,如果在该proposor发送accept请求之前,多数派成员发现了序号更高而且跟该proposor的提案不同的提案,那么肯定就接受了),acceptor 收到 accept 请求后即接受这个请求(如果acceptors们发现此时发accept请求的proposor持有的value并不是当前acceptor所接受的,那么将不会接受,所以接受的数量构不成多数派,那么该提案就失败了,如果构成多数派,那么就批准了)。
到此,整个协议就描述完毕,你可能更加关心各种异常情形。因为单从上面的描述中很难看出遇到异常情况如何去决策。
比如,一个常见的问题就是如果在批准阶段,一个proposor没有被批准(虽然他之前还看到希望来着),他发送的accept请求已经被某些acceptor所接受了,那么这些acceptor就不会在接受其他的value了,那他们以后怎么办?我想持有这样问题的朋友一定是在想这并不是所有人达成一致呀!没错,在批准的那一刻并不是所有人都一致,而是一个多数派一致了,那么这就够了,因为只要找出一个多数派批准,那么我们就强行决定,所有人都应该批准!
再比如一个问题:批准之后要是一个持有更高编号的延迟了,导致让编号较小的人率先获得多数派的批准。回答是只能对那些晚了的人表示遗憾了,因为有些事一旦错过就不在...这里不是开玩笑,是因为有些超时的行为是需要去权衡的,你也可能设定一个等待时间,在批准前先等一等,看看有没有晚来的“优秀提案”。
参考文献:http://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95
【分布式协调】之理解paxos的更多相关文章
- 【分布式协调器】Paxos的工程实现-cocklebur选举
其实整个项目中一个最主要的看点就是选举算法,而这部分也是逻辑最复杂最难理解的部分.不同的实现在不同的场景下的策略也不尽相同,而且场景非常之多.接下来我们一起来看一下Cocklebur的实现思路. 一个 ...
- 【分布式协调器】Paxos的工程实现-cocklebur简介(一)
初识分布式协调器 分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了 ...
- 【分布式协调器】Paxos的工程实现-cocklebur简介(二)
Cocklebur集群的工作原理 在集群正常工作时,整个集群只会有一个Leader,其他都是Follower.Client可以注册到某个Follower,当然也可以注册到Leader,为了减轻Lead ...
- 【分布式协调器】Paxos的工程实现-Cocklebur状态转移
集群中的主机经过选举过程由Looking状态变为了Leadering或Following状态.而这些状态之间转移的条件是什么呢?先来个直观的,上状态图. 图 4.1 Cocklebur选举过程中的状态 ...
- 分布式理论之一:Paxos算法的通俗理解
维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...
- 四:分布式事务一致性协议paxos通俗理解
转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...
- 分布式协调服务Zookeeper扫盲篇
分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...
- 搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法 2PC 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议.其中比较著名的有二阶提交协议(2 Phas ...
- 个人学习分布式专题(二)分布式服务治理之分布式协调技术Zookeeper
分布式协调技术Zookeeper 2.1 zookeeper集群安装部署(略) 2.2 zookeeper的基本原理,数据模型 2.3 zookeeper Java api的使用 2.4 zookee ...
- 分布式协调框架_Zookeeper
Zookeeper 如今在分布式架构中应用十分广泛,它作为分布式协调框架在分布式架构中有着举足轻重的地位,本文是主要从以上几个方面对 Zookeeper 常用的知识进行总结. 一 从集中式到分布式架构 ...
随机推荐
- mac版 android破解软件下载安装
1 apktool下载安装 下载地址https://code.google.com/p/android-apktool/ [1].下载apktool.jar — 解压 [2].下载Mac上的辅助工具a ...
- iframe 的使用和登陆退出的实现——整个页面跳转
iframe中如果只是页面跳转的话,我们依然只是部分的加载的了,为了实现整个页面的所有内容跳转,下面提供了整个页面跳转的方法. iframe例子 1.总的iframe页面(访问就访问这个) all. ...
- hdu 4966 GGS-DDU (最小树形图)
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...
- 【CSS】使用边框和背景
1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border-style 和 border-color . <!DOCTYPE html> ...
- [PHP]Yii2框架的坑
[PHP]Yii2框架的坑.md-/Users/zjh/Documents/我的文章/[PHP]Yii2框架的坑 html{font-family: sans-serif;-ms-text-size- ...
- POJ2157Maze[DFS !]
Maze Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3818 Accepted: 1208 Description ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- HTML常用标签跟表格
<html> --开始标签 <head> 网页上的控制信息 <title>页面标题</title> </head> <body& ...
- guava函数式编程
[Google Guava] 4-函数式编程 原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所 ...
- 解决为什么每次打开Eclipse新的workspace需要更新nexus-maven-repository-index问题
解决为什么每次打开Eclipse新的workspace需要更新nexus-maven-repository-index问题 新建一个Eclipse的workspace. 打开Window—>Pr ...