文章目錄
1. 寫在前面
分佈式系統中的網絡模型和故障模型是個老生常談的問題了。
- 關於網絡模型,相信大家都知道分爲:同步網絡和異步網絡。
- 對於故障模型,大家可能會有點懵。因爲無論是在各種教材上還是在各種博客中關於該模型的劃分都很雜、很亂,甚至相互之間有些矛盾。舉例來說,大家可能看到過下面這兩張圖。這兩張圖分別對故障模型進行了劃分,但劃分結果卻迥然不同。
此外,大家有沒有思考過這個問題:
- 網絡模型和故障模型的關係是什麼?大家似乎在討論故障模型的時候,直接就忽略網絡模型了
在本篇博客中,我們也想談談這兩個模型。對於故障模型,我們努力將現有的各種劃分結果進行統一,使得我們的劃分結果更加系統科學。此外,我們也嘗試從新的角度理解網絡模型,並回答網絡模型和故障模型的關係。
2. 再理解網絡模型
網絡模型分爲:同步網絡和異步網絡,兩者的不嚴謹定義分別如下所示:
- 同步網絡:網絡中消息傳遞的延遲有上限,節點的處理延遲延遲有上限
- 異步網絡:網絡中消息傳遞的延遲沒有上限,節點的處理延遲無上限
這裏需要指出的是,儘管“網絡模型”這個詞字面上只包含了“網絡”,但其實際上對節點處理延遲也進行了規定。
此外,在我們看來,同步網絡和異步網絡的最大區別在於故障的可檢測性。具體來說,在同步網絡中,其他節點或網絡的故障可以通過 超時(ping/timeout) 進行檢測;而在異步網絡中,這些故障是無法進行檢測的。
由於我們只能通過**超時(ping/timeout)**在同步網絡中進行故障檢測,可檢測的故障也只有節點崩潰
或網絡鏈路斷開
這種錯誤(就故障而言,節點崩潰
和網絡鏈路斷開
是等價的,這在3.1節種將進行討論)。
記住這個結論,該結論將在第4節中用到。
2.1 一個疑問
看久了故障模型和網絡模型,我曾經有的一個疑問是:
同步網絡中是否保證了網絡鏈路不會發生斷開?
答案是不保證。同步網絡中也會出現鏈路斷開,因此才需要使用**超時(ping/timeout)**進行檢測。當然,異步網絡中更不會保證鏈路不斷開。
3. 故障模型的劃分
綜合比較多個劃分結果,我們將故障模型重新劃分如下圖所示,相應的解釋如下表。
故障劃分 | 解釋 |
---|---|
Byzantine failure | 節點可以任意篡改發送給其他節點的數據 |
Authentication detectable byzantine failure (ADB) | Byzantine failure的特例;節點可以篡改數據,但不能僞造其他節點的數據 |
Response failure | ADB的特例,節點可以返回錯誤數據,但只能返回受限的錯誤數據 |
Performance failure | 又名timing failure, 節點未在特定時間段內收到數據,即時間太早或太晚 |
Omission failure | Performance failure的特例;節點收到數據的時間無限晚,即收不到數據 |
Crash failure | Omission failure的特例;在omission failure的基礎上,增加了節點停止響應的假設,也即持續性地omission failure |
Fail-stop failure | Crash failure的特例;在Crash failure的基礎上增加了錯誤可檢測的假設 |
從圖中我們可以看出,越在外層的錯誤模型(如Byzantine failure
)所作的假設越少,越在內層的錯誤模型(如Crash failure
)所作的假設越多。也即,一個在內層模型中可行的共識方案未必可以在外層模型中可行。
以下,我們分別討論故障模型的一個疑問和兩個分類。
3.1 一個疑問
一直以來,我對故障模型存在一個疑問:
故障模型是針對節點還是針對網絡而言的?也即:故障模型中的故障討論的是節點故障還是網絡故障
我思考的結論是兩者(節點故障和網絡故障)都包括。
我個人對此的理解是:從分佈式系統中節點的角度來看,節點故障和網絡故障是無法區分的,甚至一定程度上是等價的。舉例來說:“網絡延遲”和“節點處理速率慢”等價;“網絡鏈路斷開”和“節點宕機”等價;“網絡鏈路中路由器篡改數據”和“節點惡意篡改數據”等價。因此,故障模型中的故障是將節點和網絡包含在一起進行討論的。
3.2 按照故障發生的領域分類(Domain of failure occurrence)
3.2.1 值故障 (Value failure)
值故障的含義是節點接收到的數據值發生了故障。
- Byzantine failure
- Authentication detectable byzantine failure (ADB)
- Response failure
3.2.2 時間故障 (Time failure)
時間故障的含義是節點接收到數據的事件發生的故障。
這裏的time failure
和上表中的Performance failure
那一行中的timing failure
不同。這裏將最裏層的4個故障統稱爲time failure
- Performance failure
- Omission failure
- Crash failure
- Fail-stop failure
3.3 按照用戶對數據的感知分類(Perception by the system users)
3.3.1 非一致性故障 (Inconsistent failure)
非一致性故障是指其他節點從同一節點中接收到的數據是不一致的。
- Byzantine or arbitary failures
- Authentication detectable byzantine failure (ADB)
3.3.2 一致性故障 (Consistent failure)
一致性故障是指其他節點從同一節點中接收到的數據是一致的,在此基礎上出現的其他故障。
- Response failure
- Performance failure
- Omission failure
- Crash failure
- Fail-stop failure
4. 網絡模型和故障模型的關係
4.1 再討論Fail-stop failure模型
在開始網絡模型和故障模型的關係之前,我們先討論一下Fail-stop failure
這個特殊的故障模型。
前面我們介紹了Fail-stop failure
這個模型,其是在Crash failure
模型的基礎上增加了故障可檢測的假設。回顧我們在第2節中的理解:同步網絡和異步網絡最大的區別在於故障的可檢測性。
因此,Fail-stop failure模型本質上是在Crash failure模型的基礎上增加了“同步網絡”的假設。
那麼爲什麼在其他幾類模型中不增加“同步網絡”的假設,使其演變爲另一種模型呢?
4.2 是否可以對其他模型增加“同步網絡”的假設?
回顧我們在第2節中的結論,同步網絡中可檢測的故障只有節點崩潰或網絡鏈路斷開這種故障。而這種故障正對應於Crash failure
。
也就是說,在除Crash failure
和Fail-stop failure
之外的其他5類故障模型中,同步網絡和異步網絡的假設並不會對模型產生影響。
因此,無需對其他模型怎加“同步網絡”的假設。
4.3 網絡模型和故障模型的正交性
一定程度上來看,網絡模型和故障模型是正交的。但,是否將不同的網絡模型和故障模型進行疊加,需要考慮其疊加後的意義。
正如4.2節中所說,在除Crash failure
之外的其他5類故障模型,疊加網絡模型不會分化出新的模型。因而,我們在衆多的教材和博客中,都不會看到它們相疊加的討論。
參考鏈接
- Fault tolerance, Chap08
- Failure modes in distributed systems
- Failure semantic - Wikipedia
- Understanding omission failure in distributed systems
- Modes of failure
- Failure modes and models
- What we talk about when we talk about distributed systems
- Crash Recovery with Partial Amnesia Failure Model Issues
- 分佈式系統中的網絡模型和故障模型
- 分佈式系統一致性的發展歷史 (二)
- Faults and fault-tolerance