CAP 理论里的可用性 A 和分区容错性 P 的区别到底是啥啊? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
BraveXaiver
V2EX    程序员

CAP 理论里的可用性 A 和分区容错性 P 的区别到底是啥啊?

  •  
  •   BraveXaiver 58 天前 2125 次点击
    这是一个创建于 58 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这两个不都是在说一件事,就是分布式系统出现了分区后系统仍然可用吗?
    13 条回复    2025-10-20 15:29:33 +08:00
    isno
        1
    isno  
       58 天前   1
    jybox
        2
    jybox  
       58 天前
    在需要保证一致性的前提下,出现分区时你只能停止服务(舍弃 A 保 P ),要么就是压根不考虑分区的情况让服务总是可用(舍弃 P 保 A )
    kuanat
        3
    kuanat  
       58 天前   4
    换个理解方式,CAP 描述的是三选二的困境,你要比较的是不是 A/C/P ,而是放弃 A/C/P ,反过来说就是 CA/CP/AP 。

    一致性 C 代表所有节点在任意时刻的数据总是一致的;可用性 A 代表每次请求总能获得数据,即便它可能不是最新的;分区容忍性 P 代表系统产生分区的时候,仍然能够继续运行。

    CA 或者放弃 P ,这种情况非常少见或者说几乎不会这么设计,因为网络故障总是会存在的,一个不具有分区容忍性的系统没有现实的适用场景。

    CP 或者放弃 A ,就是出现网络分区的情况下,让部分节点(即某个分区的节点)下线,只使用(特定分区)的其他节点提供服务。此时对于依赖已下线分区节点的客户来说就是失去了可用性。

    AP 或者放弃 C ,就是出现网络分区的情况下,每个分区都不会下线,所有节点都会继续工作,但由于分区之间无法通信,就会导致不同分区中的节点自从分区产生时因为写入不同而产生分叉,因而失去一致性。
    YanSeven
        4
    YanSeven  
       57 天前
    @isno 佬,我 23 年就看过你写的这个书,新版是不是相对于旧版删减了东西
    cybort
        5
    cybort  
       57 天前 via Android
    你可以这样想,这个定理其实是两种场景的合一:
    对于分区的系统,是一致性与可用性之间的抉择,无法同时满足;
    对于不分区的系统,不需要在一致性与可用性之间抉择。

    所以这个定理不仅包括了分布式系统,也包括了非分布式系统,以及通过魔法般的通信条件实现联系的看起来的“分布式”系统。
    sincw
        6
    sincw  
       57 天前   1
    不知道,但是面试官问我,我能背出来
    silyboy
        7
    silyboy  
       57 天前
    在异常情况下 C/A/P 三选二的问题. 因为分布式系统编写逻辑要考虑 把大部分环境异常也要当成正常场景逻辑进行处理.
    isno
        8
    isno  
       57 天前
    @SGL 删减了一部分,也增加了一部分,以出版的书籍为准!
    Reficul
        9
    Reficul  
       57 天前
    P 的点在于是否允许出现分区,A 是系统的可用性。 因为一般只有 CP 或者 AP ,不太可能会设计 CA 系统,所以 P 似乎是一个前提了。即在 P 这个前提下,A 和 C 之间做 Trade off 。

    其实 CAP 里的 C 、A 、P 都不是绝对的,C 里面也有很多不一样的一致性程度。 一般讲的时候只是设计上更偏向于 CP 还是 AP 。不是说 AP 系统就允许不一致,CP 系统就完全不可用。
    Hyxiao
        10
    Hyxiao  
       57 天前
    感觉 P 应该是从部署层面去理解,而 C,A 就是为了保障 P 的每一个节点,能够满足全 A 弱 C ,全 C 弱 A 的其中一点要求。
    zizon
        11
    zizon  
       57 天前
    A 是系统作为一个整体看待的可用性.
    P 是系统实现方式.

    以数据库做例子.
    P 是分库分表.
    A 是数据库作为整体对外服务的可用性.
    C 是指主从/节点/之间数据 replication 的一致性.
    NoobPhper
        12
    NoobPhper  
       57 天前
    ![Screenshot 2025-10-20 at 15.20.09.png]( https://youke1.picui.cn/s1/2025/10/20/68f5e294c4d59.png) 大致是这样
    tingfeng1
        13
    tingfeng1  
       57 天前
    P 是分布式的前提,如果分布式系统在网络分区后无法访问,那么跟单体没有区别,然后再谈 A 或者 C
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 14:21 PVG 22:21 LAX 06:21 JFK 09:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86