關於Paxos的歷史

感謝phylips@bmy

----------------------------

關於Paxos的歷史  

作者:phylips@bmy

出處:http://duanple.blog.163.com/blog/static/709717672012112203543166/


自Paxos提出,迄今已有20多年了,圍繞着該算法曾經發生過一些非常有趣的事情,這些也已成爲人們津津樂道的一段軼事,故事的主角自然是Paxos的提出者Lamport,當然Lamport的特立獨行也是很早就出了名的。首先來講述下這些有趣的八卦,之後會再理一下Paxos的整個發展過程,以及在這個過程中產生的一系列比較重要的論文,總共會涉及到十幾篇論文,如果有時間還是最好都研讀一下。由於時間關係,我也只是選擇了其中最爲重要的三篇,進行了閱讀,並將它們翻譯了出來,稍後會整理出來。 


關於這段歷史, Lamport本人在他的“My Writings”裏對於論文<<The Part-Time Parliament>>的整個從創作到發表的過程,也做過非常詳細的描述。我們還是先從這裏開始吧。


“上世紀80年代末,SRC(Systems Research Center,DEC於1984年創立,Lamport也曾在此工作過)構建了一個被稱爲ECHO的容錯文件系統。該系統的構建者們聲稱,系統可以保證在發生任意數目的非拜占庭式錯誤情況下的一致性,並且只要有半數以上的進程可以正常工作,它就可以保證系統向前運轉。對於大多數像這樣的系統來說,在沒有錯誤發生的時候都是很簡單的,但是要處理好實現者所有能夠想到的各種錯誤的話,是需要一個非常複雜的算法的。我感覺他們在做的事情基本上是不可能的,並打算去證明它。結果事與願違,在這個過程中我發現了Paxos算法,也就是本文描述的那個。該算法的核心實際上是一個三階段的一致性協議。Dale Skeen應該是第一個意識到爲避免任意可能的單點失敗引起的阻塞需要引入三階段協議的人。但是,據我所知,Paxos是第一個具有清晰正確性條件說明及完整正確性證明的真正意義上的三階段提交算法。

無論那時,還是現在,我一直認爲Paxos是一個非常重要的算法。在寫此文之前,我通過採用拜占庭將軍的描述方法使得一致性問題成功地被人們所接受(即論文The Byzantine General Problem),受此啓發,我決定通過一個古希臘島嶼上的議會來描述該算法。Leo Guibas提議將這個島命名爲Paxos。我又用工作在該領域的計算機科學家的名字對裏面的希臘議員進行命名,並在 Guibas的幫助下翻譯成了僞造的希臘方言。(論文題目是由Peter Ladkin提議的)。通過描述一個失落的文明,既增加趣味性又可以讓我免於陳述其中乏味的細節,只要直接聲明一下關於該議會協議的某些細節已經遺失就可以了。爲了讓這種形象化的描述更逼真,我還戴上了Stetson氈帽屁股繫上了小酒瓶裝扮成印第安納瓊斯style的考古學家,進行了幾次演講。

只是我這種嘗試不幸地失敗了。那些參加我演講的人們只記住了印第安納瓊斯style,而不是該算法。閱讀該論文的人們看起來也飽受裏面的希臘故事的干擾以至於根本沒有理解該算法。在我發論文給他們閱讀的那些人中,其中 Nancy Lynch(分佈式理論研究大牛,<<Distributed Algorithms>> 一書作者), Vassos Hadzilacos, 和Phil Bernstein聲稱已經讀完。大概兩個月後,我給他們發了封郵件,郵件內容爲“是否能夠實現一個可以容忍任意數目(可能是所有)的進程出錯且能保存一致性的分佈式數據庫,同時當半數以上進程恢復正常時該系統也能夠恢復正常”。但是他們並沒有人意識到該問題與Paxos算法間的關聯。

我在1990將該論文提交給了TOCS。三個審稿者都認爲該論文儘管並不重要但還有些意思,只是應該把其中所有Paxos相關的內容刪掉。在該領域工作的人們如此缺乏幽默感,實在令人生氣,此後我也沒有對該論文做任何修改。很多年後,在SRC工作的兩個人需要爲他們正在構建的分佈式系統尋找一些合適算法,而Paxos恰恰提供了他們想要的。我就將論文發給他們,他們也沒覺得該論文有什麼問題。下面是Chandu Thekkath所講述的Paxos在SRC的歷史:

“在Ed Lee和我從事Petal相關的工作時,我們需要一種提交協議來確保分佈式系統中的全局操作即使是在發生故障的情況下也能保證正確性。我們瞭解到一些3PC的概念,並閱讀了Bernstein, Hadzilacos, 和 Goodman的經典書籍<<Concurrency Control and Recovery in Database Systems>>,對其進行了研究。我們發現這個協議有些難以理解,於是放棄了對它進行實現的嘗試。大概也是在這個時間,Mike Schroeder與我們談起Leslie Lamport 曾經發明瞭一個一致性方面的協議並建議我們直接問下Leslie本人。後來Leslie給了Ed一份<<The Part-Time Parliament>>文章的拷貝,我們兩都讀地很happy。我尤其喜歡其中的幽默,直到今天也無法理解爲什麼人們都不太喜歡這篇文章。Paxos具備我們的系統所需要的所有屬性,同時我們也覺得能夠將它實現出來。此外Leslie還爲我們提供了很多諮詢幫助,這樣就產生了我所知的Paxos算法的第一個實現(包含了動態重配置)。一年後,我們又用Paxos實現了Frangipani file system所需的分佈式鎖服務器”

因此,我覺得重新發表該論文的時機到了。

與此同時,在整個悲催的經歷中(指論文一開始被拒,沒有人重視),Butler W.Lampson(1992年圖靈獎得主)是一個例外,他立刻意識到這個算法的重要性,並在他的演講和一篇論文(即<<How to Build a Highly Availability System using Consensus>>)中對該算法進行了描述,這引起了Nancy Lynch的關注。此後De Prisco, Lynch和Lampson發表了他們那個版本的描述和證明(即<<Revisiting the PAXOS algorithm>>)。他們那篇論文的發表更使我確信是時候發表我的這篇論文了。於是我提議當時TOCS的編輯Ken Birman發表該論文。他建議我再修改下,比如添加一個關於該算法的TLA描述。但是重讀該論文後,我更確信其中的描述和證明已經足夠清晰,根本不需要再做改動。誠然,該論文可能需要參考下最近這些年發表的研究成果進行修訂。但是一方面作爲一種joke式的延續,另一方面爲保存原有工作,我建議不是再寫一個修訂版本,而是以一個被最近發現的手稿的形式公佈,再由Keith Marzullozz做注。Keith Marzullo很樂意這樣幹,Birman也同意了,最終該論文得以重見天日。

這樣該論文就有了一些有趣的排版註腳{!即論文<<The Part-Time Parliament>>裏Keith Marzullo的那些注,具體內容見原文}。爲了讓Marzullo的註解更顯眼,我認爲它們應該印在一個灰色背景上。那時ACM剛獲取了一些非常棒的排版軟件,同時TOCS也準備不再接收camera-ready copy。不幸的是,他們的新軟件做不出陰影效果。於是,我不得不爲那段文字提供一個camera-ready copy。但是,他們的那個牛逼軟件只能以漂浮圖的形式接收我提供的這個拷貝,因此Marzullo的註釋的畫面效果看起來可能並不理想。還有更不幸的是,他們那個超級昂貴的軟件竟然不支持數學公式。(好吧,畢竟他們是一家計算機期刊,so可能不需要對公式排版吧…)。因此我又不得不爲A2節裏的不變性定義提供一個camera-ready copy,在發表的版本里他們將它作爲了圖3。這就是那張圖裏的字體看起來與其他部分的字體並不匹配的原因。

該論文獲得了2012年的ACM SIGOPS Hall of Fame Award{!是不是很熟悉,之前介紹過的Lamport的另一篇文章<<Time Clocks and the Ordering of Events in a Distributed System>>就獲得了2007年的該獎項。該獎項始創於2005年,主要頒發給那些在操作系統領域產生了深遠影響的論文,這些論文都至少經過了十年的檢驗。獲獎結果將會在每年的OSDI或SOSP(操作系統領域頂級會議,通常是偶數年開OSDI,奇數年開SOSP)上宣佈。今年的OSDI上除Lamport的這篇獲獎外,Liskov(2008年圖靈獎得主,她導師是1971年圖靈獎得主John McCarthy)1988年寫的<<Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems>>也是獲獎論文,這兩篇都是Paxos相關的。}

從上面可以看到,在Lamport的各種挖坑和吐槽下,已有無數人中槍,連ACM的排版軟件也不能倖免(好吧,其實此處Lamport有爲他的LaTeX打廣告之嫌)。關於該論文的整個曲折的發表過程就是這樣的。另外值得關注的是SRC,它的Petal和Frangipani是不是非常類似於Google的某些東西啊,而且在<<The Part-Time Parliament>>發表前,這些系統就已經完成了Paxos的實現。


現在我們重新回到Paxos。它的整個發展過程實際上大概可以分爲三個階段。


第一個階段,爲算法創立階段,基本就是88年和89年,代表性事件是88年Liskov發表 <<Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems>>89Lamport寫出了<<The Part-Time Parliament>>,並在90年將它提交給TOCS。這兩篇都是獨立完成的,而且Liskov那篇還要早些,但是因爲上述種種軼事,大家最終還是稱之爲Paxos,而且在Paxos的盛名下,Liskov那篇估計更少有人知道了。最早指出二者本質上是一樣的人是Butler Lampson。在這個階段,這兩篇論文基本上都還沒有人關注。當然這兩篇論文的殊途同歸,也從一個側面說明解決異步一致性問題基本上也沒有其他的路子可走。


