PAXOS演算法讀書筆記
一 概述
paxos 是一種提高分散式系統容錯性的一致性演算法。
二 演算法理解
1 問題描述
假設一組可以提出提案的程序集合,對於一個一致性演算法來說,需要滿足以下幾點:
- 在這些提出的提案中,只有一個會被選定
- 如果沒有提案被提出,就不會有被選定的題案
- 如果一個提案被選定後,程序應該可以獲取被選定的提案資訊。
從整體上說,paxos演算法的目標是保證最終會有一個提案被選定,當提案被選定以後,程序最終也能獲得被選定的提案。
在該一致性演算法中,有三種角色:Proposer,Accepter,Listener。
2 演算法描述
在這裡,我們使用一個全域性性的編號來唯一標識每一個被Accepter批准的提案,因此此處的提案變成了一個由編號與Value組成的集合。為了保證系統的可用性,一般認為系統存在多個Accepter,當多數Accepter批准某個提案,我們就認為該提案的Value被選定。
我們希望在只有一個提案被提出的情況下,仍然可以選出一個提案,這暗示了下面的需求:
P1:一個Accepter必須批准它收到的第一個提案。
我們雖然允許多個提案被選定,但必須保證所有被選定的提案具有相同的value值。因此我們需要以下約定:
P2:如果編號為M0,Value值為V0的提案被選定,那麼所有比編號M0更高的,且被選定的提案,它的Value值必須是V0.
我們可以通過以下條件來滿足P2:
P2a:如果編號為M0,Value值為V0的提案被選定,那麼所有比編號M0更高的,且被Accepter批准的提案,它的Value值必須是V0.
如果需要同時滿足條件****P1和P2a,我們需要對P2a進行強化:
P2b:如果編號為M0,Value值為V0的提案被選定,那麼之後產生的比編號M0更高的,被提出的提案,它的Value值必須是V0.
還有一個增強條件P2C,在證明裡面我們會證明P2b與P2C的關係。
P2C: 對於任意的Mn和Vn,如果提案【Mn,Vn】提出,那麼肯定存在一個由半數以上的Accepter組成的集合S,滿足以下兩個條件中的一個:
1. S中不存在任何批准過編號小於M0提案Accepter
2. 選取S 中批准過的所有編號小於Mn的提案,編號最大的那個提案的value值為Vn
2.1 說明P2b與P2C的關係
論證P2b的成立:
如果某個提案【M0,V0】被選定了,那麼任何編號大於M0的提案,其Value值都是V0.
證明:
採用歸納假設法證明P2b,也就是需要證明:
假定編號在M0到M(n-1)之間的提案,其Value值是V0,證明編號為Mn的提案的編號也為V0.
因為某個編號為M0的提案被選定了,那麼肯定存在一個由半數以上的Accepter組成的集合C,C中的每個Accepter都批准了該提案。再結合歸納假設,‘編號M0的提案被選定’意味著:
C中的每個Accepter都批准了一個編號在M0到M(n-1)範圍內的提案,並且每個編號在M0到M(n-1)範圍內被批准的提案,其Value值都是V0。
因為任何包含半數以上Accepter的集合S中至少包含了C中的一個成員,因此如果保持了P2C的不變性,那麼編號為Mn的提案的value也為V0。
2.2 接下來採用數學歸納法,由P2c證明P2b
假定提案【M0,V0】被選定,我們需要證明在P2c的前提下,對於所有的被提出的提案【Mn,Vn】,Vn=V0,也就是證明了P2b。
(1)初始條件:如果編號為M0,Value值為V0的提案被選定,當Mn=M0+1時,根據P2c,它符合第二個條件項,所以Vn=V0;
(2)遞推:根據歸納假設:‘’假定編號在M0到M(n-1)之間的提案,其Value值是V0‘’ ,肯定存在這樣一個子集S,S中的Accepter已經批准了小於Mn的提案,那麼編號為Mn的提案的Value值只能是S中小於Mn但為最大編號的那個提案的值,只能是V0.
三 proposer 生成提案
按照P2c的論述,提案生成方式:
(1)Proposer選擇一個新的提案編號Mn, 然後向某個Acceptor集合的成員傳送請求,要求改集合的Acceptor做出如下響應:
- 向Proposer承諾,保證不再批准任何小於Mn的編號的提案
- 如果Acceptor已經批准過任何提案,那麼其就向Proposer反饋當前Acceptor已經批准過的編號小於Mn但為最大編號的那個提案的值
(2) 如果Proposer收到了來自半數以上的Acceptor的響應結果,那麼它就可以產生編號為Mn,Value值為Vn的提案,這裡的Vn是所有響應中編號最大的提案的Value的值。當然,如果半數以上的Acceptor沒有批准過任何提案,即響應中不包含任何提案,那麼此時Vn的值就可以由Proposer任意選擇。