paxos算法中master有效期与续约依赖机器时间的解决办法

对于paxos算法,一般工程化时,为了提高paxos算法效率,会引入master角色,并且要遵循在同一时刻,paxos集群有且只有一个节点是master角色,或者没有master角色;且只有master角色的节点可以发起propose,这两个原则。

这就涉及到了maste的选举与续约。一般的master选举如下图所示:

 

那么master节点认为master的任期为从beMaster操作的paxos算法开始前T1时刻开始的timeout时间,即T3之前有效。其他节点认为master的任期为beMaster操作的paxos算法结束后的timeout时间,即图中T2‘之前有效。这就保证了master节点一定会认为自己的过期时间要提前与其他节点认为master过期的时候。因此,保证了在master的任期内,其他节点不会错误的发起beMaster操作,导致master漂移。

对于master续约,如下图所示:

只需要在master有消息内,有master节点周期性的发起beMaster操作,对过期时间进行续约即可。在稳定的情况下,master角色会一直迭代下去。

如上是,一般的master选举与续约算法过程。但是我们可以看到,master的有效时间极其依赖了机器时间。一般在分布式算法中,不推荐对机器时间的依赖。因为机器时间是一个很不稳定的因素,比如时间的回退或者跳跃,都会导致分布式算法的未知状态与错误。

在master选举与续约中,有同样的问题,比如slave节点的机器时间跳跃,导致了slave节点认为master提前过期,slave节点就会错误的发起beMaster请求,会导致master的漂移,甚至出现脑裂现象。

而且paxos算法中,instanceId是随着每次propose请求顺序递增的,并且由paxos算法保证,每个节点instanceId的强一致性与顺序性。那么我们可以利用instanceId的变化来代替机器时间。把master有效期timeout时间,替换为n个instanceId的增长有内效。把周期时间的master续约,替换为m个instanceId的增加周期续约。如此便可以去除master选举与续约对于机器时间的依赖。

我们对于master有效的instanceId增长数量的选取极为重要。因为考虑到空集群,即没有任何propose请求的集群,中instanceId不会增长或增长的过于缓慢,会导致master永远不过期或有效期时间过长,导致master节点宕机,其他节点很久无法感知到。或者并发量过高的集群,instanceId增长过快,导致master有效期过短,beMaster操作过于频繁。

我们可以单独设置一种propose请求,专门用来做master有效期的instanceId的增长,我们称为master任期计数propose。该propose次数即为master的有效任期。比如,我们选取50ms进行一次master任期计数propose,假设原来master有效期为10秒,我们可以设置master有效期的instanceId增长数量为200,即进行200次master任期计数propose后,master过期。并且master续约,可以设置为50到60次master任期计数propose,续约一次。

同时,为了满足以时间为任期的master特性,即master节点认为自己过期时间一定早于其他节点认为master过期时间,我们可以设置master节点任期的instanceId增长数量为200,slave认为master节点任期的instanceId增长数量为220。

如此,我们用instanceId的增长替换了机器时间,是的master的选举与续约,不再依赖机器时间,因为对于机器时间的回退与跳跃不会产生任何影响。

总结,利用paxos算法自身的强一致性,我们单独增加一种master任期计数propose,周期性的进行改propose请求,假设周期间隔时间为s毫秒,master有效期为t毫秒,我们可以得到master任期的instanceId增长数量num=t/s。并且需要设置master的任期instanceId增长数量>slave节点的任期instanceId增长数量。并且在num/4+rand(num/8)个instanceId增长后,master进行续约。这里所说的instanceId增长均为master任期计数propose的instanceId增长。

如此我们达到了与依赖时间功能完全一致的master选举与续约算法,并且不再依赖机器时间。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章