CAP 定理的含义

作者: 阮一峰

日期: 2018年7月16日

分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。

分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

本文介绍该定理。它其实很好懂,而且是显而易见的。下面的内容主要参考了 Michael Whittaker 的文章

一、分布式系统的三个指标

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。

  • Consistency
  • Availability
  • Partition tolerance

它们的第一个字母分别是 C、A、P。

Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。

二、Partition tolerance

先看 Partition tolerance,中文叫做"分区容错"。

大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。

上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

三、Consistency

Consistency 中文叫做"一致性"。意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。

接下来,用户的读操作就会得到 v1。这就叫一致性。

问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。

为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。

这样的话,用户向 G2 发起读操作,也能得到 v1。

四、Availability

Availability 中文叫做"可用性",意思是只要收到用户的请求,服务器就必须给出回应。

用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。

五、Consistency 和 Availability 的矛盾

一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性不。

如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。

综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

[更新 2018.7.17]

读者问,在什么场合,可用性高于一致性?

举例来说,发布一张网页到 CDN,多个服务器有这张网页的副本。后来发现一个错误,需要更新网页,这时只能每个服务器都更新一遍。

一般来说,网页的更新不是特别强调一致性。短时期内,一些用户拿到老版本,另一些用户拿到新版本,问题不会特别大。当然,所有人最终都会看到新版本。所以,这个场合就是可用性高于一致性。

(完)

留言(89条)

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

可以顺便讲讲BASE

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

网络通信不管怎么样都会有失败的可能,只能尽量提高可用性

看起来提高可用性是比较合理的

没有一致性只有可用性的使用场景是什么,可以给举俩例子不

引用史蒂夫的发言:

网络通信不管怎么样都会有失败的可能,只能尽量提高可用性

我想表达的是,CAP不应该是拿来就用,而是需要带有怀疑的精神看问题。

学到了。每种架构都有其不可控的因素。没有完美的设计。

这个的前提是网络通信可能失败。假设解决了这个问题,那么就有更远的通信,以后若是星球级的网络通信呢?

如果这3个指标不能同时做到,那分布式系统不是不靠谱么,现如今互联网上这么多的分布式系统都是怎么解决这些问题的呢?

AP 不是没有C 只是在不能在某一刻实现数据一致性,只是有延时而已。

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

引用史蒂夫的发言:

网络通信不管怎么样都会有失败的可能,只能尽量提高可用性

阮老师开头已经说了,是 “介绍该定理”, 一个劲在这杠,有意思么

要强一致性的地方: 唯一ID生成, 这种性能很差. 并发不高.

要高可用: 最终一致, 即有可能读到脏数据. 但是一段时间之后总是能够读到新数据.

《前方的路》和《未来世界的幸存者》买到了

老师您好,叨扰了,请问您是否有意向做公开课程和知识分享呢,当然是付费的。我们是一个还没上线的区块链APP

引用迷茫的小白一个的发言:

如果这3个指标不能同时做到,那分布式系统不是不靠谱么,现如今互联网上这么多的分布式系统都是怎么解决这些问题的呢?

很多折中的办法,比如分布式存储就是可用性+最终一致性

就像最后说的,一般情况还是先保证可用性,然后才是一致性,当然两个都很总要,最好都能满足。

例子让我想到前端讲的“渐进增强”。不要求所有访问者体验一致,关键是先能够看到。

小小笔误:
"锁定期间,G2 不能读写,没有可用性不"
最后应该是多写了一个“不”~

阮老师,您首页随机图片的那段代码能不能拿来用啊????

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

我感觉不成立了,因为运算速度超块,

引用阮老师的小粉丝的发言:

我感觉不成立了,因为运算速度超块,

再快也不能等于零

多个了‘不’

阮老师,你推荐看的书我都买来看了哦,特别是《黑客与画家》,《穷爸爸和富爸爸》。

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择

简单明了 赞

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

