个人理解,如果有不对之处,请指出。
Paxo算法用于分布式算法,为的是保证CAP中的consistency。
算法的目的是加速整个cluster的replication数据一致。
然后就需要明确几个概念:
算法中的主要成员:
- Proposer:负责提交提案,为了简单表示可以用[V, N], value代表提案中的数据,N其实就是代表优先级N,简单点地说,小于N的一般提案都不起作用。
- Learner:Acceptor告知learner哪些value被选定了
- Acceptor : 只要Acceptor接受某个提案,Acceptor就认为该提案的value就被选定了。
最终要达到的效果就是Proposer,Acceptor和Learner都认为同一个value被选定了。也就是保证最终有一个value被选定了,当value被选定后,进程最终也能获取到被选定的value。
叙述Paxos算法的流程:
总共分为两个阶段:
Phase 1:
- Proposer选择了一个提案编号N,向半数以上的Acceptor发送编号为N的Prepare请求。
- 如果Acceptor已经接受过提案,那么就向Proposer响应已经接受过的编号小于N的最大编号的提案。
Phase 2:
- 如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它会发送一个针对[N, V],V就是收到的响应中编号最大的提案的value,如果响应中不包含任何提案,那么V就由Proposer自己决定。
- 如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求作出过响应,它就接手该提案。
Learner学习被选定的value有三种方案:solution 1:Acceptor接受一个提案,然后发送给所有learner,solution 2: Acceptor接受一个提案,就将该提案发送给主learner,然后分发。 3. 接受一个提案,然后发送到一个集合里,然后再分发。
具体推导待有时间再学习,整个算法流程还是很清楚的。
Reference:
http://blog.jobbole.com/110389/
https://bitbucket.org/sciascid/libpaxos.git