FLP不可能性(FLP impossibility)
FLP impossibility是一個定理,它證明了在分布式情景下,無論任何算法,即使是只有一個進程掛掉,對於其他非失敗進程,都存在着無法達成一致的可能。
FLP是Fischer, Lynch,Patterson三位作者名字組合的簡寫,表明這定理是由它們三位發明的。
簡化模型
FLP基於如下幾點假設:
- 僅可修改一次
-
每個進程初始時都記錄一個值(0或1)。進程可以接收消息、改動該值、並發送消息,當進程進入decide state時,其值就不再變化。所有非失敗進程都進入decided state時,協議成功結束。這里放寬到有一部分進程進入decided state就算協議成功。
- 異步通信
-
與同步通信的最大區別是沒有時鍾、不能時間同步、不能使用超時、不能探測失敗、消息可任意延遲、消息可亂序。
- 通信健壯
-
只要進程非失敗,消息雖會被無限延遲,但最終會被送達;並且消息僅會被送達一次(無重復)。
- fail-stop模型
-
進程失敗如同宕機,不再處理任何消息。相對Byzantine模型,不會產生錯誤消息。
- 失敗進程數量
-
最多一個進程失敗。
這幾點假設並不是單獨而抽象的,在實際生產的應用中我們很有可能遇到的就是上述情況。
證明過程
定義
假定存在一個全局的消息隊列,進程可以發送消息,也可以在其上接收消息。send(p,m)表示向進程p發送消息m;receive(p,m)表示進程p收到了消息m。
所有進程的狀態集,進程的狀態包括初始值、決議值、消息隊列的內容。初始Configuration表示各個進程的初始值是隨機的,同時消息隊列為空,決議值為空。
事件代表給某個進程發送消息,並且消息已送達,可用event(p,m)表示。根據消息隊列的定義可以知道,event(p,m)即send(p,m)與receive(p,m)的交。由於某個事件,某個Configuration可以轉化為另一個Configuration。
一連串順序執行的事件序列,記為run,即runn=[event1(p1,m1), event2(p2,m2),…,eventn(pn,mn)]。
在對某個Configuration A應用了某個run事件序列之后,得到Configuration B,則稱B從A可達——可記為B⇐A。
引理1:連通性
把所有的進程P分成兩個不相交的集合P1,P2,有兩個run R1,R2,如果先給P1應用R1,再給P2應用R2與先給P2應用R2,再給P1應用R1,對P的Configuration C來說得到的結果是一致的。

結果顯而易見,不再羅列證明。
引理2:初始Configuration不確定性
- 初始Configuration不確定性
-
對任何算法P,都存在至少一個不確定性的初始Configuration。
可以用反證法證明此引理。
因為候選的決議值必須大於1個才需要保證決議的一致性,這里選取了最簡單的兩個候選值的情況,候選值分別是value1和value2。而多候選值情形可以根據歸納法證明。
這里再做一個定義:
- Configuration相鄰
-
若兩個Configuration間,僅有一個進程的狀態存在差別,那么稱為Configuration相鄰。
假設所有初始Configuration都是確定的,那么對於任意一個非空進程集P,必然至少存在一對相鄰的Configuration 1(C1)和Configuration 2(C2),二者的決議分別是value1和value2,其連接進程是P0。
假設連接進程突然間掉線了,那么C1和C2剩余進程的狀態必然是完全一致的。那么此時,我們就無法從剩余進程中知道當前Configuration的確切的決議值。

引理3:不可終止性(傳播性)
- 不可終止性
-
設C是一個不確定Configuration,event(p,m)是可以應用到C的事件。設X是從C可達並且未應用過event的Configuartion的集合,並構造Y = e(X) = {e(E) | E∈X a並且 e應用於E}。那么,Y一定包含不確定的configuration。
簡而言之:不確定性是可以傳播的。
根據上文中的設定,我們可以得到如下示意圖:

同樣使用反證法證明:設Y中的Configuration都是確定的。
因為C是不確定的,因此必然從C可達一個確定的0-value Configuration(C0),同時可達一個確定的1-value Configuration(C1)。
由於C0是0-value,無論是D0從C0可達,或是C0從D0可達,都可以推導出D0是0-value。同理,也可以推導出Y中存在一個D1是1-value。
由於0-value和1-value的C都必然存在,因此我們可以很容易得出下圖:

我們無須關心該圖中C0或者C1的具體值,只需知道必然存在一個C1,C1從C0可達。
虛線部分如下:

假設e和f操作的進程分別是pe和pf,那么分為兩種情況:
pe!=pf
根據引理1(連通性)很容易得到下圖:

顯然,D0和D1應該是不同的值,因此導出一個矛盾:Y中有兩個值,因此是不確定的。
pe==pf

由於C0已確定,因此經過σ,得到的應該是一個確定的F。 經過eσ,得到的是一個確定的E0(D0已確定)。 經過feσ,得到的是一個確定的E1(D1已確定),並且E1!=E0。
同時,由於σ和e/f操作的是不同的進程,所以可以應用引理1(連通性)。 因此可以導出σe等價於eσ,σfe等價於feσ,所以,根據上圖,F可以分別導出兩個不同的結果E0和E1——這和之前的推導是相互矛盾的。
綜上所述,Y中可能會包含一個不確定的Configuration。
結論
盡管FLP impossible原理是基於簡單的系統模型假設,但我們可以根據歸納法得出,在更復雜的系統模型下,我們仍然沒有任何算法能夠完全保證分布式系統下的一致性。
但我們不必絕望,此結論只是說明了100%保證一致性是不可能的,這並不影響我們對分布一致性的探索(99%以上的一致性還是完全有可能做到的)。
參考文獻
-
LoopJump. FLP impossibility證明 閱讀筆記
-
純粹的碼農. FLP Impossibility