原文请参考【[置顶] Paxos master选举--PaxosLease算法

众所周知,为了避免Paxos算法的活锁问题,必须选举唯一的proposor。偏偏在Paxos原论文中,作者L. Lamport不屑于讨论这个问题,因为选举过程中,即使出现多个master共存,也不影响Paxos算法正确性。另一方面,由著名的Fischer-Lynch-Paterson结论可知,不采取超时机制,任何算法都不能保证在有限时间内选举成功。不过这个结论在这里对我们影响不大,我们只要设计一个实际系统中好使的一个算法就行,而且我们希望保证选举过程的”安全性“,任意时刻不允许多个master共存,理由见这里

为了满足”安全性“,容易想到lease机制,一个lease,就是一个带expire-time的锁。锁的持有者必须在expire-time之前进行续约(延后expire-time),否则time一到锁就自动释放。这样锁的持有者宕机后不会导致资源长时间被锁住,其次,锁的持有者若由于网络原因续约失败,就必须在expire-time到来之前停止对锁住资源的操作,这样其它主机在expire-time到来后获得锁,就不会和原先的锁持有者同时操作锁住的资源,造成数据被破坏。

回到这里的问题,多台机选举一个master,每一台都可能宕机,这个lease肯定不能只存在一台机上,每台机都是对等的,那所有的机器都得存一份lease,容易设计出如下简单的算法:

  • 参与选举的机器先启动定时器,超时时间T,然后广播一个获取lease请求,附带上自己机器id。
  • 每台机器接收到lease请求后,检查自己的lease状态,若为空或者等于请求机器的id,把lease状态设为此id机器占有,然后也启动定时器,超时时间T(超时时间一到就把lease置空),回复OK。否则回复lease被占用。
  • 如果参与选举机器接收到多数派机器回复OK,那么在超时时间T结束,可以确信自己独占lease,这段时间内别的机器无法获取lease。

上述算法的正确性是显而易见的,但是很容易陷入死锁。假设多个候选者同时广播lease请求,分别抢占了一部分机器的lease,但又都达不到多数派的要求,那么就谁也无法获得lease,只能等待每台机器lease超期再次尝试。注意到第二次尝试必须等到lease超期后才能再开始,这是很严重的block状态,所以这里把它称为”死锁“。

如何避免上述的死锁问题?容易想到,在发出占有lease的指令之前,可以先探查一下当前所有机器上lease的状况,如果探查结果超出半数的lease都是空的,那么再广播占有lease的指令,否则的话就过一段时间再探查,因为在这种情况下再去占有剩下的lease,不但获得不了多数派lease,反而会加剧死锁。

这样一来,我们就很容易设计出一个两阶段提交的算法了:

  1. prepare request:广播探查lease指令
  2. prepare response:回复lease状态
  3. propose request: 检查收到的Respond回复,若多数派回复为空,发出Capture lease指令,当然,要附带上本机ID。然后启动定时器,超时时间T
  4. propose response:接收Capture Lease,Overwrite原lease状态,回复OK
  5. Check & Ack: 若收到多数派的OK回复,那么在超时时间T结束之前,就可以确信自己得到lease了
注意第四步,是Overwrite原lease状态,还有第三部,若多数派回复为空条件不成立,就要回到第一步重新开始。图示如下:
 
脑子快的童鞋们,看到这里可能就隐隐约约感觉到有问题了。问题在哪呢?
 
如果多个候选者,串行的执行步骤1~4,也就是说,机器A执行1~4,完了后才轮到机器B执行1~4(当然很可能这时执行到第三步就没下文了),这么串行的来执行的话,这个算法是完全正确的,因为任意两个多数派必有一个交集,这个约束使得任两台机不可能都成功的执行1~4步骤(在lease过期时间内)。但关键在于,这个”串行化“是难以实现的。而一旦串行化被破坏以后,结果也就错了,比如,A先探查到全部lease为空,然后B也查到相同结果,然后A占领所有lease成功,A认为自己获得lease。然后B也占领所有lease(overwrite),B同时也认为自己得到lease。
 
怎么办呢?可以效仿Paxos算法的Proposal编号机制,一旦串行化被破坏,编号低的proposor的propose request请求就会被拒绝掉,那么这个proposor也就得不到lease了,必须用一个更高的编号再从第一步开始,具体怎么做,参照Paxos算法,这里就不废话了。
 
还有一个问题,replica宕机重启后,需要等待M>T的时间才能有资格开始竞选master,这也是为了安全性的保证。因为replica并不保存lease相关状态,这是一个diskless的算法。
 