1. 量子通信不是这样玩的……目前量子通讯还得借助传统信道传点东西,所以量子通讯只能用于机密传输(或者仅仅传一串真随机数)

2. 只有所有服务器同时(或者高频率同步)接收数据修改,才能同时满足C和A。然而这个前提违反了P。

3. 就是因为所有服务器并不总是能完成同步,才说“可以认为P总是成立”,于是C和A不能同时满足。

(ps: 2的前提不就是我们努力追求的吗……)

谢谢阮老师

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

我也这么觉得,是不是我们理解有问题啊

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

"分区容错的意思是,区间通信可能失败。"划重点,注意看这一句,即“区间通信可能失败”这件事总是成立

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

是的,分区容错性是指具有容错性,无法避免,那就是不总是满足的,所以应该是描述不够准确吧

这个定理说的是,“一个分区的系统,不可能同时做到数据严格一致和即时响应”,要是总能保持实时一致的话那就不叫分区了。

之前有人说阮一峰老师分享的很多知识都不准确,都是相当入门的概念,详细理解之后都是错的,我都没有太care,因为很多分享的东西我也不需要深入学习,只是了解一下就好了。
但是看到这盘文章之后,发现准确性实在是太有问题了。底下的评论也都是在装毕讨论一些不知所谓的东西。

引用Cat的发言:

之前有人说阮一峰老师分享的很多知识都不准确,都是相当入门的概念,详细理解之后都是错的,我都没有太care,因为很多分享的东西我也不需要深入学习,只是了解一下就好了。
但是看到这盘文章之后,发现准确性实在是太有问题了。底下的评论也都是在装毕讨论一些不知所谓的东西。

所以为什么你不说一下哪里有问题呢?是不是这里空白的地方太小,你写不下?

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

是这样的:她说的不能实现的意思,是不能完全满足,因为总会有失败的情况出现,技术提高了,是提高了它的可用范围,但是最终还是会遇到瓶颈。

我觉得提到 CAP 首先要先指明这是针对分布式 “存储系统”的一个理论。

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

文中的讨论逻辑是: 1. CAP定理表明,C、A、P必有1个不成立; 2. 一般情况下,P一定成立 所以,由1、2推导出C、A中必有1个不成立。后续的写作也都是建立在这个推论基础上。

一致性和可用性例子,哪里有分区容错?

如果p成立还有其他什么事

谢谢老师的讲解 看其他博客差点被一些瞎扯的人给误导了

关于CAP理论,这一篇算是写的比较准确且浅显易懂的了。
还是建议加上关于拜占庭将军问题的前篇,和最终一致性等应用的续篇,这样前因后果才完整。

不过理论终究是理论,如果联系实际Availability就很难确定。什么叫不可用呢?
多久不响应叫不可用,是超过1秒,1毫秒还是永远,永远有多远?
还有一个因素就是分区的时间,理论中G1和G2的连接是永久断开了,但是联系实际难道中国和美国服务器连接断了没人去查,没人去修吗?难道不会建两条物理链路随时切换?

所以把可用性的时间约束和分区的时间约束联合起来考虑,现实中的分布式系统是有可能同时满足CAP的。

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

分区容错发生在分布式系统内部互访通信,是指分布式网络中部分网络不可用,但系统依然正常对外提供服务。

比如:北京的订单系统,访问上海的库存系统,可能导致失败。如果发生失败,就要在A和C之间做出选择。
要么停止系统进行错误恢复,要么继续服务但是降低一致性,所以说只能保证AP或CP。

引用Mike的发言:

我想表达的是,CAP不应该是拿来就用,而是需要带有怀疑的精神看问题。

你要怀疑什么?!这是已经严格证明过的定理。不是猜想。

引用jason.zhang的发言:

分区容错发生在分布式系统内部互访通信,是指分布式网络中部分网络不可用,但系统依然正常对外提供服务。

