Paxos算法

解决的问题


Paxos要解决的问题,是分布式系统中的一致性问题。在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本,这些副本会放置在不同的物理的机器上。为了对用户提供正确的读/写/删/改等语义,我们需要保证这些放置在不同物理机器上的副本是一致

image

如上图所示,Client会将数据写到三个不同的Server上,如何保证写在这三个不同Server上的数据是一致的,这便是Paxos要解决的问题。 对上述问题进一步抽象,我们假设Replica A的初始状态是S0, 然后用户一次操作称为一个OP, 那么任意时刻,Replica A的状态Sn,都是在S0的基础,执行一系列操作{OP1, OP2, …, OPn}的结果,即:
Sn = S0 + {OP1, OP2, ..., OPn}
由于client与server、server与server之间是用网络连接的,则由网络协议带来的不可靠、不确定性将会影响这三个server到达一个一致状态。

过程

过程涉及2个阶段

image

当Acceptor收到phase-1的请求时:
● 如果请求中rnd比Acceptor的last_rnd小,则拒绝请求
● 将请求中的rnd保存到本地的last_rnd.
    从此这个Acceptor只接受带有这个last_rnd的phase-2请求。
● 返回应答,带上自己之前的last_rnd和之前已接受的v.
当Proposer收到Acceptor发回的应答:
● 如果应答中的last_rnd大于发出的rnd: 退出.
● 从所有应答中选择vrnd最大的v: 不能改变(可能)已经确定的值
● 如果所有应答的v都是空,可以选择自己要写入v.
● 如果应答不够多数派,退出
image

Proposer:
   收到的回应个数有没有超过N/2。如果没有超过,那么此轮结束,proposer重新提议
   发送phase-2,带上rnd和上一步决定的v
Acceptor:
● 拒绝rnd不等于Acceptor的last_rnd的请求
● 将phase-2请求中的v写入本地,记此v为‘已接受的值’
● last_rnd==rnd 保证没有其他Proposer在此过程中写入 过其他值

posted @ 2016-03-06 21:11  熊猫太郎  阅读(904)  评论(0编辑  收藏  举报