既然是lease,master就得在lease到期之前续约,续约的步骤和上边的5步类似,就是第三步,原本是检查是否有多数派lease为空,改为检查是否有多数派lease或者为空,或者等于自己的ID。
 
这个选举算法,叫做PaxosLease算法,但是本质上和Paxos算法是完全不同的,只不过也用了Paxos算法的两阶段提交形式,同时为了保证两阶段提交的原子性,加入编号机制。但它同样有Paxos算法的活锁问题。但是,和最开始提出的简单的选举算法比,”死锁“问题已经完全消除了。这个算法在一个开源的分布式数据库KeySpace中得到了应用,Google Chubby估计用的也是这种算法,不过相关的论文却语焉不详,或许Google的人觉得这问题过于简单不屑于详述吧。

【转】PaxosLease算法--2PC看Paxos选主的更多相关文章

  1. 分布式一致性算法 2PC 3PC Paxos

    分布式一致性算法的目的是为了解决分布式系统 一致性算法可以通过共享内存(需要锁)或者消息传递实现,本文讨论后者实现的一致性算法,不仅仅是分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用. 本 ...

  2. 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...

  3. 聊聊Zookeeper应用场景、架构设计、选主机制

    Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...

  4. 底层算法系列:Paxos算法

    关于算法,面太广.本系列只研究实际应用中遇到的核心算法.了解这些算法和应用,对java码农进阶是很有必要的. 对于Paxos学习论证过程中,证实一句话:有史以来学习paxos最好的地方wiki:Pax ...

  5. zookeeper curator选主(Leader)

    在分布式系统设计中,选主是一个常见的场景.选主是一个这样的过程,通过选主,主节点被选择出来控制其他节点或者是分配任务. 选主算法要满足的几个特征: 1)各个节点均衡的获得成为主节点的权利,一旦主节点被 ...

  6. 2PC/3PC/Paxos

    在分布式系统中,一个事务可能涉及到集群中的多个节点.单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时). 若部分节点事务执行失败 ...

  7. 从2PC到Paxos

    在分布式系统中,一个事务可能涉及到集群中的多个节点.单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时). 若部分节点事务执行失败 ...

  8. Zookeeper笔记之使用zk实现集群选主

    一.需求 在主从结构的集群中,我们假设硬件机器是很脆弱的,随时可能会宕机,当master挂掉之后需要从slave中选出一个节点作为新的master,使用zookeeper可以很简单的实现集群选主功能. ...

  9. 源码分析 RocketMQ DLedger 多副本之 Leader 选主

    目录 1.DLedger关于选主的核心类图 1.1 DLedgerConfig 1.2 MemberState 1.3 raft协议相关 1.4 DLedgerRpcService 1.5 DLedg ...

随机推荐

  1. [Tool] Visual Studio必备插件 + 技能

    总结自己常用的VS插件,其中部分需要注册. 在该链接http://www.cnblogs.com/neverc/p/4591501.html中提供 1.Web Essentials(测试支持2010, ...

  2. Visual Studio Code初探

    作者:Grey 本文的GIF动画均使用ScreenToGif进行录制. 摘要 微软今年发布了一款运行于 OS X,Windows 和 Linux 之上的免费跨平台编辑器: Visual Studio ...

  3. AC自动机 - 多模式串的匹配运用 --- HDU 3065

    病毒侵袭持续中 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=3065 Mean: 略 analyse: AC自动机的运用. 这一题 ...

  4. html5菜单折纸效果

    类似猎豹浏览器安装时的用户须知效果. html文件代码,保存为html文件打开: <!DOCTYPE html> <html> <head> <meta ht ...

  5. 小白学Linux(三)--文件系统基本结构

    Linux文件系统是一个倒立的单根树状结构,文件名称严格区分大小写(windows系统则是对大小写不明感的).路径用“/”分隔,跟windows的“\”不同. 这里我画了一张一般Linux系统的正常目 ...

  6. 关联规则-R语言实现

    关联规则code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && ...

  7. SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

    最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...

  8. 【OpenCV】OpenCV中GPU模块使用

    CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...

  9. .NET WinForm画树叶小程序

    看了一片文章(http://keleyi.com/a/bjac/nurox416.htm),是使用分型画树叶,代码是Java的,因为Java很久没弄了,改用C#实现,下载地址: 画树叶小程序下载 核心 ...

  10. DOM性能小记

    在使用DOM操作时,同样的效果用不同的方式来实现,性能方面也会有很大的差异.尤其在移动式设备上,资源本来就很有限,一旦DOM写不好的话操作就会非常卡顿.这个周末,就写个DOM性能小记吧.错漏之处,望多 ...