谈谈FLP和CAP的关系

谈谈FLP和CAP的关系1 写在前面承接上一篇博客 也谈分布式系统中的网络模型和故障模型 本篇博客仍然想探讨一些分布式系统的理论知识 大家应该都听说过分布式系统理论中的 FLP 不可能性和 CAP 不可能三角 那么 FLP 和 CAP 之间是什么关系呢 等价还是包含 本篇博客 就想来谈谈 FLP 和 CAP 之间的关系 2 理论回顾本节先分别回顾一下 FLP 和 CAP 这两个理论 2 1FLP 不可能性 Impossibilit

1. 写在前面

2. 理论回顾

本节先分别回顾一下FLPCAP这两个理论。

2.1 FLP不可能性

Impossibility of Distributed Consensus with One Faulty Process这篇论文对FLP不可能性的描述如下:

No completely asynchronous consensus protocol can tolerate even a single unannounced process death.

  • 节点故障只限定于crash failure,不考虑Byzantine failure (“do not consider Byzantine failures”)
  • 消息通道是可靠的,消息只可能被延迟,但不会丢失也不会出现错误,且只会被传递一次 (“the message system is reliable—it delivers all messages correctly and exactly once”)

总的来说,这些假设是比较强的假设。因为在如此强的假设下都无法实现安全的共识算法,那么在一些较弱的假设下就更无法实现。因此,FLP不可能性的适用性更广。
但论文中也指出,如果我们将假设进一步加强:假设网络模型是同步的,那么是可能实现安全的共识算法的

By way of contrast, solutions are known for the synchronous case, the “Byzantine Generals” problem.

也就是说,很多拜占庭条件下的共识算法都是在同步网络的假设下进行设计的。之所以同步网络下能实现共识算法,是因为同步网络使得“检测故障节点”成为了可能。

回顾我们在上一篇博客:也谈分布式系统中的网络模型和故障模型中讨论的各种故障模型,FLP不可能性属于最里面的第二层,如下如所示:
故障模型

2.2 CAP不可能三角

根据维基百科上的定义, CAP不可能三角是指:

It is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees: consistency, availability, and partition tolerance.

  • 故障模型为Omission failure,如上图最里面的第三层,即消息的传递无限晚,但有可能恢复(典型表现为网络分区)
  • 网络可能出现故障,消息可能会丢失(因为需要考虑分区容错性)

这里有必要对Omission failure故障模型进行解释。实际上,我们已经在上一篇博客:也谈分布式系统中的网络模型和故障模型中的3.1小节解释了网络分区故障和Omission failure的关系,即:网络分区故障实际上是Omission failure的一个特例。这里,我们再进行一番解释,以使读者能更好地理解。

  • 网络分区故障描述了这样一类故障:网络连接出现了中断,一个网络被分割成了若干个子网络。但是这种分割(网络中断)是暂时的,后期可能会恢复。否则,如果网络一旦断开就永久断开,那么子网络之间就没有任何联系。在每个子网络中分别部署服务就好了,也就不存在一致性和可用性的问题了。
  • Omission failure描述了这样一类故障:对于某个特定消息而言,节点A可能永远无法接收到节点B的消息;但对于其他消息,节点A是可能收到消息的。前者表明可能出现了网络故障,后者表明该故障是可自动恢复的。

由此可见,网络分区其实是Omission failure的一种特例。

3. FLP和CAP的关系

先说结论:“FLP不可能性”和“CAP不可能三角”是两个不等价的理论。
以下借鉴博客History of the Impossibles – CAP and FLP中的内容,介绍FLPCAP的不同。

Properties FLP CAP
Problem scope Distributed consensus Replicated storage
Failure model Crash failure Omission failure
Formalization Rigorous Gilbert & Lynch approximation
Solutions Synchronous network model Crash failure

3.1 Problem scope

FLP讨论的分布式共识(distributed consensus)的问题。分布式共识可实现的功能包括:

  1. leader election
  2. replicated state machine
  3. distributed commit

而CAP关注的是复制存储(replicated storage)的问题,replicated storage可以看作是replicated state machine的一个特例。
可以看出,复制存储是分布式共识的子问题。也即,FLP关注的问题更加通用,CAP问题是FLP问题的子集。

此外,

  • CAP中的复制存储问题只讨论了这样一类问题:同一份数据在不同节点上进行存储(主从复制即是这样一类问题);
  • FLP中的分布式共识问题除了CAP中的问题外,还讨论了这样一类问题:多个任务(数据)被调度到不同节点上并行执行(存储),不同节点上的任务和状态可能是不同的(2PC协议即包含了这样一类问题)。

