任何可能出錯的東西都會出錯
故障與部分失效
- 單機與分散式系統差異:單機軟體執行較可預測,硬體正常時操作結果具確定性,遇硬體問題多導致整個系統故障。而分散式系統會面臨部分失效情況,具有不確定性,其部分元件可能以不可預知方式損壞,這使分散式系統工作難度增加
- 不同計算系統的故障處理:高效能運算(HPC)領域的超級計算機多用於科學計算,作業常將計算狀態存檔,節點故障時通常停止叢集工作負載,重啟後從檢查點繼續,類似將部分失敗升級為完全失敗來處理。雲端計算則與多租戶資料中心等相關聯,節點由商品機器構建,故障率較高,需構建容錯機制,允許系統容忍故障節點繼續工作,以保障服務不中斷。
- 構建可靠系統的思路:即便元件不可靠,也可透過如糾錯碼、TCP 協議等機制構建更可靠的系統,但可靠性有限。在分散式系統中要接受部分故障可能,將容錯機制融入軟體設計,考慮各種錯誤情況並測試,不能簡單假設缺陷罕見。
不可靠的網路
- 網路問題表現及處理:網路是分散式系統中機器通訊的唯一途徑,多為非同步分組網路,存在請求丟失、排隊、遠端節點失效或響應延遲等諸多問題,導致難以區分故障原因,通常採用超時機制處理,但超時設定面臨長時等待或誤判節點失效的兩難困境
- 真實世界網路故障情況:計算機網路建設多年,仍普遍存在故障,如資料中心網路、公有云服務都受其困擾,人為錯誤是網路中斷主因,且網路分割槽等故障若處理不當會引發嚴重後果,需明確軟體應對方式並測試
- 檢測故障的難點與方法:判斷節點是否故障較難,雖存在如作業系統關閉 TCP 連線、指令碼通知、查詢交換機、路由器回覆等可反饋故障資訊的情況,但不能完全依賴,多數情況無反饋,需重試並結合超時判定節點狀態。
- 為什麼需要自動檢測故障節點
- 負載平衡器需要停止向已死亡的節點轉發請求(即從移出輪詢列表(out of rotation))。
- 在單主複製功能的分散式資料庫中,如果主庫失效,則需要將從庫之一升級為新主庫
- 為什麼需要自動檢測故障節點
- 網路擁塞和排隊影響:網路資料包延遲的可變性常源於排隊,受交換機、作業系統、虛擬機器等多因素影響,TCP 執行流量控制也會帶來延遲。不同應用對延遲敏感度不同,像視訊會議等用 UDP 以犧牲可靠性換低延遲,多數系統需透過實驗或藉助故障檢測器來確定合適的超時時間。
- 計算機網路上資料包延遲的可變性通常是由於排隊
- 交換機佇列填滿
- 目標機器的cpu繁忙
- 多個虛擬機器爭搶cpu
- TCP執行流量控制
- 怎麼解決多租戶資料中心的網路擁塞問題
- 原因:在公共雲和多租戶資料中心中,資源被許多客戶共享:網路連結和交換機,甚至每個機器的網路卡和CPU(在虛擬機器上執行時
- 解決辦法:透過實驗方式選擇超時:在一段較長的時期內、在多臺機器上測量網路往返時間的分佈,以確定延遲的預期變化。然後,考慮到應用程式的特性,可以確定故障檢測延遲與過早超時風險之間的適當折衷。
- 更好的辦法:不是固定的常量超時時間,而是連續測量響應時間及其變化來自動調整超時時間
- 計算機網路上資料包延遲的可變性通常是由於排隊
- 同步網路與非同步網路對比:將資料中心網路與傳統固定電話網路對比,後者為同步網路,建立電路時分配固定頻寬,保證最大端到端延遲固定(稱之為有效延遲),而資料中心網路和網際網路採用分組交換協議,針對突發流量最佳化,但存在網路擁塞、排隊及無限延遲問題,目前技術難以保障網路延遲或可靠性。
- 延遲和資源利用關係:延遲變化可視為動態資源分割槽結果,電話網路線路是靜態資源分配,網際網路則動態分享頻寬,各有利弊,靜態分配可實現延遲保證但利用率低、成本高,動態分配利用率高但有可變延遲缺點。
不可靠的時鐘
- 時鐘分類及特點:現代計算機有時鐘(實時時鐘)和單調鍾兩種時鐘,時鐘根據日曆返回日期時間,常與 NTP 同步但存在跳躍、精度有限等問題,不適用於測量經過時間;單調鍾用於測量持續時間,保證一直前進但絕對值無意義,不同計算機的單調鍾值不可比,在分散式系統中測量超時等情況較適用。
- 時鐘同步與準確性問題:獲取時鐘的方法存在諸多不可靠和不準確因素,如石英鐘漂移、NTP 同步受網路延遲限制、NTP 伺服器可能錯誤或配置錯誤、閏秒處理複雜以及虛擬機器中時鐘虛擬化等問題,使用需要同步時鐘的軟體時要監控時鐘偏移,以防資料丟失等問題。
- 有序事件的時間戳問題:依賴時鐘對多節點事件排序有風險,如最後寫入為準(LWW)衝突解決策略,會因時鐘不同步或精度問題導致資料庫寫入丟失、無法區分順序寫入和併發寫入等情況,邏輯時鐘相對更適合排序事件。
- 時鐘讀數的置信區間:時鐘讀數存在不確定性,應視為一個時間範圍,不同時間源對應不同的誤差計算方式,但多數系統不公開不確定性,Google 的 TrueTime API 是例外,會報告時鐘置信區間,Spanner 利用該區間實現跨資料中心的快照隔離。
- 暫停程序的影響及應對:分散式系統中,程序可能因垃圾收集、虛擬機器掛起恢復、磁碟 I/O、頁面排程、訊號控制等多種原因長時間暫停,導致依賴同步時鐘或假定執行時間短的程式碼出現問題,且分散式系統無共享記憶體,傳統執行緒安全工具無法直接適用,不過可透過一些措施緩解垃圾收集暫停的影響
知識、真相與謊言
- 分散式系統中的不確定性:分散式系統中節點只能透過訊息判斷其他節點狀態,因網路、暫停等問題無法確切知曉真實情況,所以很多分散式演算法依賴法定人數投票做決策,如宣告節點死亡等情況,減少對單個節點依賴
- 領導者與鎖定問題及防護措施:在分散式系統實現如資料庫分割槽領導者、資源鎖等唯一性控制時,需注意節點自認為的角色不一定獲法定人數節點認可,可能因網路或暫停等原因出現問題,像租約過期仍寫入導致資料損壞,可透過防護令牌機制,要求寫入時附帶遞增的令牌,資源端檢查令牌拒絕舊令牌請求來保障安全。
- 拜占庭故障及相關情況:拜占庭故障指節點有意 “撒謊” 破壞系統保證,在如航空航天、多組織參與等特定場景需考慮拜占庭容錯,但製作拜占庭容錯系統協議複雜、成本高,在多數伺服器端資料系統不實用,不過可新增一些簡單機制防止弱形式的 “撒謊” 行為來提高可靠性。