比如:北京的订单系统,访问上海的库存系统,可能导致失败。如果发生失败,就要在A和C之间做出选择。
要么停止系统进行错误恢复,要么继续服务但是降低一致性,所以说只能保证AP或CP。

都CP了还能叫正常对外提供服务吗?

引用yz的发言:

看起来提高可用性是比较合理的

不一定,对一致性要求比较高的系统,例如银行

分布式系统:在互相隔离的空间中,提供数据服务的系统。
CAP抽象:不同空间的数据,在同一时间,状态一致。

C:代表状态一致
A:代表同一时间
P:代表不同空间
CP:不同空间中的数据,如果要求他们所有状态一致,则必然不在同一时间。
AP:不同空间中,如果要求同一时间都可以从任意的空间拿到数据,则必然数据的状态不一致。
CA:不同空间的数据,如果要求任意时间都可以从任意空间拿到状态一致的数据,则空间数必然为1.

个人认为:理论上,系统响应必定需要延时,如果,一致性同步时间小于或等于响应时间,那么在保证分区容错和可用的基础上,用户在感官和体验上是可以达到CAP的。

引用jason.zhang的发言:

分区容错发生在分布式系统内部互访通信,是指分布式网络中部分网络不可用,但系统依然正常对外提供服务。

比如:北京的订单系统,访问上海的库存系统,可能导致失败。如果发生失败,就要在A和C之间做出选择。
要么停止系统进行错误恢复,要么继续服务但是降低一致性,所以说只能保证AP或CP。

这个例子超赞

个人理解,分区容错性是指在部分机器挂掉或者不能通讯后,系统是否还能继续提供正常的服务,因此P是必须要保证的。

评论我看不下去了,简单的说博主的原文没有错

#chongzi:

这个解释既形象又准确

当数据允许延迟的情况下,CAP同时保证,只是A被延迟处理了。
只要要求实时的情况下,CAP无法同时保证。

我是这么理解的

在系统不发生不可知的故障时,本身就一直是处于CAP皆满足的状态,CAP只是特指系统出现故障时的选择

引用吃人的发言:

我也这么觉得,是不是我们理解有问题啊

好好看看分区容错是啥意思吧,明白了之后再看CAP定理的出发点是什么,CAP说的是不能同时成立。
分区容错是一定会成立的。间接的意思就是说A和C只能满足一个,设计系统的时候,根据需求,自己去选择是实现A还是C。

引用freeman的发言:

没有一致性只有可用性的使用场景是什么,可以给举俩例子不

那你还管什么数据一致不一致,只要能显示就得了是这个意思吗?

我提一种方法 不知道怎麼樣:基於容錯性,然後在可用性和一致性之間協調。一致性使用主從來實現。可用性上,主機不提供服務。然後提供一台調度器。根據主從的網絡通訊完整情況來判斷從機是否提供服務。

理论上分区容错性一定存在。

那么类似于媒体就会保可用性(A),损失一定的一致性(C)来保证可用,但是一段时间过后数据一致,也就是所谓的最终一致性。
类似于银行,就需要保一致性(C),即使加上粒度很粗的锁,也要保证每个人的交易都是正确的,这样就损失了一点可用性(A)。
以上是我的理解。

只是我对分区容错性(P)理解的还是不够深刻,还在找寻答案。

请问zookeeper在设计的时候是如何考虑CAP三个特性的?

引用freeman的发言:

没有一致性只有可用性的使用场景是什么,可以给举俩例子不

前面不是举了版本更新的例子吗

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

这里凭自己的理解讨论一下。
首先为什么三个圆不能重合,是因为C和A有冲突,相信认真看了阮老师的文章的人应该都能够理解。
原因是文章例子里的G1和G2之间的通信可能发生问题。发生问题之后如果要保证C,那么G1、G2都不能进行读写了,因为G1在写的时候不能通知到G2停止接受客户端的读写操作,那么A没法满足;如果要保证A,那么G1接受了客户端的读操作,无法与G2进行同步,从而C就保证不了。综上所述,A和C是有冲突的。
那么你可能说升级技术,保证G1和G2一直都能通信。那我想问怎么保证?G1和G2之间还是通过网络基础设施相连才能进行通信。即便是所谓的量子通信,应该也会有数据传输介质吧。传输介质因为老化、人为等各种原因,比如网线被挖断,路由器宕机,各种天灾人祸造成的设备损坏,都是有可能的啊。所以保证通信这问题?个人觉得没法解决

