Paxos算法

组成

Paxos算法有proposer, accepter, leaner三种角色节点,其中proposer有点像客户端,而accepter是存储节点。

持久化需要

Paxos算法_第1张图片

 

basic-Paxos是二阶段进行的

第一阶段

propose发起prepare请求,带上rnd

Paxos算法_第2张图片

accpeter如果发现rnd,比如自己的lastrnd还小的话,就拒绝这个请求。

如果不是话,将set lastrnd = rnd。带上自己之前的value, 和valuernd

propose收到恢复,如果发现lastrnd的比我这个还大的话,那就gameover了。如果不是的话,从多个应答中选出valuernd最大的value,做为propose的值,因为不能改变之前的值(可能已经commit了),如果都没有value的话,可以用自己的value进行下一阶段

第二阶段

proposer发起写请求,参数是value,和rnd 

Paxos算法_第3张图片

 accpeter如果发现rnd不等于请求的rnd的话,就拒绝写请求(保障别的propser没在两阶段空隙里写过值)

如果等于的话,就设置value,和 vrnd。

Paxos 还有一个不太重要的角色Learner, 是为了让系统完整加入的, 但并不是整个算法执行的关键角色, 只有在最后在被通知一下.

Paxos算法_第4张图片

<> 这篇论文描述了对一个value产生共识,但是对多个value怎么产生共识呢?对于kv存储来说,可以用key和version来做,这样的话我们就可以改变一个key的值,只是这个值在version上,同时accepter的信息也在单独的version上。也就是说,我们起多个proposer对不同的version或者不同的key上的value改值的话,我们就可以修改了。

优化

multi-paxos

就是有点像raft一样

Paxos算法_第5张图片

fast-paxos

fast-paxos通过增加quorum的数量来达到一次rpc就能达成一致的目的. 如果fast-paxos没能在一次rpc达成一致, 则要退化到classic paxos.

要拓展到3/4 的数量的

原因

Paxos算法_第6张图片

Partial Order Round Number = Paxos + 2PC

 Paxos 中主要只用到了 rnd 的大小关系的性质. 我们可以用一个可以用任意的偏序也能保障paxos算法的正确性(不需要每个都可以比较大小)

Paxos算法_第7张图片

 补充

全序和偏序 

Paxos算法_第8张图片

Reference

Paxos: (扩展): Partial Order Round Number = Paxos + 2PC - 知乎

周刊(第21期):Lamport时钟介绍 - codedump的网络日志

可靠分布式系统-paxos的直观解释-2 - 知乎

Paxos算法 | Calvin's Marbles 

你可能感兴趣的:(MIT,6.824学习记录,分布式,算法)