01 / 導讀
導讀
引用
van Steen, M., & Tanenbaum, A. S. (2023). Distributed Systems (4th ed.). distributed-systems.net. 作者網站提供免費的個人化副本:https://www.distributed-systems.net/index.php/books/ds4/
章節概要
全書共九章。據作者的分頁介紹,本版與第三版的結構保持接近:現有分散式系統的例項放在與其相應的一般原理旁邊,初讀時可以跳過的內容放在加框的小節裡,區塊鏈系統及其組成部分貫穿全書討論。所有 Python 程式碼都已更新到 Python 3,完整的示例可從作者網站獲得。
第 1 章:Introduction(引言)
開篇一章從聯網系統講到分散式系統,並區分分散式系統與去中心化系統。它提出設計目標(資源共享、分佈透明性、開放性、可靠性、安全和可擴充性),對分散式系統進行分類(叢集和網格計算等高效能計算、分散式資訊系統與應用整合,以及包括行動計算和感測器網路在內的普適系統,並涉及雲-邊緣連續體),最後討論開發分散式系統時的陷阱。
第 2 章:Architectures(架構)
第 2 章從架構風格(分層、基於物件、RESTful,以及釋出-訂閱或基於協調的風格)和中介軟體的作用講起,然後比較系統架構:分層與多層的集中式設計,對稱分散式設計(結構化與非結構化對等系統、超級節點、BitTorrent),以及混合設計(雲端計算、邊緣伺服器架構和區塊鏈)。
第 3 章:Processes(行程)
本章涵蓋執行緒、虛擬化(包括容器,以及虛擬機器與雲端計算的關係)、使用者端、伺服器(總體組織、狀態、物件伺服器,示例包括 Apache 和內容分發網路),以及程式碼遷移,包括虛擬機器的遷移。
第 4 章:Communication(通訊)
本章從分層協定和通訊型別講起,然後講遠端程式呼叫、面向訊息的通訊(通訊端、請求-應答、釋出-訂閱、管道、MPI,以及基於訊息代理的佇列式訊息傳遞)和多播通訊,包括應用層多播和用於資訊傳播的流行病協定。
第 5 章:Coordination(協調)
第 5 章涵蓋時鐘同步、邏輯時鐘與向量時鐘、互斥與選舉演算法,以 ZooKeeper、Raft 以及工作量證明或權益證明式選舉為例。隨後轉向基於 gossip 的協調、分散式事件匹配,以及 GPS 和 Vivaldi 等定位系統。
第 6 章:Naming(命名)
命名一章區分名字、識別符號和位址,涵蓋平面命名(廣播、轉發指標、基於家鄉的方法、Chord 等分散式雜湊表)、結構化命名(名字空間、解析、DNS、NFS)、基於屬性的命名(目錄服務、LDAP)和命名資料網路。
第 7 章:Consistency and Replication(一致性與複製)
本章先解釋為什麼要複製資料,然後講以資料為中心的一致性模型(順序一致性、因果一致性、最終一致性和連續一致性)、以客戶為中心的一致性模型(單調讀與單調寫、讀己之寫、寫跟隨讀)、副本管理、一致性協定(基於主節點的協定和複製寫協定),以及 Web 中的快取與複製。
第 8 章:Fault Tolerance(容錯)
本章先介紹可靠性與故障模型,然後講行程彈性與共識,涵蓋基於泛洪的共識、Raft、Paxos 和拜占庭容錯(PBFT),並包括 CAP 定理。接著是可靠的使用者端-伺服器通訊與組通訊、分散式提交(兩階段提交),以及透過檢查點和訊息日誌進行的恢復。
第 9 章:Security(安全)
安全一章涵蓋安全威脅、策略和機制(包括隱私與 GDPR)、密碼學、認證(共享金鑰、Needham-Schroeder、公鑰、Kerberos、TLS)、分散式系統中的信任(女巫攻擊與日蝕攻擊、區塊鏈方法)、授權(存取控制、委託、OAuth),以及透過防火牆和入侵檢測進行監控。
核心概念
第 1–4 章:基礎
- 分佈透明性與可擴充性:對使用者和應用隱藏分佈,並在規模和地域上增長。
- 架構風格與中介軟體:元件和聯結器如何組織,包括對等、雲、邊緣和區塊鏈系統。
- 虛擬化與程式碼遷移:在多臺機器之間執行和遷移軟體。
- RPC 與面向訊息的通訊:行程交換資料的主要方式。
第 5–6 章:協調與命名
- 邏輯時鐘與向量時鐘:在沒有全域性時鐘的情況下給事件排序。
- 互斥與選舉:協調存取並選出領導者。
- 平面、結構化與基於屬性的命名:定位實體,以 Chord 和 DNS 為例。
第 7–9 章:一致性、容錯與安全
- 一致性模型:針對複製資料的以資料為中心和以客戶為中心的保證。
- 共識與分散式提交:Paxos、Raft、PBFT 和兩階段提交。
- 認證、授權與信任:密碼協定與存取控制。
評析
優點
- 原理優先,系統相伴。 作者說明現有系統的例項被放在討論一般原理的地方,各章圍繞反覆出現的問題(命名、協調、一致性、容錯)展開,而不是羅列產品。
- 可執行的程式碼。 所有 Python 程式碼已更新到 Python 3,作者稱幾乎所有示例都可以透過一個簡單指令碼執行;完整的示例和插圖放在可下載的壓縮包中。
- 主題新。 區塊鏈系統貫穿全書,目錄中包括雲與邊緣架構、容器、Raft 與 Paxos、拜占庭容錯、GDPR 和 OAuth。
- 開放獲取。 個人化的電子版是免費的,另有 PDF 和 PPTX 格式的整套幻燈片,並提供幻燈片的 LaTeX 源檔案。
- 標出可選內容。 加框的小節初讀時可以跳過,新手可以順著主線讀下去。
侷限
- 關於資料系統的章節較少。 事務、分散式檔案系統和多媒體都沒有獨立成章:NFS 示例出現在架構和命名之下,巢狀事務出現在第 1 章應用整合的討論中。想多瞭解儲存和事務的讀者需要另一本書。
- 實踐中的摩擦。 作者指出,有些示例需要安裝 Redis 等特殊軟體包,而且免費副本的申請可能需要一段時間才能處理。
- 自行出版。 本書由作者自己發行,紙質版透過 Amazon 出售,後來的版本(4.01 到 4.03)帶有小的更正,所以讀者應確認自己和課程使用的是哪個版本。
- 程式碼經過簡化。 正如作者所說,程式碼示例為了易讀省略了許多細節,所以它們用於說明思想,而不是生產級實作。
在課程中的定位
van Steen 和 Tanenbaum 的這本書是本課程書目中原理優先的分散式系統教材。Coulouris、Dollimore、Kindberg 和 Blair 的 Distributed Systems: Concepts and Design 更長(21 章)、更早(2011 年),給中介軟體、安全、事務和詳細的案例研究更多篇幅,所以兩書可以互相替代或互補。Vitillo 的 Understanding Distributed Systems 是面向開發者的簡明入門,可以先讀;Kleppmann 和 Riccomini 的 Designing Data-Intensive Applications 是對資料系統的實用研究,涵蓋複製、分割槽和流處理,填補了上面提到的儲存和事務方面的空白。
Cachin、Guerraoui 和 Rodrigues 的 Introduction to Reliable and Secure Distributed Programming 是研究生教材,精確規定廣播、共享記憶體和共識抽象,是讀完本書第 5 章和第 8 章之後自然的下一步。Pacheco 的 An Introduction to Parallel Programming 則是另一條路線,教人在多核機器和叢集上編寫並行程式。
如何使用本書
本書適合高年級本科生和研究生一年級學生的分散式系統課程,也適合構建聯網服務的軟體工程師。作者的分頁沒有列出先修要求;一些程式設計經驗有助於理解 Python 示例,作業系統和網路方面的一些背景則有助於理解行程和通訊兩章。
實用的安排:
- 核心: 第 1、2 章,然後是第 4 章(通訊)、第 5 章(時鐘、互斥、選舉)、第 7 章(一致性與複製)和第 8 章(容錯與共識)。
- 選讀: 作業系統背景薄弱的讀第 3 章;第 6 章講命名;第 9 章講安全,可以獨立閱讀。
- 練習: 下載程式碼和插圖壓縮包,執行 Python 示例(安裝所需軟體包),並用幻燈片複習。初讀時跳過加框的小節。
- 核對版本: 使用免費副本的當前版本(4.03 或更高),因為作者在做小的更正時保持頁碼不變。