引用Jack的发言:

请问zookeeper在设计的时候是如何考虑CAP三个特性的?

Zookeeper达到的是CP,因为zookeeper的master节点挂掉后,会重新通过选举策略选举,在选举期间,服务是不可用的。

我看了开头的【文章】的内容后,感觉明白了些。【文章】网址:
target="_blank">

C是一致性,A是可用性,P是分区容错。
前两个没什么好说的,主要是P我不太清楚。然后我看文章中最后的证明,有点明白了。
分区是指两个服务器之间发送信息失败。而分区容错就是系统允许发生这种两个服务器之间无法传输数据的情况。

也就是说C和A如果算是正面的、好的性质,那么P就是负面的、坏的性质。

那为什么允许这种负面的情况发生?我的理解是如果只有一个服务器,那肯定不会发生两个服务器无法传输数据的情况,因为本来就只有一台服务器,但现在讨论的是分布式系统,不止一台服务器,那么就很可能出现这种情况,比如停电啊、失火啊、误操作啊、地震把电缆震断了啊,等等等等。

所以我认为不是系统允许发生这种情况,而是目前根本不存在一个分布式系统能保证分区不发生。因此一般认为P总是成立的,总会有两个服务器之间无法传输数据。

证明:
假设,如果有一个分布式系统同时满足CAP这三个条件,也就是说
1.一个服务器的数据改了之后,再次访问其它服务器,会得到修改之后的结果或者其他人对该数据修改后的结果,而不是原来的值。
2.对任意一个服务器的访问的时候,如果服务器没崩溃(不是分布式的锅),那么服务器必须给出结果。
3.这个系统设计的时候就允许分区的情况发生(你也没法不允许),即可能会出现两个服务器之间无法传输数据。

那么对于这个系统,先模拟一下分区的情况发生,两台服务器无法传输数据。这是一个人把一台服务器(X)的一个数据a改成b,然后向另一台服务器(Y)询问这个数据结果是什么。由于分区发生了,两个服务器之间无法传输数据,所以接下来有两种情况:
1.因为满足可用性,Y返回a,但用户本该收到b,这就违背了一致性;
2.因为满足一致性,所以Y在数据同步前,不会返回数据给用户,这就违背了可用性。
假设矛盾,所以无法同时满足CAP三个指标。

清晰明了,简单易懂,受益匪浅,感谢博主!

引用吃人的发言:

我也这么觉得,是不是我们理解有问题啊

的确,二位理解有问题。正确的理解是:P是不可避免的,所以C和A才不可兼得。

在没有网络故障的情况下(即分布式系统正常运行时),可以同时满足可用性和一致性。

CAP常常被误解,好像必须放弃三个中的一个。实际上,只有在发生网络分区或故障时才在一致性和可用性之间进行选择。在其他所有时间,都无需进行权衡。
——摘自维基百科 https://en.wikipedia.org/wiki/CAP_theorem

看文章没有理解透,看了一圈评论懂了P

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

这句话应该说,因此可以认为CAP的P是必须要实现的。

什么时候一致性比较重要呢,秒杀吧,要么读不到,要么读取到准确的

首先分区容错性(P)必定是存在的,要保持服务间的数据一致性,本服务器对一个服务器数据执行修改操作,其他服务器如果读取这个被执行修改的服务器,必然导致数据一致性不存在,所以本服务器的修改必须必须独占被修改的资源,被修改的资源必然对其他服务器不友好,导致其他服务器不能对被修改的服务器执行读写操作,这就是不可用性。反之,可用必然导致数据不一致,不一致性。总体来说,个人感觉这个和事务隔离的性质大体相同,可以用事务隔离来理解。

