重新审视Paxos协议的Quorum问题
Flexible Paxos: Quorum intersection revisited 这篇论文重新审视了Paxos中关于Quorum的问题。在Basic Paxos中,要求任何quorum都有交集(通常选择多数派作为quorum)。事实上,这个要求可以放宽到Paxos的两个阶段prepare/accept阶段的quorum有交集即可。文中描述了majority, simple, grid三种quorum system。
Flexible Paxos: Quorum intersection revisited 这篇论文重新审视了Paxos中关于Quorum的问题。在Basic Paxos中,要求任何quorum都有交集(通常选择多数派作为quorum)。事实上,这个要求可以放宽到Paxos的两个阶段prepare/accept阶段的quorum有交集即可。
我们从Basic Paxos证明过程简单描述为什么放宽后算法依然正确(原论文最后给了一个TLA+的形式化证明)。
在前文Basic Paxos证明过程中,我们看到,Theorem 1的证明关键点在于。
的存在,使得如果后续的Ballot C想投票,则在prepare阶段,一定会通过
问到Ballot B投的dec。
那么,在Basic Paxos协议中,条件之所以成立,是因为
并且
。
由此我们可以知道,Basic Paxos协议要求任何quorum都是有交集是保证Paxos协议正确性的充分不必要条件。我们可以把约束放宽到即可。
这个条件表达的意思是,prepare阶段和accept阶段的quorum交集不空即可。文中称这种协议为Flexible Paxos。
放宽的方式可以多种多样。论文描述了几种可能的方式。为行文描述方便,prepare阶段的quorum记为Q1,accept阶段的则记为Q2。
第一种,Majority quorums
也是多数派的约束,但是跟Basic Paxos略有差别。在Basic Paxos中,要求两个阶段的quorum都至少是。这里可以放宽为,如果n是偶数,
为至少是
,
至少是
。n是奇数的话,不能按这种方式放宽。
如果正好的机器宕机了,Multi Paxos中,只要leader仍然活着,accept阶段可以继续progress(注,Multi Paxos协议中,prepare请求为从某个instance之后的所有的无穷多个instance做prepare)。不过如果leader宕机了,Mutli Paxos需要重新执行prepare阶段时,也是无法进行下去的。
第二种,Simple quorums
在第一种majority quorumns基础上继续的一个泛化,把条件改为。
这种方式下,如果设大,
就可设小一点。那么,accept阶段就可以减少需要同步的节点数,只是leader宕机后重新prepare时就只能容忍较少的节点宕机。反之,accept阶段需要同步的节点更多,但重新prepare时只需要较少的节点在线。
这种quorum跟Dynamo的NRW方案很像:数据被冗余N份,写操作只写其中的W份,读操作只读取R份,如果W+R>N,则一定能不会漏掉早于读取前完成的写结果。Paxos也是类似,在prepare阶段也一定要获取到可能已经被确认的决议的值。
第三种 Grid quorum
Grid quorum system:将个节点分为
的矩阵。
Paxos要求任意两个quorum都有交集。因此在grid quorum system里,Paxos可以选择quorum为一行加一列。任意两个quorum都有交集,如左图。这种选择最多允许任意个节点宕机,即宕机一整行或者一整列就会导致协议走不下去。假设蓝色表示
,绿色表示
。
在Flexible Paxos协议下,根据和
交集不空的约束,
可以为一行大小
,
可以为一列大小
。这样,正常运行无宕机时,只需要同步
个节点即可。
需要指出的是,与simple quorum system不一样,grid quorum system下,节点本身不再是完全对等的。例如在上图中,4个节点宕机,左图prepare和accept阶段都无法推进,但是右图中,如果4个节点在同一列,则accept阶段可以继续推进,只要不需要进行prepare阶段,系统仍可持续服务。
2 条留言 访客:0 条 博主:0 条 引用: 2 条
来自外部的引用: 2 条