之前的文章我們大多都是在談系統 出錯 了怎麼辦,諸如 節點掛掉怎麼做、做副本 (replication) 時 Lag 怎麼辦 等等等等;一切就只是希望讓工程師們意識到,邊界條件(鬼故事)在現實世界中是會發生的,先了解,才能更好的處理它們。
分散式系統會因為各種原因出錯,所以從這章開始,是時候要把鬼故事升級成魔王故事了,我們將談談更多可能會發生的錯誤,用最大力氣假設系統若會故障就真的會故障,就像投資時要全盤考量各種風險那樣(但有些人沒在管)。
接下來我們會有最經典的網路問題、時鐘精度問題,最後就是在分散式系統中最有趣的,有關節點狀態的真與假,但首先先談談部份故障為何吧!
當你寫一段程式在單一台電腦上,它的結果很好預測,成功執行或失敗;一個執行在獨立電腦的好軟體沒有道理會起肖(除非你看太多奇怪東西中毒了),當你的硬體正常運作時,相同的操作會得到相同的結果,但當你硬體發生問題時(例如記憶體損壞、某條排線鬆脫等等),其結果就是整個作業系統故障(例如 windows 的藍色當機畫面),一個好軟體在獨立電腦上執行的結果,要嘛正常,要嘛故障,沒有中間的。
當你的軟體開始執行在多台電腦上時,用網路連接,這情況就不一樣了,我們並不是在一個理想化系統模型中運行;在分散式系統中,總是有很多意想不到的方式出錯(例如有人不小心把某一機櫃的網路線拔掉了),稱為 部份故障 (partial failure),部份故障是不確定的。
這裡有幾個關於如何建立大規模運算系統的哲學:
這些哲學處理故障的方式很不一樣,超級電腦在任務中會時不時地建立狀態檢查點,當某台節點故障,通常的解法就是停止整個叢集,修復節點,然後從檢查點繼續計算,就像獨立電腦當機的意思一樣。
而雲端運算的分散式系統就必須要考量部份故障的可能性,軟體必須要有容錯機制,我們需要從不可靠的元件中建立可靠的系統 (2020 Day 2 - Reliable),儘管你的系統只跑在幾個節點中也是一樣。
明天就要開始進入最經典的網路問題啦!