分布式CAP定理,为什么不能同时满足三个特性?

article/2025/9/24 17:17:00

在弄清楚这个问题之前,我们先了解一下什么是分布式的CAP定理。

根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。

一、CAP的定义

Consistency (一致性):

“all nodes see the same data at the same time”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。

Availability (可用性):

可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。

Partition Tolerance (分区容错性):

即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。

二、CAP定理的证明

现在我们就来证明一下,为什么不能同时满足三个特性?

假设有两台服务器,一台放着应用A和数据库V,一台放着应用B和数据库V,他们之间的网络可以互通,也就相当于分布式系统的两个部分。

在满足一致性的时候,两台服务器 N1和N2,一开始两台服务器的数据是一样的,DB0=DB0。在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应。在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。                                               

当用户通过N1中的A应用请求数据更新到服务器DB0后,这时N1中的服务器DB0变为DB1,通过分布式系统的数据同步更新操作,N2服务器中的数据库V0也更新为了DB1,这时,用户通过B向数据库发起请求得到的数据就是即时更新后的数据DB1。

上面是正常运作的情况,但分布式系统中,最大的问题就是网络传输问题,现在假设一种极端情况,N1和N2之间的网络断开了,但我们仍要支持这种网络异常,也就是满足分区容错性,那么这样能不能同时满足一致性和可用性呢?

假设N1和N2之间通信的时候网络突然出现故障,有用户向N1发送数据更新请求,那N1中的数据DB0将被更新为DB1,由于网络是断开的,N2中的数据库仍旧是DB0;

如果这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据DB1,怎么办呢?有二种选择,第一,牺牲数据一致性,响应旧的数据DB0给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作完成之后,再给用户响应最新的数据DB1。

上面的过程比较简单,但也说明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。也就是说分布式系统不可能同时满足三个特性。这就需要我们在搭建系统时进行取舍了,那么,怎么取舍才是更好的策略呢?

三、取舍策略

CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:

CA without P如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。

CP without A如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。

 AP wihtout C要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。

三、总结

现如今,对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,节点只会越来越多,所以节点故障、网络故障是常态,因此分区容错性也就成为了一个分布式系统必然要面对的问题。那么就只能在C和A之间进行取舍。但对于传统的项目就可能有所不同,拿银行的转账系统来说,涉及到金钱的对于数据一致性不能做出一丝的让步,C必须保证,出现网络故障的话,宁可停止服务,可以在A和P之间做取舍。

总而言之,没有最好的策略,好的系统应该是根据业务场景来进行架构设计的,只有适合的才是最好的。


http://chatgpt.dhexx.cn/article/QAygWkw1.shtml

相关文章

AMBA总线理解-AXI总线

AXI的设计目标是可以在高始终频率下运行,并且在迟滞时间长的情况下也可以达到高数据吞吐率。他可以将读/写请求和读/写结果相互分离,将数据写入和数据读出的信号分类,并且可以同时进行写入和读出的动作,因此可以大幅度提升数据吞吐…

Zynq AXI总线

