1. 寫在前面
承接上一篇博客:也談分佈式系統中的網絡模型和故障模型,本篇博客仍然想探討一些分佈式系統的理論知識。
大家應該都聽說過分佈式系統理論中的FLP不可能性和CAP不可能三角,那麼FLP
和CAP
之間是什麼關係呢?等價還是包含?
本篇博客,就想來談談FLP
和CAP
之間的關係。
2. 理論回顧
本節先分別回顧一下FLP
和CAP
這兩個理論。
2.1 FLP不可能性
Impossibility of Distributed Consensus with One Faulty Process這篇論文對FLP
不可能性的描述如下:
No completely asynchronous consensus protocol can tolerate even a single unannounced process death.
翻譯成大白話就是說:在一個異步的網絡環境中,即使只有一個進程出現故障,也無法實現任何安全的共識算法。
在這篇論文中,作者也進行了一些假設:
- 節點故障只限定於
crash failure
,不考慮Byzantine failure
(“do not consider Byzantine failures”) - 消息通道是可靠的,消息只可能被延遲,但不會丟失也不會出現錯誤,且只會被傳遞一次 (“the message system is reliable—it delivers all messages correctly and exactly once”)
總的來說,這些假設是比較強的假設。因爲在如此強的假設下都無法實現安全的共識算法,那麼在一些較弱的假設下就更無法實現。因此,FLP
不可能性的適用性更廣。
但論文中也指出,如果我們將假設進一步加強:假設網絡模型是同步的,那麼是可能實現安全的共識算法的。
By way of contrast, solutions are known for the synchronous case, the “Byzantine Generals” problem.
也就是說,很多拜占庭條件下的共識算法都是在同步網絡的假設下進行設計的。之所以同步網絡下能實現共識算法,是因爲同步網絡使得“檢測故障節點”成爲了可能。
回顧我們在上一篇博客:也談分佈式系統中的網絡模型和故障模型中討論的各種故障模型,FLP
不可能性屬於最裏面的第二層,如下如所示:
2.2 CAP不可能三角
根據維基百科上的定義, CAP
不可能三角是指:
It is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees: consistency, availability, and partition tolerance.
翻譯成大白話是說:在分佈式數據存儲模型中,一致性、可用性和分區容錯性,只能三者取其二。
CAP
相關的假設如下:
- 故障模型爲
Omission failure
,如上圖最裏面的第三層,即消息的傳遞無限晚,但有可能恢復(典型表現爲網絡分區) - 網絡可能出現故障,消息可能會丟失(因爲需要考慮分區容錯性)
這裏有必要對Omission failure
故障模型進行解釋。實際上,我們已經在上一篇博客:也談分佈式系統中的網絡模型和故障模型中的3.1小節解釋了網絡分區故障和Omission failure
的關係,即:網絡分區故障實際上是Omission failure
的一個特例。這裏,我們再進行一番解釋,以使讀者能更好地理解。
- 網絡分區故障描述了這樣一類故障:網絡連接出現了中斷,一個網絡被分割成了若干個子網絡。但是這種分割(網絡中斷)是暫時的,後期可能會恢復。否則,如果網絡一旦斷開就永久斷開,那麼子網絡之間就沒有任何聯繫。在每個子網絡中分別部署服務就好了,也就不存在一致性和可用性的問題了。
Omission failure
描述了這樣一類故障:對於某個特定消息而言,節點A可能永遠無法接收到節點B的消息;但對於其他消息,節點A是可能收到消息的。前者表明可能出現了網絡故障,後者表明該故障是可自動恢復的。
由此可見,網絡分區其實是Omission failure
的一種特例。
3. FLP和CAP的關係
先說結論:“FLP不可能性”和“CAP不可能三角”是兩個不等價的理論。
以下借鑑博客History of the Impossibles - CAP and FLP中的內容,介紹FLP
和CAP
的不同。
Properties | FLP | CAP |
---|---|---|
Problem scope | Distributed consensus | Replicated storage |
Failure model | Crash failure | Omission failure |
Formalization | Rigorous | Gilbert & Lynch approximation |
Solutions | Synchronous network model | Crash failure |
3.1 Problem scope
FLP
討論的分佈式共識(distributed consensus
)的問題。分佈式共識可實現的功能包括:
- leader election
- replicated state machine
- distributed commit
而CAP關注的是複製存儲(replicated storage
)的問題,replicated storage
可以看作是replicated state machine
的一個特例。
可以看出,複製存儲是分佈式共識的子問題。也即,FLP
關注的問題更加通用,CAP
問題是FLP
問題的子集。
此外,
CAP
中的複製存儲問題只討論了這樣一類問題:同一份數據在不同節點上進行存儲(主從複製即是這樣一類問題);- 而
FLP
中的分佈式共識問題除了CAP
中的問題外,還討論了這樣一類問題:多個任務(數據)被調度到不同節點上並行執行(存儲),不同節點上的任務和狀態可能是不同的(2PC
協議即包含了這樣一類問題)。
由此也可見,FLP
中討論的問題更加複雜。一些方案可能無法解決FLP
中的問題,但可能能夠解決CAP
中的問題,如3.2節中的在Crash failure
模型假設下的方案。
3.2 Failure model
正如前面已經討論過的,FLP
中故障模型的假設更強,因而其得出的“不可能性”結論也適用於CAP
場景(Crash failure
)中;但CAP
得出的“不可能三角”結論就不一定適用於FLP
場景中 (Omission failure
)。
結合我們在3.1節中的比較,容易得到以下結論:
- 在
Omission failure
故障模型中,既不可能達成分佈式共識,也無法實現同時滿足CAP
的分佈式存儲 - 在
Crash failure
故障模型中,雖然無法達成分佈式共識,也可能實現同時滿足CAP
的分佈式存儲。Quora中的一個回答即給出了這樣一種方案設計。
3.3 Formalization
“FLP不可能性”是進行了嚴格的理論驗證的,但“CAP不可能三角”的證明卻沒那麼嚴格。具體來說,CAP
不可能三角的提出者(Brewer)和後來的證明者(Gilbert和Lynch),他們對於CAP
理論的闡述是不太一致的。也即,證明者所證明的對象,實際上不是提出者一開始提出來的對象。
3.4 Solutions
由於“FLP不可能性”和“CAP不可能三角”分別從理論上論證了,兩個問題都是無法完美解決的。
一個很自然的想法是,能夠通過增強一下假設,使得該問題得以解決。
- 通過將網絡模型增強爲同步網絡,分佈式共識就得以實現。正如2.1節所說,很多解決拜占庭問題的共識算法就是這麼做的
- 通過將故障模型加強爲
crash failure
,複製存儲也就得以實現,正如3.2節所說。
參考鏈接
- History of the Impossibles - CAP and FLP
- Distributed Systems: Are the FLP impossibility result and Brewer’s CAP theorem basically equivalent?
- Network partition
- 有人瞭解過FLP impossibility嗎?
- Michael J. Fischer, Nancy A. Lynch, and Michael S. Paterson. Impossibility of distributed consensus with one faulty process. J. ACM 32, 2 (April 1985)
- Gilbert and Lynch. Brewer’s conjecture and the feasibility of consistent, available, fault-tolerant web services.