第二個階段,可以從開始引起理論研究界的重視算起。代表性事件是96年Butler Lampson發表<<How to Build a Highly Availability System using Consensus>>。正是經過Lampson的大力宣傳,該算法才逐漸爲理論研究界的人們所重視,也直接導致了The Part-Time Parliament的重新發表。爲啥當年Lamport一方面費盡心機地扮考古學家,另一方面千辛萬苦把論文寫的那麼幽默,都沒能讓理論界的人們看上眼,而Lampson振臂一揮,就有無數響應呢?這可能是因爲天時、地利、人和吧,從時間上來看,此時人們對於一個分佈式一致性算法的需求日益緊迫,而且與Lamport相比,Lampson明顯說話還是要更有分量些,Lampson 92年就拿到了圖靈獎,江湖地位自然高些,而且他更善於把複雜的問題講清楚,另外還有就是功力的確深厚,就算Lamport這樣的人物對其也是佩服得不行。這篇論文發表之後,後續便引出了一系列關於Paxos的研究。1999年,De Prisco, Lynch和Lampson聯合在TCS(Theoretical Computer Science)發表了<<Revisiting the PAXOS algorithm>>對Paxos算法進行了全新的描述及證明,分析了其時間開銷及容錯性。2001年,Lampson又寫了一篇<<The ABCD’s of Paxos>>對Paxos的各種不同形式進行了描述,包括AP:Abstract Paxos;BP:Byzantine Paxos;CP:Classic Paxos;DP:Disk Paxos,發表在PODC’01上。也是在這一年,在參加PODC會議時,Lamport發現人們還是覺得Paxos很難理解,於是回家後對Paxos進行了重新描述和表達後,形成了<<Paxos Made Simple>>這篇文章,而這篇文章基本上就是The Part-Time Parliament的一個簡化版本。可以看出,到了2001年,Paxos已經成爲理論界關注的熱點。2005年,Lamport又寫了篇<<Fast Paxos>>,對經典Paxos算法進行了改進。


第三個階段,由Google發表的兩篇論文開啓,也是從那時起Paxos開始從理論界進入工業實踐,並被越來越多的工程技術人員所熟知。2006年,Google有兩篇論文發表在OSDI上,一篇是<<Bigtable:A Distributed Storage System for Structured Data>>,另一篇就是<<The Chubby lock service for loosely-coupled distributed systems>>,而在Chubby這篇中有這樣一段話“Indeed, all working protocols for asynchronous consensus we have so far encountered have Paxos at their core”。另外還有一句流程甚廣的話,“世上只有一種一致性算法,那就是Paxos—Mike Burrows”,這句話可能是出於這篇文章<<Consensus Protocols: Two-Phase Commit>>,是否爲Mike Burrows的原話就不得而知了,但是Chubby中的那句的確與這話十分接近。Chubby發表之後,開源社區也推出了與之對應的Zookeeper。此後,Paxos逐步爲大衆所瞭解,至少聽說過的人越來越多了。Google除了Chubby那篇,當然實際上Chubby實際上並未講述Paxos相關的內容,還有另一篇非常好的文章<<Paxos Made Live>>,這篇文章詳細解釋了Google實現Paxos中越到的各種問題及解決方案,講述瞭如何將理論應用到實踐,而二者之間通常都是具有很大的鴻溝的,尤其是在分佈式系統領域,往往都是理想豐滿現實悲慘。其實這篇已經完全超越了Paxos算法本身,重要的不是如何實現Paxos(實際上大多數人都不需要實現Paxos),而是應理解如何將理論應用到實踐,如何彌補理論與實踐的差異,如何進行分佈式系統的工程實現,如何進行分佈式系統的測試,而實踐中的很多問題理論界並沒有給出答案。 


另外,如果要自己實現Paxos,還有如下幾篇文章可供參考:<<Paxos Made Code>>作者Macro Primi,他實現了一個Paxos開源庫libpaxos,更多信息可以參考此處。<<Paxos Made Moderately Complex>>,這篇比較新,2011年才發表的,該文章介紹了很多實現細節,並提供了很多僞代碼,一方面可以幫助理解Paxos,另一方面也可以據此實現一個Paxos。<<Paxos Made Practical>>是少有的一篇對Liskov的那篇論文進行重新解讀的文章,主要介紹如何採用Paxos實現replication,如果要讀Liskov的那篇,也可以同時參考這篇。除了Macro Primi的那個開源實現外,目前還可以找到如下一些Paxos實現的代碼:Java版Python版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章