Paxos理論介紹(1)
這篇文章摘取部分我在微信內部關於Paxos的分享PPT,通過註解的方式嘗試與大家說明白樸素Paxos的理論證明。
為何要重點說樸素的Paxos?個人認為這個才是Paxos的精髓所在,也是所有Paxos相關演算法的基石所在。另外本文將著重講解Paxos的演算法推導過程,而不是執行過程。因為以在我學習演算法的經驗來看,推導過程對於掌握一門演算法至關重要,只有掌握了理論推導過程,才能明白這個演算法每一個步驟的含義。
這些PPT內容大部分都引自Lamport的論文 “The Part-Time Parliament” .
頁1註解
這是PPT的題圖,擺在中間的正是Paxos最為重要的三條約束,掌握這三條約束,即可掌握樸素Paxos。
頁2註解
在正式開始講解之前,希望拋開所有對Paxos的展開,而回到最樸素的Paxos。最樸素的Paxos解決什麼問題?這裡舉個例子:三個人分別只允許呆在不同的三個城市,他們手上有一張紙和一支筆,他們可以在紙上寫下任何內容,但是,當他們停下他們的筆之後,我們希望三個人最後寫下的內容都是一樣的。
這個就是最樸素的Paxos嘗試解決的問題,確定一個值。暫時千萬別去想更多的東西,聚焦在確定一個值這麼一個看似非常簡單的事情身上。
頁3註解
直入主題,提出一輪投票的定義。通過投票來決定一個提議,是一個非常原始的方法,也是非常顯然的公理,這裡不展開說。這裡提議對應剛剛說到的這個值。這一頁每個定義都要弄明白,因為下面會常常用到這些定義。比如你要記住,一輪投票會有一個編號標識他們,稱之為Bbal。你還要理解集合的意思,一輪投票集合B概括了這一輪投票的所有參與人,投票編號,提議,以及投票情況等。
頁4註解
很顯然,一輪投票是解決不了一致性問題的,因為任意一個人都有可能去發起投票,而不能靠上帝去指定某個人去發起,所以必然會面臨多輪投票帶來的問題。這裡提出多輪投票的定義。注意這個多輪投票集合的定義是希臘字母Beta,一輪投票集合是大寫字母B,是不一樣的。我們希望尋求方法解決多輪投票帶來的衝突,從而去達到確定一個值的目標。
頁5註解
最重要的定義MaxVote的提出。要嘗試解決多輪投票帶來的衝突問題,必然要去建立多輪投票之間的聯絡,MaxVote是一個聯絡。
MaxVote通過給出一個編號,以及成員,可以在多輪投票裡面找到這些成員小於這個編號的所有投票當中,最大編號的那個投票。然後我們希望用到這次投票對應的提議。仔細閱讀樣例表格裡面的每個MaxVote,從而去理解這個定義。
頁6註解
在提出了所有數學定義後,就可以去理解這最優美的三個約束條件了。正是通過這三個約束,使得多輪投票的衝突問題得到解決。
第一點很好理解,要求每輪投票的編號唯一。第二點要求任意兩輪投票的Bqrm交集不為空,其實意思很明確,就是要求Bqrm超過半數的意思。第三點是解決衝突的關鍵所在,它強行約束了每輪投票的提議,使得這輪投票的提議不與之前的產生衝突。通俗一點講就是,一旦我發現在我之前已經有人投過某個提議的票,那我就要用這個提議,並且是我之前最大編號的投票對應的提議,作為我這次的提議。
頁7註解
這是在三個約束條件之下的多輪投票過程。反覆閱讀這兩頁,從而理解約束條件3。注意在約束條件下,提議內容的變化。
頁8註解
看似這個投票過程可以引出最終一致的提議內容,但嚴格的演算法推導必然需要嚴格的證明。這裡提出反證法。
頁9註解
這一頁已將證明過程進行簡化,相信經過你們認真的推敲,肯定是可以搞明白的。注意表格裡面的樣例,當編號為2的這輪投票已經通過後,又出現了一輪編號為3的投票(2和3中間不可能存在一輪投票),提議跟之前的衝突。我們通過推導得出這個情況是不存在的。
頁10註解
前面只是提出MaxVote的定義,這裡解釋計算這個MaxVote的實際操作過程。其實就是我們慣用的輪詢法,逐個問唄。只要每次發起投票前,都想多數派的成員逐一詢問它們比我當前這輪投票編號小的最大編號投票,即可獲得整個集合的MaxVote,從而確定當前這輪投票的提議。
頁11註解
聰明的讀者可能早已經發現問題了,我們上文所說的多輪投票,似乎編號都是嚴格遞增的,但是現實情況完全不是這樣,現實的多輪投票往往都是亂序的,這個大家應該毫無疑問。那麼在這種情況下,MaxVote的值可能是會錯的。想象一下,在算出一個MaxVote(5,…)之後,才出現一個編號比5小的投票,那麼這個投票很有可能會影響到這個MaxVote的值。也就是一個先來後到的亂序問題。而如果MaxVote是錯的,我們的證明就失效了。
頁12註解
為了滿足這個約束,我們需要對MaxVote的計算過程進行約束。
看過Paxos演算法過程的,且是聰明的讀者,看完這頁可能會想起,哦原來Prepare的Promise要求是這麼來的。
頁13註解
到這裡演算法已經是非常完善了,剩下就是怎麼將這個演算法引申到計算機上,在計算機層面上提出演算法的過程。大家可以看到實際的演算法過程,很多角色都是與我們剛剛描述的東西相對應的。
頁14註解
正式演算法過程,也就是Lamport的論文 “Paxos Made Simple” 提出的。
我希望大家再回頭看這個演算法過程時候,知道每一步的含義,以及背後的本質。
頁15註解
一個過程演示,這個就不多解釋了。
結語
樸素Paxos演算法不容易,需要反覆的推敲,建議有耐心的讀者多看幾遍,只要有耐心,肯定是可以弄懂的。關於這個演算法有什麼用?如何去實現?請檢視我們的歷史文章,裡面有更多分享。
個人理解關鍵點:
1.MaxVote的規則
2.prepare中promise過程的原因。保證單調增。
3.明白確定一個值了就能夠確定連續的多個值