S02_CH12_ AXI_Lite 总线详解 - 米联客 - 博客园 12.1前言 ZYNQ拥有ARMFPGA这个神奇的架构,那么ARM和FPGA究竟是如何进行通信的呢?本章通过剖析AXI总线源码,来一探其中的秘密。 12.2 AXI总线与ZYNQ的关系 AXI(Advanced eXtens…

AXI总线协议介绍

AXI总线协议介绍 AXI(Advanced eXtensible Interface)协议是一种面向高性能、高带宽系统设计的总线协议,能够满足各种高速系统的总线协议,能够满足各种高速系统的总线互连。 AXI协议的主要特点有: 独立的地址,控制和数据接口支持使用字节选通的不对齐数据的传输基于特定地…

AXI总线入门

介绍【只要涉及到芯片内部交换都是涉及到AXI协议】 ZYNQFPGAARM 两者间的数据传输 AXI(Advanced extensible Interface)高级外设总线协议,协议是一种通用总线协议,AXI协议是ARM AMBA(Advanced Microcontroller Bus Arc…

AXI 总线协议学习笔记(4)

引言 前面两篇博文从简单介绍的角度说明了 AXI协议规范。 AXI 总线协议学习笔记(2) AXI 总线协议学习笔记(3) 从本篇开始,详细翻译并学习AXI协议的官方发布规范。 AXI总线协议,是一个处于不断发展和完…

浅谈AXI总线

这篇博客在写之前借鉴了网上各位大佬对AXI总线的理解和总结,在此表示感谢。集合了博客,知乎以及书上对AXI总线的介绍。做以下记录用于自己日后复习和更好的理解。 1:协议简介 Xilinx fpga 从Virtex-6系列开始,内部IP都支持AXI4总…

AXI总线整理总结

AXI总线 一、Definition 嵌入式系统是当今计算机工业发展的一个热点,随着超大规模集成电路的迅速发展,半导体工业进入深亚微米时代,器件特征尺寸越来越小,芯片规模越来越大,可以在单芯片上集成上百万到数亿只晶体管。…

AXI 总线协议学习笔记(3)

引言 上篇文章主要介绍了 AMBA以及AXI协议的基本内容,本文接续前文,继续介绍AXI协议的 原子访问、传输行为和事务顺序等。 AXI 总线协议学习笔记(2)https://blog.csdn.net/qq_43045275/article/details/128824643 原子访问 原子…

AXI总线总结

目录 1 综述 2 AXI通道概述 2.1 综述 2.2 读地址与写地址通道 2.3 读数据通道 2.4 写数据通道 2.5 写响应通道 3 AXI互联结构 4 AXI中使用寄存器切片 5 AXI术语 5.1 AXI组件与拓扑 5.2 AXI传输与存储器类型 6 AXI信号描述 6.1 公共信号 6.2 写地址通道信号 6.3…

AXI总线

AXI总线 AXI总线简介 AXI总线是一种总线协议,是ARM公司提出的AMBA3.0协议(目前已AXI4已发布) 中的最重要的部分,是一种高性能、高带宽、低延时的片内总线。支持不对齐的数据传输和突发传输。在突发传输中只需要首地址,并且支持同时分离的读…

SoC设计与验证——总线篇——AXI总线

1. AXI总线特征 axi总线可以连接CPU的cache和其他外设,比如内存等。内存是从属设备,它接受信号,并驱动ready信号;主从设备都会驱动data信号,总线仲裁器只看request和grant信号,而忽略所有的其他信号。 详…

AXI总线简介

0.绪论 AXI是高级扩展接口,在AMBA3.0中提出,AMBA4.0将其修改升级为AXI4.0。AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性扩展接口,AXI4.0-stream是ARM公司和Xilinx公司一起提出,主要用在FPGA进行以数据为主…

calender控件应用

历控件是.net自带的控件之一,功能强大,在很多项目开发中都有用到,对于blog系统来说更是必不可少。纵是好玉也仍需雕琢,为了使它更美观实用,我们还需要对它进行二次开发。   新建一个用户控件,把cale…

CalendarPicker

CalendarPicker 项目地址:maxyou/CalendarPicker 简介:A calendar picker to select a day. Can preset a selected day. 更多:作者 提 Bug 标签: Calendar Picker Can preset a selected day. Can customize almost al…

vue-calender

​​ 实现功能 生成当月的日历&#xff0c;并且标记当天的日期在输入框中输入日期会跳转到对应的月份&#xff0c;并标记输入的日期中间两个按钮( < >)控制月份的更改&#xff0c;可以切换月份旁边两个按钮( << >>)控制月份的更改&#xff0c;可以切换年份…

Java Calender类的一些常用方法

Calendar 日期类介绍 Calendar c Calendar.getInstance();//创建实例 默认是当前时刻   c.get(Calendar.YEAR);   c.get(Calendar.MONTH);   c.get(Calendar.DATE);//获取年,月,日 当然时分秒也可以 注意这里的月份比较特殊 从0开始   c.get(Calendar.DAY_OF_WEE…

Java日期Canlender

java.util.Carlendar介绍: Calendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段&#xff08;例如获得下星期的日期&#xff09;提供了一些方法。 Calendar 提供了一个…

再次和谐

好吧&#xff01;等我有心情自己做网站的&#xff0c;一定在国外架。 你看到下面的截图就知道和谐了。 我在搜OpenGL的函数说明时看到的。 这不是明显把人们往国外赶嘛&#xff01; "清空FTP"&#xff0c;还"永不再绑定原有域名"。 这个“非法信息”是什…

鹤城杯2021 Crypto Writes up

鹤城杯2021 Crypto Writes up 这比赛原题横行有点水&#xff0c;跟着大佬们拿了个34名。 #1 easy_crypto 附件&#xff1a; 公正公正公正诚信文明公正民主公正法治法治诚信民主自由敬业公正友善公正平等平等法治民主平等平等和谐敬业自由诚信平等和谐平等公正法治法治平等平…