分散式系統:原理與範式 封面

分散式系統:原理與範式

👨‍💼: Andrew S. Tanenbaum & Maarten van Steen
📅: February 26, 2016
Buy Now
📖:
分散式系統的經典教科書:前半以九章建立架構、通訊、命名、同步、一致性、容錯、安全等原理,後半用同一組軸線檢視物件、檔案系統、Web 與協調模型四種範式。
📘 深度概覽

作者背景#

塔能鮑姆(Andrew S. Tanenbaum)是阿姆斯特丹自由大學(Vrije Universiteit Amsterdam)的電腦科學榮譽教授,也是電腦科學界最具影響力的教科書作者之一——《Modern Operating Systems》、《Computer Networks》、《Structured Computer Organization》長期是全球資工系的標準教材。他更為人知的是 MINIX:一套為教學而寫的類 Unix 作業系統,其原始碼與隨附教材直接啟發了年輕的 Linus Torvalds 寫出 Linux(兩人後續關於微核心與單核心的公開辯論本身已成為電腦史的一部分)。他也主持過 Amoeba 分散式作業系統與 Globe 廣域分散式系統等研究專案,本書中的多個案例即出自這些工作。

范斯汀(Maarten van Steen)當時同在阿姆斯特丹自由大學任教,研究領域涵蓋大規模分散式系統、同儕網路與自我管理系統,後轉往特芬特大學(University of Twente)主持數位社會研究所。兩人後續合作的第三版與第四版改以免費電子書形式發行。

完整摘要#

本書要處理的是一個教學上的難題:分散式系統的知識高度碎片化——RPC、時鐘同步、一致性模型、共識、複製、安全,各自有龐大的文獻與術語,初學者難以看出它們如何組成一個整體。作者的解法是全書貫穿的雙層結構:先用九章建立獨立於任何具體系統的原理(principles),再用四章檢視實際的範式(paradigms),而每一個範式章節都嚴格依照同一組軸線展開——架構、行程、通訊、命名、同步、一致性與複製、容錯、安全。這個體例本身就是本書最大的教學設計:讀者看完四遍之後,那組軸線會內化成分析任何分散式系統的檢查表。

原理部分(第 1–9 章)。第 1 章從硬體史切入——1980 年代中期微處理器與高速網路的匯流,讓「用網路把大量電腦組成運算系統」第一次變得容易——並建立分散式系統的定義目標:資源共享、分佈透明性、開放性與可擴展性,同時指出這些目標彼此衝突。第 2 章(第二版新增)處理架構,區分軟體架構與系統架構,並引入本書後續反覆使用的概念:中介軟體(middleware)作為隔離應用與底層平台的層次、集中式/去中心化/混合式三類組織,以及以回饋控制迴圈組織的自主系統。第 3 章談行程,重點在執行緒如何讓通訊與本地處理重疊、虛擬化如何同時帶來可攜性與失效隔離,以及程式碼遷移。第 4 章處理通訊,先講協定分層,再依序展開 RPC、訊息導向中介軟體、資料串流與多播四種模型——核心論點是「若不把網路的原始通訊設施換成更高階的抽象,大規模分散式應用的開發將極為困難」。

第 5 章談命名,並給出一個容易被忽略的洞見:分散式與非分散式系統在命名上的差異不在名稱本身,而在命名系統的實作方式——命名系統自己就是分散的,這個分散方式直接決定它的效率與可擴展性;本章依序處理人性化名稱(DNS、檔案系統)、與位置無關的定位(行動實體、分散式雜湊表 DHT),以及最困難的屬性式命名。第 6 章談同步,路線是從以實際時間為基礎的時鐘同步,走向只在乎相對順序的邏輯時鐘,再到分散式互斥與選舉演算法。第 7 章處理一致性與複製,是全書最具份量的一章:複製為了可靠性與效能,代價是一致性維護;本章區分資料為中心客戶端為中心兩類一致性模型(後者在大規模系統中往往才是可行選項),並把「一致性是什麼」與「一致性協定怎麼實作」分開處理。第 8 章談容錯,開宗明義點出分散式系統與單機系統的標誌性差異是部分失效,並依序處理行程韌性、可靠的主從通訊與 RPC 語意、可靠多播、分散式提交與復原。第 9 章談安全,強調安全必須遍及整個系統——任一設計缺陷都能讓所有措施形同虛設——並分成通訊安全(安全通道)與授權(存取控制)兩部分,加上金鑰與憑證的管理。

範式部分(第 10–13 章) 把上述九條軸線各套用一次。分散式物件系統(CORBA、Java RMI/EJB、Globe)示範分佈如何藏在物件介面之後,以及遠端方法呼叫與 RPC 的關鍵差異——全系統物件參考解決了許多妨礙 RPC 存取透明性的參數傳遞問題。分散式檔案系統(NFS、Coda)的核心議題是共享語意:UNIX 語意在分散式環境難以有效率地實作,於是有了作業階段語意與交易式語意等妥協。分散式 Web 系統把 Web 視為由數百萬客戶端與伺服器組成的巨型分散式系統,從 CERN 的超文本計畫講到 Web 服務時代「以服務而非文件為中心」的轉向。分散式協調系統則代表另一代設計:不再假設元件原本集中、再想辦法讓分散透明,而是假設元件天生就是分散的,真正的難題是協調;本章以參照解耦與時間解耦兩個維度分類協調模型,並以發佈/訂閱典範為主要案例。

第二版相對第一版的主要更新是大幅擴充去中心化與同儕運算(含檔案分享、資訊散播、CDN、發佈/訂閱),新增感測器網路、虛擬化、伺服器叢集與網格運算,並把一致性的討論轉向更適合現代系統的模型。

本書的貢獻與定位#

本書的貢獻是體系。與後來廣受歡迎的《Designing Data-Intensive Applications》相比,Kleppmann 那本從實務痛點出發、以說服力見長,本書則是標準的教科書寫法——定義、模型、演算法、案例,追求覆蓋的完整性與術語的精確性。要判斷「這個問題屬於哪一類、前人已經給出哪些解法」,本書仍是最快的地圖;要理解「一個真實系統為什麼這樣取捨」,Kleppmann 更直接。

它與同工作區另外兩本的關係是層次上的互補:《Designing Distributed Systems》與《Kubernetes Patterns》處理的是「有了容器編排平台之後,該怎麼組織系統」,而本書處理的是那些平台底下的機制——為什麼需要租約、為什麼共識困難、為什麼最終一致性在大規模下是務實選擇。前兩本告訴你怎麼用,本書告訴你為什麼會長成那樣。

主要受眾是修習分散式系統課程的學生、準備系統設計面試需要建立完整地圖的工程師,以及想補齊理論基礎的實務者。需留意的是第二版成書於 2006 年前後,具體案例(CORBA、Coda、TIB/Rendezvous)多數已退出主流,共識演算法的當代主角 Raft 與雲原生時代的實務也未涵蓋;但原理部分的分類與論證——尤其是一致性模型、部分失效與命名——至今仍是這個領域的通用語言。