Fast Paxos( 分布式算法 简介)

标签:
fastpaxosit |
1. Fast Paxos概览
- Client/Proposer/Learner:负责提案并执行提案
- Coordinator:Proposer协调者,可为多个,Client通过Coordinator进行提案
- Leader:在众多的Coordinator中指定一个作为Leader
- Acceptor:负责对Proposal进行投票表决
另外在Classic
Paxos中,从每次Proposer提案到决议被学习,需要三个通信步骤:
Proposer-----Leader-----Acceptor-----Learner
从直观上来说,Proposer其实更“知道”提交那个Value,如果能让Proposer直接提交value到Acceptor,则可以把通信步骤减少到2个。Fast
Paxos便是基于此而产生。
2. Make Paxos Faster
我们再回顾下Classic
Paxos的几个阶段:
- Phase1a:Leader提交proposal到Acceptor
- Phase1b:Acceptor回应已经参与投票的最大Proposer编号和选择的Value
- Phase2a:Leader收集Acceptor的返回值
Phase2a.1:如果Acceptor无返回值,则自由决定一个
Phase2a.2: 如果有返回值,则选择Proposer编号最大的一个 - Phase2b:Acceptor把表决结果发送到Learner
- Phase1a:与之前相同
- Phase1b:与之前相同
- Phase2a:Leader收集Acceptor的返回值
Phase2a.1:如果Acceptor无返回值,则发送一个Any消息给Acceptor,之后Acceptor便等待Proposer提交Value
Phase2a.2:如果有返回值,则根据规则选取一个 - Phase2b:Acceptor把表决结果发送到Learner(包括Leader)
算法主要变化在Phase2a阶段,即:
- 若Leader可以自由决定一个Value,则发送一条Any消息,Acceptor便等待Proposer提交Value
- 若Acceptor有返回值,则Acceptor需选择某个Value
3 一些定义
Quorum
在Classic
Paxos中一直通过多数派(Majority)来保证算法的正确性,对多数派再进一步抽象化,称为“Quorum”,要求任意两个Quorum之间有交集(从而间接表达了majority的含义)
如果Leader发送了Any消息,则认为后续通信是一个Fast Round;若Leader未发送Any消息,还是跟之前一样通信,则后续行为仍然是Classic Round。根据Lamport描述,Classic Round和Fast Round可通过Round Number进行加以区分。
4 Any消息
比如,Fast Round
Number为10,Proposer1提交了(11,1),Proposer2提交了(12,2),但对Fast
Round来说存在(10,1,2)两个Value。
假如当前Leader正在执行第i个Classic Round(i-Quorum为Q)
,得到Acceptor反馈的最高编号为k,有两个value:v、w,说明Fast Round
k存在两个k-Quorum,Rv,Rw。
O4(v):下面定义在Round k中v或w被选择的条件:
如果v在Round k中被选择,那么存在一个k-Quorum R,使得对任意的Acceptor a∈Q∩R,都对v作出投票。
这个问题也可表述为:R中的所有Acceptor都对v作出投票,并且Q∩R≠φ,因为如果Q∩R=φ,则Round i将无法得知投票结果
因此如果保证下面两个条件:
- 每个Acceptor在同一Fast Round中仅投票一个Value
- Q∩Rv∩Rw≠φ
则v、w不可能同时被选择
6 确定Quorum
根据上面描述,为了防止一次Fast Round选择多个Value,Quorum需要满足下面两个条件:
- 任意两个Classic Quorum有交集
- 任意一个Classic Quorum与任意两个Fast Quorum有交集
不妨设总Acceptor数为N,Classic Round运行的最大失败Acceptor数为F,Fast
Round允许的失败数为E,即N-F构成Classic Round的一个Quorum,N-E构成Fast
Round的一个Quorum。
上面两个条件等价于:
- N>2F
- N>2E+F
设Qc,Qf分别为Classic和Fast
Round的Quorum大小,经过整理可得两个下限结果:
- |Qc| = |Qf| ≥ N − ⌈N/3⌉ + 1 ≥ ⌊2N/3⌋ + 1
- |Qc| ≥N-⌈N/2⌉+1 = ⌈N/2⌉+1
|Qf|≥N-⌈N/4⌉≥⌈3N/4⌉
7 冲突Recovery
作为优化,Acceptor在投票Value时也应该发送到Leader,这样Leader就很容易能发现冲突。Leader如果在Round
i发现冲突,可以很容易地开始Roun i+1,从Phase1a开始重新执行Classic
Paxos过程,但这个其实可以进一步优化,我们首先考虑下面这个事实:
如果Leader重启了Round
i+1,并且收到了i-Quorum个Acceptor发送的Phase1b消息,则该消息明确了两件事情:
- 报告Acceptor a参与投票的最大Round和对应的Value
- 承诺不会对小于i+1的Round作出投票
假如Acceptor a也参与了Round
i的投票,则a的Phase1b消息同样明确了上述两件事情,并且会把对应的Round,Value在Phase2b中发送给Leader(当然还有Learner),一旦Acceptor
a执行了Phase2b,则也同时表明a将不会再对小于i+1的Round进行投票。
也就是说,Round
i的Phase2b与Round i+1的Phase1b有同样的含义,也暗含着如果Leader收到了Round
i的Phase2b,则可直接开始Round
i+1的Phase2a。经过整理,产生了两种解决冲突(Recovery)的方法:
7.1 基于协调者的Recovery
如果Leader在Round
i
中收到了(i+1)-Quorum个Acceptor的Phase2b消息,并且发现冲突,则根据O4(v)选取一个value,直接执行Round
i+1的Phase2a;否则,从Phase1a开始重新执行Round i+1
7.2 基于非协调的Recovery
作为基于协调Recovery的扩展,非协调要求Acceptor把Phase2b消息同时发送给其他Quorum
Acceptor,由每个Acceptor直接执行Round
i+1的Phase2a,但这要求i-Quorum与(i+1)-Quorum必须相同,并且遵循相同选择value的规则。
这种方式的好处是Acceptor直接执行Round
i+1的Phase2a,无需经过Leader,节省了一个通信步骤,缺点是Acceptor同时也作为Proposer,搞的过于复杂。
8 Fast Paxos Progress
至此,再完整地总结下Fast
Paxos的Progress:
- Phase1a:与之前相同
- Phase1b:与之前相同
- Phase2a:Leader收集Acceptor的返回值
Phase2a.1:如果Acceptor无返回值,则发送一个Any消息给Acceptor,之后Acceptor便等待Proposer提交Value
Phase2a.2:如果有返回值
2.1 如果仅存在一个Value,则作为结果提交
2.2 如果存在多个Value,则根据O4(v)选取符合条件的一个
2.3 如果存在多个结果并且没有符合O4(v)的Value,则自由决定一个 - Phase2b:Acceptor把表决结果发送到Learner(包括Leader)
9. 总结
Fast
Paxos基本是本着乐观锁的思路:如果存在冲突,则进行补偿。其中Leader起到一个初始化Progress和解决冲突的作用,如果Progress一直执行良好,则Leader将始终不参与一致性过程。
因此Fast
Paxos理论上只需要2个通信步骤,而Classic Paxos需要3个,但Fast
Paxos在解决冲突时有至少需要1个通信步骤,在高并发的场景下,冲突的概率会非常高,冲突解决的成本也会很大。
另外,Fast
Paxos把Client深度引入算法中,致使其架构远没Classic Paxos那么清晰,也没Classic
Paxos容易扩展。
还有一点要注意的是,Fast
Quorum的大小比Classic的要大,一般Fast Quorum至少需要4个节点(3E+1),而Classic
Paxos需要3个(2F+1)(请参考:一致性算法中的节点下限)。
总之,在我看来Fast
Paxos是一个理论上可行,但实际中很难操作的算法,实际中用的比较多的还是Classic Paxos的各种简化形式
10 参考资料
- Fast Paxos(Lamport 2005)
- Multicoordinated Paxos
- On the Coordinator’s Rule for Fast Paxos
- Classic Paxos vs. Fast Paxos
- http://en.wikipedia.org/wiki/Paxos_(computer_science)
前一篇:ANT中FileSet的用法