原文请参考【[置顶] 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. github生成燃尽图

    一.     前期准备工作. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8添加标签 二.     修改进度 2.1进入milestone,编辑 可以看到上面有bug标签,进入并解决 ...

  2. 投票系统 & 简易js刷票脚本

    早就听说有什么刷票脚本,微博投票等等相关的投票都有某些人去刷票. 试一下吧,兴许自己也会刷票呢?捣鼓了几个小时,终于有所眉目. (1)投票系统 要刷票,就得先有个投票界面. 当然,可以直接去各个投票网 ...

  3. 2015年百度之星初赛(1) --- C 序列变换

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. Winform屏幕截图保存C#代码

    代码如下: using System.Runtime.InteropServices; using System.Drawing.Imaging; [System.Runtime.InteropSer ...

  5. sql server聚合函数sum计算出来为空,怎样返回0

    通常我们计算数据库中表的数据有几个常用的聚合函数 1.count : 计数 2.sum: 计算总和 3.avg: 取平均值 4.max: 取最大值 5.min: 取最小值 6.isnull: 当返回数 ...

  6. 用linux遇到的一个死循环

    1. 公司的服务器centos,需要通过vpn拨上去: 2. 然后ftp启用了tls加密: 3. 然后ubuntu 12.04 上libgnutls的版本比较新,装的filezilla 3.5.3,怎 ...

  7. 使用PushSharp进行IOS发布应用的消息推送

    在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfigura ...

  8. jetty加载spring-context容器源码分析

    带着疑问开始 web.xml的顺序问题 先拿一个最简单的spring mvc web.xml来说问题,如下图:如果我将三者的顺序倒置或是乱置,会产生什么结果呢? 启动报错?还是加载未知结果?还是毫无影 ...

  9. redis 慢日志 slowlog

    1 slowlog是什么 redis的slowlog是redis用于记录记录慢查询执行时间的日志系统.由于slowlog只保存在内存中,因此slowlog的效率很高,完全不用担心会影响到redis的性 ...

  10. React入门--------JSX

    React学习网站 React官方英文网站:http://reactjs.cn/react/docs/top-level-api.html React官方中文网站:http://www.css88.c ...