什么是CAP理论及应用场景,为什么只能进行3选2

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

1、 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)

2、 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)

3、分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

一致性(Consistency) 

一致性是说,所有节点访问同一份最新的数据副本;即一致性保证了无论将数据写入哪一个节点,其它的节点都能实时同步到这个新数据,而随后无论从哪个节点读到的都是最新的数据。如下图所示: 

如果节点之间数据同步有异常,那就必须先解决掉同步的问题,挂起所有的请求,等待数据同步完成后才响应,那么会出现以下几种情况:

  • 请求在等待很久后才得到了正确结果

  • 写入数据异常

  • 读取数据异常

可用性(Availability) 

 可用性是说,如果有节点异常了,只要向其它无异常的节点发送请求,总能正常的收到响应数据,但数据可以不是最新的,如下图所示:

分区容错性(Partition tolerance) 

先说分区是什么,在分布式系统中,不同的节点分布在不同的子网络中,若因一些网络故障,出现了子网络之间不通的情况,但每个子网络内是正常的;这样一个完整的系统就被切分成了若干个相对孤立的区域,这就是分区。

对于分布式系统来说,在遇到任何网络故障而导致分区时,仍然能够对外提供具有一致性或可用性的服务。也就是说会分区之间即使无法同步数据,也能对外提供服务。

CAP的取舍策略和应用场景 

1)AP

保持可用性和分区容错。如果选择分区容错性和可用性,当节点损坏时,遇到分区事件,受影响的服务不需要等待数据一致,就可以对外提供服务,保证了可用性就必须放弃一致性。

2)CP

保证一致性和分区容错。如果选择分区容错性和一致性,为保证一致性,各个节点之间的数据必须保持一致,当出现分区时,会导致同步时间无限延长,在同步的这段时间就无法对外提供服务,就无法保证可用性。

3)CA

保持一致性的同时保证可用性,这在分布式系统中是不存在的,因为分区问题总是会出现在分布式系统中。出现分区就必然会产生一致性问题和可用性问题,一致性和可用性两者只能选其一。

为什么只能 3 选 2

为什么只能 3 选 2?

首先问,能不能同时满足这三个条件?

假设有一个系统如下:

 

整个系统由两个节点配合组成,之间通过网络通信,当节点 A 进行更新数据库操作的时候,需要同时更新节点 B 的数据库(这是一个原子的操作)。

上面这个系统怎么满足 CAP 呢?C:当节点A更新的时候,节点B也要更新,A:必须保证两个节点都是可用的,P:当节点 A,B 出现了网络分区,必须保证对外可用。

可见,根本完成不了,只要出现了网络分区,A 就无法满足,因为节点 A 根本连接不上节点 B。如果强行满足 C 原子性,就必须停止服务运行,从而放弃可用性 C。

所以,最多满足两个条件:

能不能解决 3 选 2 的问题 

难道真的没有办法解决这个问题吗?

CAP 理论已经提出了 13 年,也许可以做些改变。

仔细想想,分区是百分之百出现的吗?如果不出现分区,那么就能够同时满足 CAP。如果出现了分区,可以根据策略进行调整。比如 C 不必使用那么强的一致性,可以先将数据存起来,稍后再更新,实现所谓的 “最终一致性”。

这个思路又是一个庞大的问题,同时也引出了第二个理论 Base 理论,我们将在后面的文章中详细介绍。

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 22:20:07       100 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 22:20:07       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 22:20:07       90 阅读
  4. Python语言-面向对象

    2024-07-10 22:20:07       98 阅读

热门阅读

  1. mac上修改jupyterlab工作目录

    2024-07-10 22:20:07       28 阅读
  2. mongoexport导出聚合查询的mongo数据

    2024-07-10 22:20:07       23 阅读
  3. k8s离线安装单节点elasticsearch7.x

    2024-07-10 22:20:07       30 阅读
  4. d3tree树控件,点击动态加载,默认展开三层

    2024-07-10 22:20:07       22 阅读
  5. ontape备份异机还原的样例

    2024-07-10 22:20:07       23 阅读
  6. [PaddlePaddle飞桨] PaddleSpeech语言小模型部署

    2024-07-10 22:20:07       26 阅读
  7. vivado DQS_BIAS

    2024-07-10 22:20:07       28 阅读