组成
Paxos算法有proposer, accepter, leaner三种角色节点,其中proposer有点像客户端,而accepter是存储节点。
持久化需要
basic-Paxos是二阶段进行的
第一阶段
propose发起prepare请求,带上rnd
accpeter如果发现rnd,比如自己的lastrnd还小的话,就拒绝这个请求。
如果不是话,将set lastrnd = rnd。带上自己之前的value, 和valuernd
propose收到恢复,如果发现lastrnd的比我这个还大的话,那就gameover了。如果不是的话,从多个应答中选出valuernd最大的value,做为propose的值,因为不能改变之前的值(可能已经commit了),如果都没有value的话,可以用自己的value进行下一阶段
第二阶段
proposer发起写请求,参数是value,和rnd
accpeter如果发现rnd不等于请求的rnd的话,就拒绝写请求(保障别的propser没在两阶段空隙里写过值)
如果等于的话,就设置value,和 vrnd。
Paxos 还有一个不太重要的角色Learner, 是为了让系统完整加入的, 但并不是整个算法执行的关键角色, 只有在最后在被通知一下.
<<paxos make simple>> 这篇论文描述了对一个value产生共识,但是对多个value怎么产生共识呢?对于kv存储来说,可以用key和version来做,这样的话我们就可以改变一个key的值,只是这个值在version上,同时accepter的信息也在单独的version上。也就是说,我们起多个proposer对不同的version或者不同的key上的value改值的话,我们就可以修改了。
优化
multi-paxos
就是有点像raft一样
fast-paxos
fast-paxos通过增加quorum的数量来达到一次rpc就能达成一致的目的. 如果fast-paxos没能在一次rpc达成一致, 则要退化到classic paxos.
要拓展到3/4 的数量的
原因
Partial Order Round Number = Paxos + 2PC
Paxos 中主要只用到了 rnd
的大小关系的性质. 我们可以用一个可以用任意的偏序也能保障paxos算法的正确性(不需要每个都可以比较大小)
补充
全序和偏序
Reference
Paxos: (扩展): Partial Order Round Number = Paxos + 2PC - 知乎
周刊(第21期):Lamport时钟介绍 - codedump的网络日志
可靠分布式系统-paxos的直观解释-2 - 知乎
Paxos算法 | Calvin's Marbles