2.1.3 Proposer行为分析
(1.1) 向所有的Acceptors发送Prepare(N_A)请求;
(1.2) 如果收到Reject(N_H)信息,那么重新发送Prepare(N_H+1);
(2.1) 如果收到Acceptors集合的任意一个Majority的Promise(N_A, V_A)回复,那么如果所有的V_A均为空,Proposer自由选取一个V_A’,回发Accept(N_A, V_A’);否则回发Accept(N_A, V_i);
(2.2) 如果收到Nack(N_H),回到(1.1)过程,发送Prepare(N_H+1);
(3.1) 如果收到任意一个Majority所有成员的Accepted信息(表明选举完成),向所有Proposers发送自身成为leader的消息;
(3.2) 向Learner发送value值。其中:
N_A为该次提案的编号;
N_H为当前提案的最高编号;
V_i为V_A中提案编号最高的value;
(1.1)接收Prepare(N_A),如果N_A>N_H,那么回复Promise(N_A, V_A),并置N_H=N_A;否则回复Reject(N_H)
(2.1)接收Accept(N_A, V_A),如果N_A<N_H,那么回复Nack(N_H)信息(暗示了该Proposer提完案后至少有一个其余的Proposer广播了具有更高编号的提案);否则设置this.V_A=V_A,并且回复Accepted信息。其中:
Promise(N_A, V_A):向Proposer保证不再接受编号不大于N_H的提案;
Accepted向Proposer发送提案被通过信息;
V_A为Acceptor之前审批过的提案(允许为空);
N_H为Acceptor之前接收提案的最高编号。
相对来说,Learner的行为理解更简单一些:学习value,开始执行任务。
算法在执行过程中,实例和实例之间是异步的;角色和角色之间既有同步的行为(因为一个完全异步的系统中,一致性问题将是无法被解决的[6]),又有异步的行为。下表2.1中按照我的理解以全局的角度来说明这其中的关系:
表2.1 一次Paxos实例
角色 / 时段
Phase 1
Phase 2
Phase 3
Proposer (P)
[1]竞争Leader: 向A发送prepare
[1]接收A的promise
[2]选取一个value并发送accept
(*)
Acceptor (A)
[1]接收处理P的prepare
[2]回复reject或promise
[1]接收处理accept
[2]回复accepted或nack
[3]通知L
(*)
Learner (L)
无
无
[1]接收广播学习value或
[2]创建Proposer对象学习value