分散式系統與單機系統的一項標誌性差異,在於**部分失效(partial failure)**的概念:系統中某個元件失效時,可能影響部分元件的正常運作,同時又讓其他元件完全不受波及。相較之下,非分散式系統的失效往往是全面性的——牽連所有元件,輕易就能拖垮整個系統。
因此,分散式系統設計的一個重要目標,是讓系統能自動從部分失效中復原,且不嚴重影響整體效能:失效發生、修復進行期間,系統應以可接受的方式繼續運作——也就是容忍故障(tolerate faults),在故障存在下仍維持一定程度的運轉。系統若能遮蔽失效的發生並從中復原、在失效存在時繼續運作,就稱為容錯。
本章在容錯的一般背景之後,依序探討幾項核心技術:
- 行程韌性(process resilience):讓一個或多個行程失效而不嚴重干擾系統其餘部分,作法是把行程複製成群組。
- 可靠的主從通訊:通訊失效下的點對點通道與 RPC 語意。
- 可靠多播(reliable multicasting):保證訊息送達一群行程,常是維持行程間同步的必要條件。
- 分散式提交(distributed commit):許多應用(如分散式交易)要求原子性——交易中的每個操作要嘛全做、要嘛全不做,其基礎正是分散式提交協定。
- 復原(recovery):失效發生後,何時、如何保存分散式系統的狀態,以便日後還原。
本章重點#
- 失效有多種類型:當機失效(行程逕自停止)、遺漏失效(不回應請求)、時序失效(回應太早或太遲)、回應失效(回應內容錯誤),以及最難處理的任意(拜占庭)失效——行程可能表現出任何形式的失效。
- 冗餘是達成容錯的關鍵技術。應用到行程上,就是行程群組:群組中一或多個行程失效,不影響群組所提供服務的可用性;這通常要求群組內通訊高度可靠,並遵守嚴格的順序與原子性性質。
- 可靠群組通訊在小群組尚屬可行;要支撐大群組,關鍵在減少接收者回報收訖與否的回饋訊息量。
- 要求原子性時更棘手:原子多播協定的核心,是每個成員對「訊息送達了哪些成員」持有相同視圖,可用虛擬同步執行模型精確表述——成員資格不變的區段之間有邊界,訊息不得跨越邊界。
- 群組成員變更是「所有行程對同一份成員清單達成共識」的例子,可透過提交協定解決:**兩階段提交(2PC)**應用最廣——協調者先詢問所有行程是否同意執行同一操作,第二輪再多播表決結果;**三階段提交(3PC)**則能在協調者當機時,不必阻塞所有行程等它復原。
- 容錯系統的復原離不開定期做檢查點。檢查點完全分散、但代價昂貴,因此許多系統結合檢查點與訊息日誌——記錄行程間的通訊,當機後即可重放系統的執行。