之前看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要递增。
以上是论文的笔记。