简要证明

在完全异步的模型下,即使只允许一个进程失败,也没有任何算法能够保证达成共识。

——FLP不可能性定理

分布式系统配置

假设我们的系统中共有5台计算机,每台计算机内运行一个进程。

5个进程所处的状态以及已发送到网络中但未被接收的消息,合称为系统的配置

configuration

如果当前系统处于某个配置下:

  • 最终决策值一定为0,则称该配置为0-价配置
  • 最终决策值一定为1,则称该配置为1-价配置
  • 最终决策值可能为0,也可能为1,具体需要看消息的传递情况以及进程的执行情况。此时称该配置为二价配置

varient

事件与转换

定义:事件与转换

当进程 uu 接收到了一个消息 mm,从而使系统从配置 C0C_0 变为 C1C_1,则称 τ=(u,m)\tau=(u, m) 为一个事件,且称该过程为一个转换

transform

关键配置

定义:关键配置

对于一个二价配置,如果经过一个单一转换后的配置全都是单价的,则称该二价配置为一个关键配置

crucial-configuration

系统一旦进入关键配置,则意味着系统接下来一定能够达成共识

证明思路

我们证明的思路是:

  1. 先证明如果允许至少一个进程崩溃,则系统必然存在一个初始的二价配置,而系统一旦进入一个二价配置,想要保证一定能够达到共识,则系统必须能够在有限的时间内进入关键配置
  2. 再证明当系统处于关键配置时,存在单一进程的崩溃,会使得系统陷入僵持状态,无法达成共识

我们还是用配置树示例:

config-tree

首先,既然算法宣称能够达成共识,则当系统从一个初始二价配置开始的话,算法最终也应当能够达成共识。

当系统进入了一个二价配置,算法要保证一定能够达成共识,那么就需要在有限的时间内进入一个关键配置。例如,如果初始二价配置不是关键配置(如上所示),那么它必然有一个二价配置的子结点,而该二价配置如果不是关键配置,则它也必然有一个二价配置的子结点,如果一直没有到达一个关键配置,则该过程会无限重复下去,系统永远达不到共识。

最后,我们证明如果系统确实在有限时间内进入了一个关键配置,则必然存在一个进程,该进程的崩溃,使得系统陷入僵持状态而无法达成共识。从而完成证明。

引理1

引理1

如果允许至少一个进程崩溃,则系统必然存在一个初始的二价配置

对于初始配置而言,由于系统处于初始状态,则系统中并没有正在传输的消息,因此一个初始配置实际上相当于每一个进程的输入值的集合。在我们的模型中,进程的输入值即01,相当于每一个进程在算法一开始时希望提议的决策值。

那么最终达成共识的决策值,必须从这个输入值集合中选出。例如,如果5个进程都提议0,我们记作V[0, 0, 0, 0, 0],则最终决策值显然只能为0,同样的,如果5个进程都提议1,记作V[1, 1, 1, 1, 1],则最终决策值显然只能为1

为了证明引理1,我们使用反证法。假设系统所有的初始配置都是单价配置。

考虑以下6组输入值,按照假设,他们都是单价配置

  • V0=[0,0,0,0,0]V_0=[0, 0, 0, 0, 0]
  • V1=[1,0,0,0,0]V_1=[1, 0, 0, 0, 0]
  • V2=[1,1,0,0,0]V_2=[1, 1, 0, 0, 0]
  • V3=[1,1,1,0,0]V_3=[1, 1, 1, 0, 0]
  • V4=[1,1,1,1,0]V_4=[1, 1, 1, 1, 0]
  • V5=[1,1,1,1,1]V_5=[1, 1, 1, 1, 1]

推论

由于V0V_0最终决策值为0,而V1V_1最终决策值为1。那么必然相邻的两个输入值Vi,Vi+1V_i, V_{i+1},其中ViV_i的决策值为0,而Vi+1V_{i+1}的决策值为1,并且ViV_iVi+1V_{i+1}之间的不同,仅仅在于i+1i+1号进程的输入值不同。

例如,从V0V_0开始,V0V_0必定是0-价配置。检查V1V_1,如果V1V_11-价配置,那么我们就找到了:i=0i=0V0,V1V_0, V_1之间输入值的不同,仅仅是1号进程的输入值不同。

如果V1V_1也是0-价配置,则接着检查V2V_2。如果一直都是0-价配置,则一直到V4V_4处,如果V4V_4仍是0-价配置,而V5V_5本身又必然是1-价配置,那么我们就找到了:i=4i=4V4V5V_4, V_5之间输入值的不同,仅仅是5号进程的输入值不同。

