Paxos算法是基於消息傳遞且具備高度容錯特性的一致性算法,是目前公認的解決分佈式一致性問題最有效的算法之一,其解決的問題就是在分佈式系統中如何就某個值(決議)達成一致。算法
在常見的分佈式系統中,總會發生諸如機器宕機或網絡異常(包括消息的延遲、丟失、重複、亂序,還有網絡分區)(也就是會發生異常的分佈式系統)等狀況。Paxos算法須要解決的問題就是如何在一個可能發生上述異常的分佈式系統中,快速且正確地在集羣內部對某個數據的值達成一致。也能夠理解成分佈式系統中達成狀態的一致性。網絡
Paxos算法運行在容許宕機故障的異步系統中,不要求可靠的消息傳遞,可容忍消息丟失、延遲、亂序以及重複。它利用大多數 (Majority) 機制保證了2F+1的容錯能力,即2F+1個節點的系統最多容許F個節點同時出現故障。異步
一個或多個提議進程 (Proposer) 能夠發起提案 (Proposal),Paxos算法使全部提案中的某一個提案,在全部進程中達成一致。系統中的多數派同時承認該提案,即達成了一致。最多隻針對一個肯定的提案達成一致。分佈式
Paxos將系統中的角色分爲提議者 (Proposer),決策者 (Acceptor),和最終決策學習者 (Learner):學習
在多副本狀態機中,每一個副本同時具備Proposer、Acceptor、Learner三種角色。spa
階段一(prepare階段):
(a) Proposer選擇一個提案編號N,而後向半數以上的Acceptor發送編號爲N的Prepare請求。Pareper(N).net
(b) 若是一個Acceptor收到一個編號爲N的Prepare請求,若是小於它已經響應過的請求,則拒絕,不迴應或回覆error。若N大於該Acceptor已經響應過的全部Prepare請求的編號(maxN),那麼它就會將它已經接受過(已經通過第二階段accept的提案)的編號最大的提案(若是有的話,若是尚未的accept提案的話返回{pok,null,null})做爲響應反饋給Proposer,同時該Acceptor承諾再也不接受任何編號小於N的提案。blog
階段二(accept階段):
(a) 若是一個Proposer收到半數以上Acceptor對其發出的編號爲N的Prepare請求的響應,那麼它就會發送一個針對[N,V]提案的Accept請求給半數以上的Acceptor。注意:V就是收到的響應中編號最大的提案的value(某個acceptor響應的它已經經過的{acceptN,acceptV}),若是響應中不包含任何提案,那麼V就由Proposer本身決定。進程
(b) 若是Acceptor收到一個針對編號爲N的提案的Accept請求,只要該Acceptor沒有對編號大於N的Prepare請求作出過響應,它就接受該提案。若是N小於Acceptor以及響應的prepare請求,則拒絕,不迴應或回覆error(當proposer沒有收到過半的迴應,那麼他會從新進入第一階段,遞增提案號,從新提出prepare請求)。it
參考:https://blog.csdn.net/u013679744/article/details/79222103
https://zhuanlan.zhihu.com/p/31780743