分布式理论梳理——FLP定理

    FLP Impossibility(FLP不可能性)是分布式领域中一个非常著名的定理。它给出了一个令人吃惊的结论:在异步通信场景,即使只有一个进程失败了,没有任何算法能保证非失败进程能够达到一致性!这意味着,在假设网络可靠、节点只会因崩溃而失效的最小化异步模型系统中,仍然不存在一个可以解决一致性问题的确定性算法。

    这是为什么呢?如果一个节点的进程停止工作了,可其它节点并不知晓,它们认为是消息延迟或者这个进程特别慢,它们仍然会尝试读取消息。

    1)系统模型

    FLP定理基于下面几点假设:

  • 异步通信:
    异步通信与同步通信的最大区别是没有时钟、不能时间同步、不能使用超时、不能探测失败、消息可任意延迟、消息可乱序;
  • 通信健壮:
    只要进程非失败,消息虽会被无限延迟,但最终会被送达,且消息仅会被送达一次(无重复);
  • Fail-Stop模型:
    进程失败如同宕机,不再处理任何消息。相对Byzantine式模型,不会产生错误消息;
  • 协议约束:
    不要求所有非故障进程都达成一致,只要有一个进程进入决定状态就算达成一致,且一致结果只能是属于{0,1};
  • 失败进程数量:
    最多只有一个进程失败或单节点宕机;

    2)推导证明

    假设有A、B、C、D、E五个进程,每个进程都有一个随机的初始值提交(0)或回滚(1)来向其他进程发送请求,进程自己必须接收到其他进程的请求后才能根据请求内容作出本地是提交还是回滚的决定。如果所有的进程都能做出相同的决定,则认为一致性达成。根据假设的系统模型,允许最多一个进程失败,因此一致性要求要放松到允许所有非失败进程达成一致,若有两个不同的值被非失败进程选择,则认为无法达成一致。

    现在我们要设计这样一个算法,保证符合一致性标准(一致性[Agreement],完整性[Integrity],终止性[Termination],还有合法性[Validity]),并允许最多一个进程失败。假如我们设计的算法为P,每个节点根据多数派表决的方式判断本地是提交还是回滚:

    a)C收到了A、B的提交申请,收到了D的回滚申请,而C本身也倾向于回滚,那么此时,提交、回滚各有两票,E的投票决定着C的最终决议。

    b)E宕机了,或者E发送给C的消息被无限延迟(无法探测失败),此时C选择一直等待,或者选择提交失败,后续可能E正常而C失败,总之,这导致了C没法做出最终决策,或者C做了最终决策失败后无人可知。

    我们称所有进程组成的组合态为Configuration。如果一系列操作之后,没有进程做出决策则称为“不确定”的Configuration。“不确定”的Configuration的意思是说,后续可能做出提交,也可能做出回滚的决议。相反,如果某个Configuration能准确地说明会做出提交/回滚的决议,则称为“确定性”的Configuration。如果某个Configuration是确定的,则认为一致性可以达成。

    对上述算法P,可能存在一种极端场景,每次都构造出一个“不确定”的Configuration,比如每次都是已做出决议的C失败,而之前失败的E复活(在异步场景中,无法真正区分进程是失败,还是消息延迟),那么也就是说明,因为消息被延迟乱序,导致结果难以预料!也就是说,在任何算法之上,都能构造出这样一些永远都不确定的Configuration,也就没有任何理论上的具体的算法能避免这种最坏情况。

    3)结论

    FLP中设计的模型是一个比现实情况要更可靠的模型,但是在这样可靠的环境下仍然无法解决一致性问题,那么现实中更宽松的环境显然也是失效的。FLP定理告诉我们,一致性算法的可靠性是无法保证的,同时满足 safety和 liveness 的一致性协议是不存在的,即不存在一个能在异步网络上能够容忍各种故障并保持一致的分布式系统。无论是 Paxos 算法还是 Raft 算法,如果你想要 safety,那么理论上都可能会进入无法表决通过的死循环,每次的状态变化都可能是当前状态的bivalent(可分支的)。比如,分布式事务是永远无法实现单体应用级别的一致性。

    但是,你需要明确的是:FLP只是证明了异步通信的最坏情况,实际上根据FLP定理,异步网络中是无法完全同时保证 safety 和 liveness 的一致性算法,但如果我们 safety 或 liveness 要求,这个算法进入无法表决通过的无限死循环的概率是非常低的。

    在现实中,我们都使用了TCP协议(保证了消息健壮、不重复和不乱序),每个节点都有NTP ①时钟同步(可以使用超时),纯的异步场景相对比较少。但这样的适用场景还是存在的,随着终端的发展,每个手机会为省电而关机,也会因为不在服务区而离线。

 

※ 附录:

注:

 

    ① NTP,即网络时间协议(Network Time Protocol),它是用来用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。

参考:

  • FLP的启示:http://www.jianshu.com/p/b620cbabf857 ;

转载于:https://my.oschina.net/duofuge/blog/1512344

你可能感兴趣的:(分布式理论梳理——FLP定理)