Preliminary
系统包括:
AcceptorProposerLearner
Proposer生成一项提议,发送给Acceptor,Acceptor如果接受该提议,那么系统所有成员达成共识(即:该提议生效),通过Learner获取共识的内容。
可能存在的问题:
- 如果有多个
Acceptor,会出现多个Acceptor同时接受多个不同的提议的情况; - 如果只有一个
Acceptor,一旦Acceptor出现故障,那么系统将无法运作;
PS: 下文中的接收是指收到一个请求,接受是指 accept 一项提议。
算法流程:
第一阶段:
-
Proposer生成一个系统下唯一的ID:;
-
Proposer向大多数Acceptor发送prepare请求(附带),目的是需要得到
Acceptor的如下承诺:-
Acceptor需要忽略掉 ID 小于的请求
-
-
Acceptor如果接收到上述请求,如果Acceptor接收过其他Proposer发送的prepare请求且对应的ID如果大于,那么忽略该请求(不给出承诺),否则回复上述请求。回复的内容包括:
- 该
Acceptor接受过的 ID 小于且最接近
的 某一项提议(抽象为一个值
)
- 如果没有,则返回空
- 该
第二阶段:
-
Proposer如果接收到大多数Acceptor的回复,Proposer向大多数Acceptor发起accept请求。请求的内容包括:- 这些回复的提议中 ID 最大的那项提议的值,如果没有则自拟一项提议
-
prepare请求中发送的
- 当
Acceptor接收到accept请求时,假设对应的提议ID为。如果该
Acceptor做过不接受ID小于的提议的承诺,那么就忽略掉该请求,否则则接受这项提议。
第三阶段:Learner 收集所有 Acceptor 接受的提议,完成共识算法。
分析
-
一旦系统达成共识,那么该共识就不会改变,比如:
-
Proposer 1发送一项提议给大多数的Acceptor,Proposer 1获得大多数Acceptor的回复后,拟定一项提议Proposal 1发送给Acceptor达成共识; -
Proposer 2如果要发送另外一项提议给大多数Acceptor,这些Acceptor中的部分已经接受了Proposal 1,根据上述算法,Proposer 2只能提出提议Proposal 1给Acceptor;
-
-
存在不同的
Acceptor接受不同的Proposal,比如:-
Proposer 1发送一项提议Proposal 1给大多数的Acceptor,在一部分Acceptor未接受这项提议时,另外一个Proposer 2发起了另一项提议Proposal 2给这些Acceptor; - 因为
Proposal 2的ID要比Proposal 1的ID要大,因此这部分既收到了Proposer 1发送的prepare请求又收到了Proposer 2发送的prepare请求的Acceptor肯定只会接受Proposal 2; - 这种情况只有在
Proposer 2发送prepare请求的Acceptor都没有接受Proposal 1时才成立 ;
-
少数
Acceptor出现故障,不会影响系统的正常运行;存在一个
Acceptor接受多个提议的情况,此时这多个提议的值是一样的;