23 | 想成为架构师,你必须掌握的CAP细节

2018-06-19 李运华
《从 0 开始学架构》
课程介绍


讲述:黄洲君

时长:大小6.26M


理论的优点在于清晰简洁、易于理解,但缺点就是高度抽象化,省略了很多细节,导致在将理论应用到实践时,由于各种复杂情况,可能出现误解和偏差,CAP 理论也不例外。如果我们没有意识到这些关键的细节点,那么在实践中应用 CAP 理论时,就可能发现方案很难落地。
而且当谈到数据一致性时,CAP、ACID、BASE 难免会被我们拿出来讨论,原因在于这三者都是和数据一致性相关的理论,如果不仔细理解三者之间的差别,则可能会陷入一头雾水的状态,不知道应该用哪个才好。
今天,我来讲讲CAP 的具体细节,简单对比一下 ACID、BASE 几个概念的关键区别点。

CAP 关键细节点

埃里克·布鲁尔(Eric Brewer)在《CAP 理论十二年回顾:“规则”变了》(http://www.infoq.com/cn/articles/...

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

  • luop
    2018-08-24
    结合这两期对 CAP 的学习和思考,谈下个人的理解。

    设计分布式系统的两大初衷:横向扩展(scalability)和高可用性(availability)。“横向扩展”是为了解决单点瓶颈问题,进而保证高并发量下的「可用性」;“高可用性”是为了解决单点故障(SPOF)问题,进而保证部分节点故障时的「可用性」。由此可以看出,分布式系统的核心诉求就是「可用性」。这个「可用性」正是 CAP 中的 A:用户访问系统时,可以在合理的时间内得到合理的响应。

    为了保证「可用性」,一个分布式系统通常由多个节点组成。这些节点各自维护一份数据,但是不管用户访问到哪个节点,原则上都应该读取到相同的数据。为了达到这个效果,一个节点收到写入请求更新自己的数据后,必须将数据同步到其他节点,以保证各个节点的数据「一致性」。这个「一致性」正是 CAP 中的 C:用户访问系统时,可以读取到最近写入的数据。

    需要注意的是:CAP 并没有考虑数据同步的耗时,所以现实中的分布式系统,理论上无法保证任何时刻的绝对「一致性」;不同业务系统对上述耗时的敏感度不同。

    分布式系统中,节点之间的数据同步是基于网络的。由于网络本身固有的不可靠属性,极端情况下会出现网络不可用的情况,进而将网络两端的节点孤立开来,这就是所谓的“网络分区”现象。“网络分区”理论上是无法避免的,虽然实际发生的概率较低、时长较短。没有发生“网络分区”时,系统可以做到同时保证「一致性」和「可用性」。

    发生“网络分区”时,系统中多个节点的数据一定是不一致的,但是可以选择对用户表现出「一致性」,代价是牺牲「可用性」:将未能同步得到新数据的部分节点置为“不可用状态”,访问到这些节点的用户显然感知到系统是不可用的。发生“网络分区”时,系统也可以选择「可用性」,此时系统中各个节点都是可用的,只是返回给用户的数据是不一致的。这里的选择,就是 CAP 中的 P。

    分布式系统理论上一定会存在 P,所以理论上只能做到 CP 或 AP。如果套用 CAP 中离散的 C/A/P 的概念,理论上没有 P 的只可能是单点(子)系统,所以理论上可以做到 CA。但是单点(子)系统并不是分布式系统,所以其实并不在 CAP 理论的描述范围内。
    展开

    作者回复: 写的非常好👍👍

    共 22 条评论
    346
  • 空档滑行
    2018-06-20
    一个电商网站核心模块有会员,订单,商品,支付,促销管理等。
    对于会员模块,包括登录,个人设置,个人订单,购物车,收藏夹等,这些模块保证AP,数据短时间不一致不影响使用。
    订单模块的下单付款扣减库存操作是整个系统的核心,我觉得CA都需要保证,在极端情况下牺牲P是可以的。
    商品模块的商品上下架和库存管理保证CP,搜索功能因为本身就不是实时性非常高的模块,所以保证AP就可以了。
    促销是短时间的数据不一致,结果就是优惠信息看不到,但是已有的优惠要保证可用,而且优惠可以提前预计算,所以可以保证AP
    现在大部分的电商网站对于支付这一块是独立的系统,或者使用第三方的支付宝,微信。其实CAP是由第三方来保证的,支付系统是一个对CAP要求极高的系统,C是必须要保证的,AP中A相对更重要,不能因为分区,导致所有人都不能支付
    展开

    作者回复: 分析思路很清晰

    共 2 条评论
    80
  • 乘风
    2018-11-30
    老师 你上面说redis集群是互联且数据共享,但按官网上说redis集群后,每个主节点的数据是不一致的,也不存在共享数据,现在对cap中指的分布式系统(互联且数据共享)还是不太明白,谢谢老师

    作者回复: 这里的共享是指同一份数据在多个节点都有,但并不一定在所有节点都有,简单理解有数据复制的系统就是CAP应用的场景。

    一份数据在多个节点有但不是所有节点都有,这是非对称集群;例如ES
    所有数据在所有节点都有,这是对称集群,例如zookeeper

    共 4 条评论
    22
  • 飞
    2018-06-19
    独家解读啊,赞
    
    20
  • 刘毅
    2020-06-16
    CAP理解:
    任何一个正常运行的分布式系统,起源于CA状态,中间(发生分区时)可能经过CP和AP状态,最后回到CA状态。
    所以一个分布式系统,需要考虑实现三点:
    1.正常运行时的CA状态。
    2.发生分区时转变为CP或AP状态。
    3.分区解决时变会CA状态。
    展开

    作者回复: 总结的非常好,第三点可以优化为“分区解决时如何恢复为CA状态”

    
    17
  • xiao皮孩。。
    2019-04-02
    理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

    作者回复: 是的👍👍

    共 5 条评论
    16
  • 正是那朵玫瑰
    2018-08-25
    老师有个疑问,像电商这样的系统,有订单系统和库存系统,创建订单会调用库存系统,这两个系统是互联的,但是并没有数据共享,但超时的情况下,会造成订单数据和库存数据状态不一致,这种算不算cap讨论范畴呢?

    作者回复: 不算,CAP的应用范围已经明确了:互联,共享数据。
    这种情况下的不一致靠对账,人工修复等方式解决

    
    13
  • 文竹
    2018-08-21
    电商网站核心功能有用户、产品、订单、支付、库存,相应的数据有用户、产品、订单、支付、库存。

    对于用户数据,选择CP。因为用户注册后,可能几分钟后重新登录,所以需要满足一致性;在网络出现分区时,因为需要满足一致性而暂时不能提供写服务,所以无法满足可用性;对于分区容错性,只要能返回一个合理的响应就能满足,这一点能很好满足。

    对于产品数据,无需满足一致性,所以选择AP。
    对于订单数据,业务需要满足一致性,所以选择CP。
    对于支付数据,业务需要满足一致性,所以选择CP。
    对于库存数据,业务需要满足一致性,所以选择CP。
    展开

    作者回复: 思路很清晰👍👍

    
    11
  • feifei
    2018-06-20
    电商网站要做高可用架构,就必须先确定业务模块,我没有过电商的经验,就说说我的理解,电商主要有商品,用户,交易,这3快核心

    商品,商户发布某商品或者修改商品,用户查看商品,不需要非常强的一致性,即可以一部分用户先看到,可以使用最终一致性,满足可用性和容错性,可以使用发布队列,进行发布

    用户,有普通的用户,商户这2种用户,用户模块的功能都是注册和登录,需要保证一致性,不能出现用户注册成功了,却不能登录。为了将宕机影响控制在最小,以用户进行分布,针对单节点可以使用数据库的主从,从节点分担读压力

    交易,由于交易系统有强一致性要求,用户的交易要只能成功或者失败,有强事务的处理,考虑交易量大的问题,也按照用户进行分布,单节点采用数据库的集群,数据的多分写入

    这是我的一个初步设计,还请老师指点,谢谢
    展开

    作者回复: 大概思路就是这样,按照业务分析

    
    7
  • zhouwm
    2018-07-24
    CAP理论延时问题:因为延时无法避免意味着完美CP场景不存在。—— 这个说法有问题,一致性是从外部使用者的角度去看的(黑盒),只要在回复应答前保障数据已经同步到其他节点,后续请求能得到新数据就是一致的,etcd就是完美cp,zk其实也能算完美cp。延时问题是系统设计的时候要考虑的点

    作者回复: 不会的,zk是顺序一致性,保证不了完美cp,raft为了可理解而简化了异常处理,某些场景下会丢失数据

    
    6
  • 信信
    2020-03-20
    PACELC定理了解一下?
    在理论计算机科学中,PACELC定理是CAP定理的扩展。它指出,在分布式计算机系统中,在网络分区(P)的情况下,必须在可用性(A)和一致性(C)之间进行选择(根据c a p定理),但是(E),即使系统在没有分区的情况下正常运行,也必须在延迟(L)和一致性(C)之间进行选择。
    PACELC定理首先由耶鲁大学的Daniel J. Abadi 在2010年的一篇博文中描述,他后来在2012年的一篇论文中正式确定。PACELC的目的是声称他的论点“忽略复制系统的一致性/延迟权衡是一个主要的疏忽[在CAP中],因为它在系统运行期间始终存在,而CAP仅在可以说是罕见的网络分区情况下才相关。
    展开

    作者回复: 多谢👍👍

    
    5
  • zhouwm
    2018-07-31
    cap的c指的是线性一致性还是顺序一致性?如果把zk改成读写请求都通过master的话,是否就算完美CP了?因为延时对外不可见。raft在什么情况下丢数据,我理解的丢数据指的是给了请求者正确应答后,写入的数据没保存好,理论上不应该出现的(如果是磁盘缓存导致的,有可能),k8s之类的用etcd也是基于raft的,如果会丢数据都无法保证的话,坑有点大,应该不会有人用吧

    作者回复: CAP的C是严格意义上的绝对一致性,因为不考虑复制延时。

    zk全部走master就不符合CAP的CP定义了,因为CAP是要求各个节点都可以提供读写操作,而不是只做备份复制

    Raft论文中对于leader切换时可能覆盖日志给了一个详细的案例,这个案例不常见,发生概率非常小,而且只覆盖一条数据

    共 3 条评论
    5
  • 我的名字叫浩仔丶
    2018-06-28
    老师,请教下P是什么时机才会触发分区呢?

    作者回复: 断网,网线断也可以,网卡坏也可以,交换机故障也可以

    
    4
  • Leon Wong
    2018-06-21
    我理解CA和CP不是系统的整体设计,而是具体业务点的设计权衡,一种tradeoff ,表现形式是分布式系统在检测到网络分区发生的时候,是倾向于一致性C或是可用性A。而CA对应到的场景是不考虑分区容错的场景,数据有可能在整个分布式系统里只存一份(如果引入多副本相当于引入分区问题),那么就会有单点故障的风险,只能通过将数据分散存储在不同服务器的做法来降低风险的影响面。

    可见每一个设计都有优势,也有弊端,我们需要根据具体场景去做tradeoff……

    作者回复: 架构设计就是判断和选择😀

    
    4
  • 肖一林
    2018-06-20
    在开源的分布式系统中,通常可以让用户配置,选择是CP还是AP,比如kafka,每种消息都可以选择配置。这就是CAP理论对数据粒度的控制。老师归纳的非常好。

    作者回复: 掌握了理论,看具体各种系统实现就比较容易理解了

    
    4
  • 王磊
    2018-06-19
    系统架构中考虑p和不考虑p,对外表现是什么?例如对于考虑p的系统,当p发生时,它还是functon的?发生分区意味着节点间不再联通,数据不再共享,要么为了c回复错误,此时丢了a; 要么为了a,但可能会返回过期数据,丢了c。所以考虑了p比没考虑p的系统到底带来额外什么好处?

    作者回复: 考虑P的系统在分区场景下还能提供部分业务

    共 2 条评论
    4
  • 第一装甲集群司令克莱...
    2020-10-30
    CAP追求强一致性是丰满的梦想,BASE最终一致性才是骨感的现实!

    作者回复: 工程实现和理论模型有巨大的鸿沟

    
    3
  • 姜华梁taric
    2018-11-19
    老师,互联与共享数据,怎么理解,可以举一个实例嘛

    作者回复: memcache集群不互联不共享数据,redis集群互联且共享数据

    
    3
  • 云辉
    2018-06-19
    对CAP和Base了解更清楚了,原来Base是说出现P的情况下一种合适的解决方案
    共 1 条评论
    3
  • Han
    2020-07-18
    您提到CAP是要求各个节点都可以提供读写操作,但现在大部分的分布式中间件实现基本都是一主多从架构,只有主节点才会接收写请求,主从节点都能接收读请求。 而且很多一致性算法都是设定只有主节点才接收写请求,然后把数据同步到从节点。 请问您怎么看?

    作者回复: 这样做是通过限制主才能写来避免数据一致性问题,但是复杂度转移到如何选举主上去了,这就是大家普遍认为选举比数据一致性要简单一些😁

    
    2