立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 123|回复: 5

[分享] 为什么CAP理论在舍弃P的情况下,可以有完美的CA?

[复制链接]
发表于 2024-11-4 19:47 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
网上很多资料说在没有分区的情况下,分布式系统可以提供完美的CA,而且我的理解完美的CA指的是强一致性和完全的可用性。考虑一种情况,系统在其中一个节点执行了写操作,这时候刚好在另一个节点执行了读操作,而这个节点还没有来得及同步最新的写操作,这时候不就出现了不一致吗?因为虽然系统是连通的,但是同步写操作还是需要时间的。

原文地址:https://www.zhihu.com/question/285878189
楼主热帖
回复

使用道具 举报

发表于 2024-11-4 19:48 | 显示全部楼层
分布式系统是通过网络互联的,不保证P很难叫分布式系统,所以P必然被实现。剩下CA选择其一。
埃里克·布鲁尔在前后两版文章中的解释有些差别。简单介绍一下P和两版的差别应该更容易理解。最后再说明原因。
分区容忍性(Partition Tolerance)
第一版解释:
System continues to work despite message loss or partial failure.
翻译:出现消息丢失或者分区错误时系统能够继续运行。
第二版解释:
The system will continue to function when network partitions occur.
翻译:当出现网络分区后,系统能够继续“履行职责”。
主要差异点表现在:
第一版描述分区用的是 message loss or partial failure,第二版直接用 network partitions。
对比两版解释,第一版是直接说原因,即 message loss 造成了分区,但 message loss 的定义有点狭隘,因为通常我们说的 message loss,只是网络故障中的一种;第二版直接说现象,即发生了分区现象,不管是什么原因,可能是丢包,也可能是连接中断,还可能是拥塞,只要导致了网络分区,就通通算在里面。
虽然 CAP 理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择P要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。因此,分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。
回复 支持 反对

使用道具 举报

发表于 2024-11-4 19:49 | 显示全部楼层
Atomic Consistency要求所有concurrent requests和按某个序列执行requests结果一致。这个序列要求与request发生的time有关且最终结果要符合因果关系。每个request的时间属性可以理解成request开始的时间Tstart和结束时间Tend。楼主所说的request发生顺序是符合Atomic Consistency定义的。因为Read的Tstart在Write的Tstart和Tend之间,这种情况下可以认为逻辑上Read先执行。
回复 支持 反对

使用道具 举报

发表于 2024-11-4 19:49 | 显示全部楼层
"网上很多资料说在没有分区的情况下,分布式系统可以提供完美的CA", 这说明你看得资料都是错误的,所以网络上获取知识,一定要加上自己的理解和判断,不要轻易的相信。
言归正传, 分布式是以P为基础的,只要是分布式系统,P必然存在,那么你可选的就是在CA中寻找平衡。
单机服务,是不是就是所谓的舍弃P, 实现了完美的CA,完美这个词本身就是不存在的, 单机中也可能多点异步处理,所以P看的不是物理分布而是系统是否存在多点协作,如果只是单点,数据全同步,那么也就实现的强一致性,但是是否可用,这个要看你是怎么定义可用性的,因为绝对的100%可用(任何情况下不出问题)是不存在的,所谓的可用,都是我们通常对容错率和响应时间的在某一领域内的一个最低可承受的阈值。 所以对于CAP理论,需要理解的仅仅他们之间相互制衡的关系和原因即可,然后再看怎么能实现你所需要的系统,而不必纠结于,为什么只能选择其中之二,这个并不严谨的论断。
回复 支持 反对

使用道具 举报

发表于 2024-11-4 19:50 | 显示全部楼层
评论区有朋友不认同我的观点,其实也没有错,因为CAP本来就只是个理论定义,缺少很多细节。在实际系统的考虑中,有很多东西可以再探讨,这里再更新一下我为什么把P和延迟放在一起说:
CAP的原始论文里对可用性的定义是存活节点必须给出响应,而把消息丢失的情况定义成发生了分区。但是,在实际的系统中,响应是有响应时间的,消息丢失也往往由超时来定义。多少时间内给出响应才算可用,多少时间的延迟才判定为消息丢失呢。从这个角度来说,题主认为节点间同步写操作的时间里并没有强一致(隐含了响应时间不包含同步写操作的时间,否则就是这小段时间的不可用),那是因为舍弃P,舍弃的不彻底,只要还有这个延迟,我总可以把判定为消息超时的时间小于这个延迟,那个分区就依然存在。关于CAP有更多兴趣的话,可以看看下面这个博文,以及他引用到的一些文献,里面都列出来了:
CAP,ACID,我们能做什么
------分割线------
以下是原回答:
CAP只是一种理论指导,在现实世界的系统中,其中的P(也就是分区)并不是离散的只有分区或未分区,而是一个连续值(网络延迟)。在保证强一致性的情况下,可用性也不是简单的可用或不可用,而是网络延迟越高,可用性越低。
理论上,完全舍弃P(无网络延迟,同步写操作不需要时间),确实可以有完美的CA。当然现实中这是不可能的。
回复 支持 反对

使用道具 举报

发表于 2024-11-4 19:50 | 显示全部楼层
首先看下 CAP 的定义:
一致性(Consistency):每次读取要么获得最近写入的数据,要么获得一个错误。
可用性(Availability):每次请求都能获得一个(非错误)响应,但不保证返回的是最新写入的数据。
分区容忍(Partition tolerance):尽管任意数量的消息被节点间的网络丢失(或延迟),系统仍继续运行。
所谓舍弃 P,其实是不准确的,应该是说不考虑发生分区的情况,也就是说系统中每个节点都可以正常的通信,这里的正常包括:

  • 正确性:节点间的消息总是能正确互达
  • 时效性:在一定的时间内,消息就可以到达
此时,系统内部无论是采用什么算法,2PC/3PC、Paxos、M/S,M/M 整个系统总是可以达到一致状态的,具体怎么达成一致,是算法内部涉及的问题
至于可用性,因为系统的状态总是可以在预期的时间内收敛,所以我们可以说此时 A 也是可以被满足的。

然而,在分布式系统中,我们需要假设 P 是常态,所以一般的分布式系统在发生分区,总是在通过各种方式在 C 和 A 中做一个妥协:
CP without A:当发生分区的时候,节点之间的通信出现问题,各个节点的数据和状态无法收敛,这种系统会为了数据一致性,让整个系统陷入不可用,防止出现数据不一致,常见的比如银行系统
AP without C:当发生分区的时候,保证系统可用性,而不追求数据的一致性,极端的情况就是每个节点都成了孤岛,各自使用本身能获取到的数据对外提供服务。常见的比如在线即时游戏,出现各种问题的时候,并不需要考虑 30s 之前画面是什么,只需要你当前的请求能够得到响应即可
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表