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

所有进程的状态集,进程的状态包括初始值、决议值、消息队列的内容。初始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

FLP不可能性(FLP impossibility)的更多相关文章

  1. FLP不可能原理

    1. FLP impossibility背景 FLP Impossibility(FLP不可能性)是分布式领域中一个非常著名的结果,该结果在专业领域被称为“定理”,其地位之高可见一斑.该定理的论文是由 ...

  2. HDU1890 Robotic Sort[splay 序列]

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  4. C# ToolStripProgressBar

    ToolStripProgressBar 将所有 ToolStrip控件的移动和渲染功能和其典型的进程跟踪功能结合在一起.ToolStripProgressBar通常放在StatusStrip中,偶尔 ...

  5. [转载]Ethernet,Half-Duplex/Full-Duplex,CSMA

    原文地址:Ethernet,Half-Duplex/Full-Duplex,CSMA/CD,Auto-Negotiation作者:心田麦浪 CSMA/CD(Carrier Sense Multiple ...

  6. BZOJ - 1036 树的统计Count (LCT)

    LCT试炼题(代码量居然完爆树剖?) #include<bits/stdc++.h> using namespace std; ,inf=0x3f3f3f3f; ],flp[N],n,m, ...

  7. Java替代C语言的可能性

        前不久CSDN刊登了一篇<C语言已经死了>的文章,引起了一些争论.事实上那篇文章是从Ed Burnette的博客上转载来的,原文题目是“Die, C, die!”,直译过来应该是& ...

  8. tomcat启动失败的一种可能性

    今天搭建一个新的项目,采用spring+hibernate框架,项目框架搭建完成以后,启动tomcat,报错,如下图. 第一反应是tomcat的问题,于是clean了tomcat,没用,再把tomca ...

  9. python练习题,写一个方法 传进去列表和预期的value 求出所有变量得取值可能性(例如list为[1,2,3,4,5,6,12,19],value为20,结果是19+1==20只有一种可能性),要求时间复杂度为O(n)

    题目:(来自光荣之路老师)a+b==valuea+b+c=valuea+b+c+d==valuea+b+c+d+...=valuea和b....取值范围都在0-value写一个方法 传进去列表和预期得 ...

随机推荐

  1. MongoDB的全文检索(Text Search)功能

    自己的项目中用到了mongodb,需要做一个搜索功能,刚开始不知道怎么搞,查了mongodb有个全文检索功能. 全文检索分为两步 第一,建立索引 db.stores.createIndex( { na ...

  2. libsvn_subr-1.so.0: undefined symbol: apr_atomic_xchgptr 故障解决

    源码编译安装完成之后,查看svn的安装版本会报以下错误 svn: symbol lookup error: /usr/local/subversion/lib/libsvn_subr-.so.: un ...

  3. Spring读书笔记——bean加载

    我们的日常开发几乎离不开Spring,他为我们的开发带来了很大的便捷,那么Spring框架是如何做到方便他人的呢.今天就来说说bean如何被加载加载. 我们在xml文件中写过太多类似这样的bean声明 ...

  4. Ubuntu12.04 Firefox安装flash

    1. 实验环境 Ubuntu 14.04x86 2.安装步骤 2.1 浏览器访问:https://get.adobe.com/flashplayer/?loc=cn 2.2 网址会自动识别ubuntu ...

  5. SAP 图标查找及方法

    1. 图标查找 方法一:通过TCODE查找图标对应的图标名称 执行TCODE:ICON 查找图标对应的图标名称 方法二:通过方法一查出图标名称查找对应的图标ID SE11类型池根据方法一查找的ICON ...

  6. Layer弹层组件 二次扩展,项目中直接使用。

    /************************ Layer扩展 ****************************/ /* * Layer弹出Alert提示框 * @param messag ...

  7. C#无限级分类递归显示示例

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="RoleDemo20150305 ...

  8. ios 指定页面禁用第三方键盘,使用系统的键盘

    因为项目需要,需要在添加银行卡和提现页面使用数字键盘, 如果用户没有安装第三方键盘是没啥大问题的,但是如果用户手机安装了第三方的键盘的话,有时候会无法调用起第三方的数字键盘,或者第三方键盘样式不符合, ...

  9. linux 下的文件目录操作之遍历目录

    通过递归调用读取目录和文件信息去遍历整个目录: 示例代码: #include <unistd.h> #include <stdio.h> #include <dirent ...

  10. 无限大地图:lightmap拆分

    无缝地图涉及到地形.物件的分块加载,同样,lightmap也需要动态加载.而场景烘焙时,所有物件都是一起烘焙的,那怎么把某些物件指定烘焙到某一张lightmap贴图中?网上找了很久,也没有看到具体的实 ...