ViV_iVi+1V_{i+1}之间,仅仅在于i+1i+1号进程的输入值不同,如果该进程宕机,则剩余其他进程的输入值是完全相同的,那么系统最终的决策值应该是0还是1呢?

如果最终是0,而实际上初始配置可能是1-价配置Vi+1V_{i+1};如果最终是1,而实际上初始配置可能是0-价配置ViV_i。因而导出矛盾。原假设不成立,因而系统必然有一个双价初始配置

引理2

引理2

当系统进入一个二价配置,想要保证达到共识,则系统必须在有限时间内达到一个关键配置

该引理是显而易见的。当系统进入一个二价配置,如果该二价配置不是关键配置,意味着它还有一个二价配置的子结点。系统就有可能通过一个转换进入该二价配置,如果该二价配置还不是关键配置,则又意味着它还有一个二价配置的子结点……该过程可以一直持续,使系统永远达不到共识。

引理3

引理3

假设有两个转换τ1=(u1,m1),τ2=(u2,m2)\tau_1=(u_1, m_1), \tau_2=(u_2, m_2),都可以应用在配置CC上。Cτ1τ2C_{\tau_1\tau_2}表示先应用τ1\tau_1,后应用τ2\tau_2Cτ2τ1C_{\tau_2\tau_1}表示先应用τ2\tau_2,后应用τ1\tau_1。则 Cτ1τ2=Cτ2τ1C_{\tau_1\tau_2}=C_{\tau_2\tau_1}

lemma1

证明: 该引理实际上是显而易见的。u1u_1u2u_2是独立的两个进程,且τ1\tau_1独立应用于u1u_1,而τ2\tau_2独立应用于u2u_2。因而这两个转换是完全独立的,它们最终消耗同样的消息,导致同样的状态转换,且产生同样的新的待传递消息。因而最终结果 Cτ1τ2C_{\tau_1\tau_2}Cτ2τ1C_{\tau_2\tau_1}也相等。

引理4

引理4

当系统处于关键配置,则存在某个进程,其宕机会使得系统陷入僵持状态,无法达成共识

假设系统当前处于关键配置CC,则可应用于配置CC的转换集合TT中,必然存在有τ0=(u0,m0)τ1=(u1,m1)\tau_0=(u_0, m_0),\tau_1=(u_1, m_1),其中τ0\tau_0使关键配置CC转到0-价配置Cτ0C_{\tau_0}τ1\tau_1使关键配置CC转到1-价配置Cτ1C_{\tau_1}CC是关键配置,因此必定存在这两个转换)。

如果u0u_0u1u_1不是同一个进程,则根据引理3,我们对CC应用τ0τ1\tau_0,\tau_1,根据顺序不同,可以得到Cτ0τ1=Cτ1τ0C_{\tau_0\tau_1}=C_{\tau_1\tau_0}

02

由于Cτ0τ1C_{\tau_0\tau_1}先应用了τ0\tau_0,因此Cτ0C_{\tau_0}应当为0价配置,其后继配置Cτ0τ1C_{\tau_0\tau_1}也是0价配置。同理,Cτ1τ0C_{\tau_1\tau_0}应当是1价配置。这就与Cτ0τ1=Cτ1τ0C_{\tau_0\tau_1}=C_{\tau_1\tau_0}相矛盾。因此,u0=u1u_0=u_1

对于可以应用于配置CC的转换集合,可以分为将CC转为0价配置的转换子集T0T_0,以及将CC转为1价配置的转换子集T1T_1。那么对于任意的τ0T0,τ1T1\tau_0\in T_0, \tau_1\in T_1,都满足以上论证。因此,转换集合TT中的所有转换,实际上都是同一个进程uu的转换!

如果此时进程uu宕机,则系统永远无法进入一个单价配置,从而无法达到共识。引理4证毕。

最终证明

FLP不可能性定理

在完全异步的模型下,即使只允许一个进程失败,也没有任何算法能够保证达成共识

证明:由引理1可知系统必然存在一个初始二价配置,由引理2可知系统要能保证达到共识,则当系统处于初始二价配置时,必须在有限时间内达到一个关键配置,而由引理4,又可知当系统处于关键配置时,必然能找到一个进程uu,该进程宕机使系统永远无法进入一个单价配置,从而永远无法达到共识。

FLP不可能性定理证明完毕。