FLP不可能性(FLP impossibility)
FLP不可能性(FLP impossibility)
FLP impossibility是一個定理,它證明了在分布式情景下,無論任何算法,即使是只有一個進程掛掉,對于其他非失敗進程,都存在著無法達成一致的可能。
FLP是Fischer, Lynch,Patterson三位作者名字組合的簡寫,表明這定理是由它們三位發明的。
簡化模型
FLP基于如下幾點假設:
僅可修改一次每個進程初始時都記錄一個值(0或1)。進程可以接收消息、改動該值、并發送消息,當進程進入decide state時,其值就不再變化。所有非失敗進程都進入decided state時,協議成功結束。這里放寬到有一部分進程進入decided state就算協議成功。
與同步通信的最大區別是沒有時鐘、不能時間同步、不能使用超時、不能探測失敗、消息可任意延遲、消息可亂序。
只要進程非失敗,消息雖會被無限延遲,但最終會被送達;并且消息僅會被送達一次(無重復)。
進程失敗如同宕機,不再處理任何消息。相對Byzantine模型,不會產生錯誤消息。
最多一個進程失敗。
這幾點假設并不是單獨而抽象的,在實際生產的應用中我們很有可能遇到的就是上述情況。
證明過程
定義
消息隊列假定存在一個全局的消息隊列,進程可以發送消息,也可以在其上接收消息。send(p,m)表示向進程p發送消息m;receive(p,m)表示進程p收到了消息m。
Configuration所有進程的狀態集,進程的狀態包括初始值、決議值、消息隊列的內容。初始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在對某個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來說得到的結果是一致的。
Figure 1. 連通性結果顯而易見,不再羅列證明。
引理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。
簡而言之:不確定性是可以傳播的。
根據上文中的設定,我們可以得到如下示意圖:
Figure 2. 不可終止性定義示意圖同樣使用反證法證明:設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(連通性)很容易得到下圖:
Figure 3. pe!=pf顯然,D0和D1應該是不同的值,因此導出一個矛盾:Y中有兩個值,因此是不確定的。
pe==pf
Figure 4. 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%以上的一致性還是完全有可能做到的)。
參考文獻
Blogs-
LoopJump.?FLP impossibility證明 閱讀筆記
-
純粹的碼農.?FLP Impossibility
轉載于:https://www.cnblogs.com/prpl/p/6799638.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的FLP不可能性(FLP impossibility)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的位域(bit-filed):一
- 下一篇: 学好Windows编程要看的书籍