paxos算法

之前看wiki上paxos算法,花了一些时间却感觉讲得不是很理解。吸取教训,直接读这篇Paxos Made Simple(http://www.cs.utexas.edu/users/lorenzo/corsi/cs380d/past/03F/notes/paxos-simple.pdf),作者也是该算法发明人Lamport。

proposal从发出到被最终选中分为两个阶段:

Phase 1:

proposer先发出prepare request,即选择一个proposal number n,发给大多数acceptor,acceptor接收之后判断它是否大于之前它回应的所有prepare request中的proposal number,如果是,就作出回应:

1)保证不接受小于n的proposal;

2)自己接受到小于n的最大proposal number v(如果有的话)。

Phase 2:

proposer如果接收到多数acceptor的回应,它就发出accept request,即n带一个值v(这个v是收到所有phase 1 response中最大的v,如果response中不存在v,则是任意值)。

acceptor收到之后判断是否有收到更大n的prepare request,没有的话它就接受proposal。

那么learner如何获知选中的proposal呢?

最简单方法是让每个accptor通知每个learner,这样开销太大,简单点可以给一个特别的learner(distinguished learner),让它通知所有learner。但是单点问题比较严重。为了缓解这个问题,可以它acceptance通知给一个distinguished learner集合,让他们通知所有learner。

由于消息可能丢失,learner对被选中的值无法确知它是否被多数acceptor选中,这时learning可以提一个proposal,使用上述协议,可以确知值是否被选中。

实现:

网络中每个进程同时扮演proposer,acceptor,learner。通过上述算法挑选出leader,担任distinguished proposer和distinguished learner。acceptor需要稳定存储,即使在挂掉之后仍然记得自己接受到的最大proposal number。必需保证不同的proposer使用不同集合内的proposal number,自己使用proposal number要递增。


以上是论文的笔记。

你可能感兴趣的:(分布式,paxos)