由此也可见,FLP中讨论的问题更加复杂。一些方案可能无法解决FLP中的问题,但可能能够解决CAP中的问题,如3.2节中的在Crash failure模型假设下的方案。

3.2 Failure model

正如前面已经讨论过的,FLP中故障模型的假设更强,因而其得出的“不可能性”结论也适用于CAP场景(Crash failure)中;但CAP得出的“不可能三角”结论就不一定适用于FLP场景中 (Omission failure)。
结合我们在3.1节中的比较,容易得到以下结论:

  • Omission failure故障模型中,既不可能达成分布式共识,也无法实现同时满足CAP的分布式存储
  • Crash failure故障模型中,虽然无法达成分布式共识,也可能实现同时满足CAP的分布式存储。Quora中的一个回答即给出了这样一种方案设计。

3.3 Formalization

FLP不可能性”是进行了严格的理论验证的,但“CAP不可能三角”的证明却没那么严格。具体来说,CAP不可能三角的提出者(Brewer)和后来的证明者(Gilbert和Lynch),他们对于CAP理论的阐述是不太一致的。也即,证明者所证明的对象,实际上不是提出者一开始提出来的对象。

3.4 Solutions

  • 通过将网络模型增强为同步网络,分布式共识就得以实现。正如2.1节所说,很多解决拜占庭问题的共识算法就是这么做的
  • 通过将故障模型加强为crash failure,复制存储也就得以实现,正如3.2节所说。

参考链接

  1. History of the Impossibles – CAP and FLP
  2. Distributed Systems: Are the FLP impossibility result and Brewer’s CAP theorem basically equivalent?
  3. Network partition
  4. 有人了解过FLP impossibility吗?
  5. Michael J. Fischer, Nancy A. Lynch, and Michael S. Paterson. Impossibility of distributed consensus with one faulty process. J. ACM 32, 2 (April 1985)
  6. Gilbert and Lynch. Brewer’s conjecture and the feasibility of consistent, available, fault-tolerant web services.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216508.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:42
下一篇 2026年3月18日 上午11:42


相关推荐

  • DB4O学习笔记

    DB4O学习笔记什么是DB4O“利用表格存储对象,就像是将汽车开回家,然后拆成零件放进车库里,早晨可以再把汽车装配起来。但是人们不禁要问,这是不是泊车的最有效的方法呢。”–EstherDysondb4o是一个开源的纯面向对象数据库引擎,对于Java与.NET开发者来说都是一个简单易用的对象持久化工具,使用简单。同时,db4o已经被第三方验证为具有优秀性能的面向对象数据库,下面的基准测…

    2022年7月21日
    28
  • pycharm 掌握这些快捷键,你就是大神!!

    pycharm 掌握这些快捷键,你就是大神!!最重要的快捷键1.ctrl+shift+A:万能命令行2.shift两次:查看资源文件新建工程第一步操作1.module设置把空包分层去掉,compactemptymiddlepackage2.设置当前的工程是utf-8,设置的Editor–>FileEncodings–>全部改成utf-8,注释1.ctrl+/:单行注释…

    2022年8月26日
    11
  • JavaScript中的类型判断

    JavaScript中的类型判断js 中的类型判断 1 使用 typeof 进行类型判断 2 使用 instanceof 判断对象 3 使用 Array isArray 判断数组 1 使用 typeof 进行类型判断 functionfun console log 数字的类型为 typeof 1 console log 字符串的类型为 typeof hello console log 布尔值的类型为 typeof true console log undefined 的类型为

    2025年6月29日
    5
  • 操作系统概念(导论)

    操作系统概念(导论)SDU考试特别提醒:整无语了,遇到hmb老师出题就躺平了吧。八个论述两个计算(死锁检测、硬盘访问),论述题感觉像考研题,基本是结合xx谈谈xx这样。分数直接爆炸,心累了,呜呜。操作系统(概念)

    2022年7月1日
    28
  • 统计学中的Bootstrap方法介绍及其应用

    统计学中的Bootstrap方法介绍及其应用简要介绍了统计学中的 Bootstrap 方法及其在时间序列相关检验中的应用

    2026年3月26日
    2
  • Python 命名规则

    Python 命名规则详情描述命名规则 1 项目工程名 首字母大写 大写式驼峰 ProjectName 即可理解 单词首字母大写 组合线驼峰 2 包名和模块名 全部小写 下划线驼峰 from 包或模块名 import 包或类或函数名 from 包 import 模块 from 模块 import 该模块的类即可理解 全部小写 下划线驼峰 3 文件名 全部小写 下划线驼峰即可理解 全部小写 下划线驼峰 4 类名 类名使用大小驼峰 TestCase 命名风格 首字母

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号