非分布式的系统(Minecraft的单一服务器)就能同时做到C和A,因为P没有开销

首先,CAP是针对分布式系统的一个“定理”。
其次,既然是分布式系统,一个核心假设是“网络一定分区”,也就是P一定存在。
所以,CAP其实是在讲P存在的情况下,如何权衡CA。
以上,我的理解。

引用Mike的发言:

三个圆为什么不能有重合?CAP也应该有前提,如果技术提升了,比如量子通信,CAP还能成立吗?

通信使用量子纠缠?

P应该是指数据同步的过程中因某种原因造成数据不一致才算分区吧,如果数据同步正常不存在分区的问题。
因为数据同步失败是无法避免的,所以才说分布式系统中P必然成立。
不知道理解的对不对

@chongzi:

1. 量子通信不是这样玩的……目前量子通讯还得借助传统信道传点东西,所以量子通讯只能用于机密传输(或者仅仅传一串真随机数)

2. 只有所有服务器同时(或者高频率同步)接收数据修改,才能同时满足C和A。然而这个前提违反了P。

3. 就是因为所有服务器并不总是能完成同步,才说“可以认为P总是成立”,于是C和A不能同时满足。
(ps: 2的前提不就是我们努力追求的吗……)

我挺认同这位的观点

引用chongzi的发言:

分布式系统:在互相隔离的空间中,提供数据服务的系统。
CAP抽象:不同空间的数据,在同一时间,状态一致。

C:代表状态一致
A:代表同一时间
P:代表不同空间
CP:不同空间中的数据,如果要求他们所有状态一致,则必然不在同一时间。
AP:不同空间中,如果要求同一时间都可以从任意的空间拿到数据,则必然数据的状态不一致。
CA:不同空间的数据,如果要求任意时间都可以从任意空间拿到状态一致的数据,则空间数必然为1.

查看了很多篇文章,包括阮老师的文章,最终觉得你这个解释,让我明白了CAP为什么只能满足2个。

引用问秋的发言:

查看了很多篇文章,包括阮老师的文章,最终觉得你这个解释,让我明白了CAP为什么只能满足2个。

确实,叫chongzi的这位一定是大神,从哲学的角度解释的,这个解释也是我看过的最完美的解释。

假设在保证了可用性的前提下,想要保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,与假设的前提矛盾,所以二者不可兼得

【CAP理论的一点理解】:P是万年铁律,代表的是分布式子系统之间的通信肯定会有故障。

提供一个场景:client 可以同时访问接口 服务A和服务B ,A&B 都需要 访问数据库 C。
1)client 先 访问A,A修改了数据库C,这时候,B和C的网络中断了( p 通信故障发生了)
2)client 再 访问B,B无法改数据库C,这时候,B 到底是返回错误信息呢,还是继续等待恢复与C的通信之后再返回正确的信息呢?
3)为了保证可用性,则 B返回旧的数据,与A的返回结果不一致,一致性就失效了;
4)为了保证一致性,则 B不响应,或者响应报错信息,一直到通信恢复,期间的可用性就失效了。

【P是什么?】
P,中文翻译为 “分区容错性”,实际上这个翻译太菜了,一看就是英文专业翻译的计算机专有名词。

P 准确的翻译应该是 “可容忍系统割裂”,不再是1个单体了。

比如 :
原来是1个整体的受精卵,结果发生了细胞分裂变成2个,这时候,这两个细胞不可能再像原来长得一摸一样了,观察者看到的这2个细胞就有所不同了,CP一致性失效,但是此时就满足了 AP可用性。

如果想满足CP一致性,那么,必须让这两个细胞 实时的互相传递所有量子级别的信息来保证,2细胞在信息同步期间就不能被观察了,可用性AP失效了。

