感叹一下

  不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘: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的更多相关文章

  1. 【分布式协调器】Paxos的工程实现-cocklebur选举

    其实整个项目中一个最主要的看点就是选举算法,而这部分也是逻辑最复杂最难理解的部分.不同的实现在不同的场景下的策略也不尽相同,而且场景非常之多.接下来我们一起来看一下Cocklebur的实现思路. 一个 ...

  2. 【分布式协调器】Paxos的工程实现-cocklebur简介(一)

    初识分布式协调器 分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了 ...

  3. 【分布式协调器】Paxos的工程实现-cocklebur简介(二)

    Cocklebur集群的工作原理 在集群正常工作时,整个集群只会有一个Leader,其他都是Follower.Client可以注册到某个Follower,当然也可以注册到Leader,为了减轻Lead ...

  4. 【分布式协调器】Paxos的工程实现-Cocklebur状态转移

    集群中的主机经过选举过程由Looking状态变为了Leadering或Following状态.而这些状态之间转移的条件是什么呢?先来个直观的,上状态图. 图 4.1 Cocklebur选举过程中的状态 ...

  5. 分布式理论之一:Paxos算法的通俗理解

    维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性 ...

  6. 四:分布式事务一致性协议paxos通俗理解

    转载地址:http://www.lxway.com/4618606.htm 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La" ...

  7. 分布式协调服务Zookeeper扫盲篇

    分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...

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

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

  9. 个人学习分布式专题(二)分布式服务治理之分布式协调技术Zookeeper

    分布式协调技术Zookeeper 2.1 zookeeper集群安装部署(略) 2.2 zookeeper的基本原理,数据模型 2.3 zookeeper Java api的使用 2.4 zookee ...

  10. 分布式协调框架_Zookeeper

    Zookeeper 如今在分布式架构中应用十分广泛,它作为分布式协调框架在分布式架构中有着举足轻重的地位,本文是主要从以上几个方面对 Zookeeper 常用的知识进行总结. 一 从集中式到分布式架构 ...

随机推荐

  1. 给现有MVC 项目添加 WebAPI

    1. 增加一个WebApi Controller, VS 会自动添加相关的引用,主要有System.Web.Http,System.Web.Http.WebHost,System.Net.Http 2 ...

  2. Javascript之旅——第十一站:原型也不好理解?

    写到这篇,我的js系列也快接近尾声了,所以这个系列不会遗留js来实现面向对象的核心——原型,有些人说原型不好理解,其实嘛,要想系统 的理解原型,最便捷的方式就是看看经典的书,少看些博客,博客这东西只是 ...

  3. Apache安装问题:configure: error: APR not found . Please read the documentation

    Linux上安装Apache时,编译出现错误: checking for APR... no configure: error: APR not found .  Please read the do ...

  4. .NET框架设计(高级框架架构模式)—钝化程序、逻辑冻结、冻结程序的延续、瞬间转移

    阅读目录: 1.开篇介绍 2.程序书签(代码书签机制) 2.1ProgramBookmark 实现(使用委托来锚点代码书签) 2.2ProgramBookmarkManager书签管理器(对象化书签集 ...

  5. 今天简单说一下cdc 的使用

    从08开始,sql server 提供了一种叫做 变更数据捕获 cdc(Change Data Capture) 的功能,可以通过启用这个功能,来实现查看数据库中的表对象的数据的变化情况.(我感觉就是 ...

  6. 利用 druid 解析器解析SQL

    最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写. 1. 对 insert 语句进行解析: private ...

  7. Toritoisegit记住用户名密码

    TortoiseGit每次连接git都得输入密码了,如果我们用到的比较频繁这样是很麻烦的,那么下面我们来看一篇关于window设置TortoiseGit连接git不用每次输入用户名和密码的配置,具体的 ...

  8. ssh升级

    Openssh升级操作步骤(此方法仅供参考) 1 .开启telnet服务 未避免openssh升级失败,导致ssh无法连接,在升级前首先开启telnet服务. 首先要确定是否安装了telnet 修改配 ...

  9. 关于 RTL8723BS 同时开启 STA/AP 模式

    最近接到一个调试 wifi 驱动的任务,使用的是 rtl8723bs 芯片组.要求是让无线设备工作在 station 模式的时候同时开启一个 ap 热点.简单来讲就是连接其他 wifi 的同时发出一个 ...

  10. Java报表FineReport在医院院长查询分析系统中有什么用

    1.医院院长查询系统的价值 目前,大中型医院的信息处理正从传统手工方式飞速向电脑信息化建设方案转变,一个大中型医院担负着繁重的医疗和科研任务,以及繁杂的事务性工作,院长必须时刻与各科室保持密切的连续, ...