感叹一下

  不得不说近几年国内软件行业发生了巨大的变化,之前几乎所有应用都围绕桌面展开,而近几年很多让人神魂颠倒的关键词一个接一个的映入眼帘: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. HTML基础(四)——设置超链接的样式示例

     ***设置超链接的样式示例  a:link 超链接被点前状态 a:visited 超链接点击后状态 a:hover 悬停在超链接时 a:active 点击超链接时 在定义这些状态时,有一个顺序l v ...

  2. CentOS7网络配置

    *关于查看IP信息 window中是 ipconfig Linux一般都是 ifconfig 不过CentOS7中  这个命令发生了更改 :ip addr 设置网络 再新建虚拟机向导过程中,有一步[网 ...

  3. linux下memcached的安装

    系统镜像及环境要求: 1) 适用于windows系列版本及开发者的相关教程  请参考本文1.0开始安装步骤 2)  Centos 6系列及Aliyun Linux 6系列以上版本 请参考本文2.0开始 ...

  4. Linux JDK 安装

    1,下载JDK(Linux版) 官网下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2,  建立java目录 ...

  5. google-analytics.com

    最近有朋友问,为什么我的网站打开时在执行google analytics有较长的停顿时间.要如果解决?这个问题其实很早就有,最好的解决办法是将网站所有页面的传统追踪代码统一替换为最新的异步追踪代码.不 ...

  6. Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  7. ELF Format 笔记(七)—— 符号表

    最是那一低头的温柔,像一朵水莲花不胜凉风的娇羞,道一声珍重,道一声珍重,那一声珍重里有蜜甜的忧愁 —— 徐志摩 ilocker:关注 Android 安全(新手) QQ: 2597294287 符号表 ...

  8. 使用jMeter测试Solr服务接口

    之前一直用ab做简单的服务接口测试,ab功能强悍,使用简单,但是没有生成专题图和表格等功能,因此,我们决定使用jmeter来作为我们测试工具.接下来,我们将详细介绍jmeter使用的步骤,主要包括:j ...

  9. 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件

    Bootstrap是当下流行的前端UI组件库之一.利用Bootstrap,可以很方便的构造美观.统一的页面.把设计师从具体的UI编码中解放出来.   Bootstrap提供了不少的前端UI组件.带下拉 ...

  10. [Top-Down Approach] Chatper 4 Notes

    4.2 Virtual Circuit and Datagram Networks VC Set up connection Exchange data Free the connection The ...