Paxos算法主要目的是解决多名参与者就一个问题达成统一的意见。
角色解释:
1. proposer:为了对一个问题达成一致意见,不断提出更高编号的value(value选择是有约束的,Lamport主要是在加强这个约束。)
2. acceptor:对不同编号的proposal进行accepted,对小于目前accepted的最大编号的请求返回不予接受的响应,并带回目前针对这个问题的最高编号proposal的value。
3. learner:学习最终通过的决议。
4. 关键字:proposal
Proposal翻译过来为提案,每个proposer需要提出提案,没有提案何来决议。
Lamport经过不断加强几个约束来达到这个目的。详细解释不多说了,直接分析其为了达到一致意见描述的约束:
P1. An acceptor must accept the first proposal that it receives.
在理解这句话的时候自己纠结了很久,这条原则并不是什么约束条件,而是前提条件,acceptor必须accept他接收到的第一个proposal,不接受proposal如何达成一致意见。
如果每个acceptor都accept了不同的提案,那是不可能达到一致意见的,而不能达成多数派,于是乎,Lamport又引入一个概念:加了编号的proposal。目的就是解决该问题。
为了达成一个决议(比如:在proposerA,proposerB,proposerC中选举leader)proposerA可以提出提案proposal(1),proposal(2),带了编号以后这两个提案不再是一个提案了,是有区别的提案,假如proposal(1):选举A为LEADER,proposal(2):选举A为LEADER,即使这两个提案无论从内容还是为了达到的决议(选举一个leader)都是完全一样的,也会因为编号的不同,被区分为不同的提案。(补充一句:也就是说,为了就一个问题达成一致决议,每个proposer会提出很多不同编号的proposal,其目的就是为了满足P1前提条件,因为proposal(2)和proposal(1)不同,所以acceptor即使接受了proposal(1),也可以继续接受proposal(2))
P2. If a proposal with value v is chosen, then every higher-numbered proposal that is chosen has value v.
这里才是真正的约束条件了,我们先理解chosen(很关键)
引用原文:a value is chosen when a single proposal with that value has been accepted by
a majority of the acceptors. In that case, we say that the proposal (as well as its value) has been chosen.
这里面有几个重要部分:
a single proposal
been accepted by a majority of the acceptors
这里面的value v 可以认为是一个为了达到一个决议而提出的不同编号proposal的一个全局概念。如果针对同一个问题(这个概念我已经提了好几遍了)一个带有编号n的proposer 提出的带有value的proposal被chosen,那更大编号的被chosen提案的value必须也是这个value
详细解释如下:如果Proposal(1)和Proposal(2) ,Proposal(3),Proposal(4),这些proposal是为了达到同一目的而进行的提案,那他们中的包含的v,就是上面约束中这个v。例如:针对选择leader这一问题的提案假如有一个proposal(2),其value是:选择A机为leader,已经被多数acceptor accepted了,那么以后其他proposer提出的提案(当然编号会增大)如果被chosen,必须也是同样是选择A机为leader,满足这个约束,当然,一定,必然可以带来最后统一的决议。
这个约束是针对acceptor角色共同行为的(多数派达成统一意见),但实现起来很复杂,很麻烦(几乎无法实现)。
好,接下来我们加强约束,直到可以容易实现:
P2a. If a proposal with value v is chosen, then every higher-numbered proposal accepted by any acceptor has value v.
如果针对同一个问题(这个概念我已经提了好几遍了)一个带有编号n的proposer 提出的带有value的proposal被某个acceptor进行accepted,那其value必须也是这个value
满足这个约束,当然,一定,必然可以带来最后统一的决议(因为其对P2进行了加强)
这个约束是针对acceptor角色单个行为的,但实现起来很复杂,很麻烦(几乎无法实现)。
于是,继续加强约束:
P2b . If a proposal with value v is chosen, then every higher-numbered proposal issued by any proposer has value v.
如果针对同一个问题(这个概念我已经提了好几遍了)一个带有编号n的proposer 提出的带有value的proposal被chosen,那如果proposer提出更大编号的提案,其value必须也是这个value
这个约束是针对proposer角色单个行为的(多数派达成统一意见),但实现起来很复杂,很麻烦(几乎无法实现)。
at last 最终:一个更加加强的约束被提出来,并且容易实现:
P2c. For any v and n, if a proposal with value v and number n is issued,then there is a set S consisting of a majority of acceptors such that either (a) no acceptor in S has accepted any proposal numbered less than n, or (b) v is the value of the highest-numbered proposal among all proposals numbered less than n accepted by the acceptors in S.
如果一个proposer需要提出value是v编号是n的提案(目的就是指导如何提出一个提案,其编号和value该怎么选择),那么必须满足两个约束:
1. 存在一个多数派,这个多数派中的acceptor从来没有accepted任何小于n编号的proposal(针对同一个问题)
2. 存在一个多数派,这个多数派中的acceptor,其本身accepted的小于编号n的最高编号proposal的value就等于v。
满足这个约束也就满足了p2b,但是其利用数学归纳法的证明过程,sorry,实在没看懂,感叹自己数学水平严重后退。
也就是说就一个问题在proposal提出一个proposal之前,需要有一个prepare的过程,判断acceptor在针对这个问题的proposal中accepted的最大的编号是什么,通过的value又是什么,用以确定自己提出的proposal编号和value。