P 代表细胞分裂 ,是万年铁律,为何?因为人类不可能是1个大大的单细胞吧。既然 “可容忍细胞分裂”,那么就会出现 一致性和可用性必然有一个失效的问题。

综上,受精卵分裂 是完美的 满足AP 的案例(满足系统割裂后的可用性)。

C和A不难理解,主要是C,就我参考的一些文章看,所谓分区容忍度,本质是在一定时间内对系统内各分区存在数据不一致的情况的容忍度.如阮老师例子,中国和美国服务器断联,如果你允许数据一定时间内在中美服务器上不一致,而提高A的响应能力,这就是CA,而如果系统强调中美服务器数据一致优先于对外部请求的响应,这就是CP.
所以我认为的分区容忍度,不是断联这个表现,而是导致的数据一定时间的不一致,这才是容忍度的本质.
如后面阮老师的CDN的例子,不可能在把己分发到各个CDN服务器上的网页都修改一致才对外服务,而优先响应能力允许网页一定时间不一致,这就是典型的CA

引用Cat的发言:

之前有人说阮一峰老师分享的很多知识都不准确,都是相当入门的概念,详细理解之后都是错的,我都没有太care,因为很多分享的东西我也不需要深入学习,只是了解一下就好了。
但是看到这盘文章之后,发现准确性实在是太有问题了。底下的评论也都是在装毕讨论一些不知所谓的东西。

是的,分区容错性的解释有问题,根据维基百科P的定义是:The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes,尽管节点之间的网络丢弃(或延迟)了任意数量的消息,系统仍然继续运行。强调的是不同分区间节点通信对延迟或丢包的容忍。也不是说P就一定成立的,也是存在AC系统的。这篇文章试图简化复杂的理论,但是描述的有偏差,的确误导了不少人。

@毫微纳皮飞:

因为P本身就是分布式的特性,具有不可抛弃的特质。如果是单一的存储是不是就可以满足了C和A。

CAP 三种情况出现的概率,以分布式系统来说 p 出现的概率以我的认知来看是最大的,甚至是100%。不过我也没做太多研究,不是专业的从业人员,如果有大佬解释一下这三种的应用场景就好了

我特意去看了CAP 作者的文章,在系统设计时除非你不考虑数据分区,一旦分区就一定会有P。并且在CAP 理论的经典解释,是忽略网络延迟的,但在实际中延迟和分区紧密相关。由于非专业人士 也只能到这了,P的意思绝对不是什么 延迟影响

引用lance6716的发言:

"一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。"这个按照文中逻辑应该是P 总是不成立吧

P表示分区容忍,分区无法避免,那就必须容忍。不然就不是分布式系统了。

@chongzi:

这个理解真赞,理论清晰,结合现实条件也可以扩展理解

引用豆角的发言:

是的,分区容错性的解释有问题,根据维基百科P的定义是:The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes,尽管节点之间的网络丢弃(或延迟)了任意数量的消息,系统仍然继续运行。强调的是不同分区间节点通信对延迟或丢包的容忍。也不是说P就一定成立的,也是存在AC系统的。这篇文章试图简化复杂的理论,但是描述的有偏差,的确误导了不少人。

阮兄的解释是比较容易理解的。P的意思是分布式系统必然存在分区的可能(注意,是可能,不是一定)。我们无法保证一个分布式系统一直健康运行不存在分区。因此,P必然要接受。接着,A和C二选一。因为当出现分区的时候,要么选择A(分区1更新,分区2无法同步,满足了可用性,但结果是分区间的数据可能不一致),要么选择C(分区1无法同步分区2,系统拒绝更新操作(即不可用),但数据一致性得到了保障)

建议看一下 Martin Kleppmann 的这篇文章 Please stop calling databases CP or AP (https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html) 。或者它的中文翻译版本 不要再将数据库称作CP或AP (https://zhuanlan.zhihu.com/p/55053121)。

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接