一致性投票算法 :(分布式网络系统)(共识算法)
过程:
Paxos第一阶段:预提案(准备Perpare/诺言Promises)
提议者Proposer:
向接受者Acceptor广播预提案,附带接下来提案Proposal的proposal_id
接受者Acceptor:
收到预提案后更新a_proposal_id = max(proposal_id,a_proposal_id),如果预提案的proposal_id>a_proposal_id,Acceptor回复记录的接受过的proposal_id最大的提案。
【第一阶段A:Proposer选择一个提议编号n,向所有的Acceptor广播Prepare(n)请求。
第一阶段B:Acceptor接收到Prepare(n)请求,若提议编号n比之前接收的Prepare请求都要大,则承诺将不会接收提议编号比n小的提议,并且带上之前Accept的提议中编号小于n的最大的提议,否则不予理会。】
Paxos第二阶段:提案阶段(Paoxs接纳Acceptance)
提议者Proposer:
等待直到收到大多数接受者对预提案的回复,从所有回复的提案组成的法定数目的提案集合K中挑选proposal_id最大的提案,以该提案的值作为本次提案的值。
如果K是空集,那么可以给提案任意赋值。然后把该提案广播给接受者们,提案和预提案共享同一个proposal_id。
接受者Acceptor:
如果收到的提案的proposal_id>= a.proposal_id,那么接受这个提案,更新a_proposal_id = max(proposal_id,a_proposal_id),更新记录的提案。
【第二阶段A:整个协议最为关键的点:Proposer得到了Acceptor响应
如果未超过半数accpetor响应,直接转为提议失败;
如果超过多数Acceptor的承诺,又分为不同情况:
如果所有Acceptor都未接收过值(都为null),那么向所有的Acceptor发起自己的值和提议编号n,记住,一定是所有Acceptor都没接受过值;
如果有部分Acceptor接收过值,那么从所有接受过的值中选择对应的提议编号最大的作为提议的值,提议编号仍然为n。但此时Proposer就不能提议自己的值,只能信任Acceptor通过的值,维护一但获得确定性取值就不能更改原则;
第二阶段B:Acceptor接收到提议后,如果该提议版本号不等于自身保存记录的版本号(第一阶段记录的),不接受该请求,相等则写入本地。】
总结:
Paxos算法是保证在分布式系统中写操作能够顺利进行,保证系统中大多数状态是一致的,没有机会看到不一致,因此,Paxos算法的特点是一致性>可用性。
vector clock向量时钟是另外一种保证复制的算法,其特点是可用性>一致性,但是,一旦发生冲突,不像Paxos能自行解决,需要人工干预编写代码解决。
Paxos算法和Vector Clock都是由Leslie Lamport提出。