CAP理论

一、CAP理论概述

一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

那可能就有人不同意了,为啥只能满足其中的两项呢? 为啥非要让我在“一致性”,“可用性”和“分区容错性”中选2个呢? 我就不,我偏不。

不是说只有小孩子才做选择题,而大人两个都要的吗? 所以你还是小孩子,年轻真棒,香啊!

1、啥是一致性?

一致性指 “all nodes see the same data at the same time”,即所有节点在同一时间的数据完全一致。即多副本(Replications)问题中的数据一致性

对于一致性,可以分为强一致性、弱一致性、最终一致性三类,下面我来分别说说三者

强一致性

当更新操作完成之后,在任何时刻所有的用户或者进程查询到的都是最近一次成功更新的数据。强一致性是程度最高一致性要求,也是最难实现的。关系型数据库更新操作就是这个案例。

弱一致性

当数据更新后,后续对该数据的读取操作可能得到更新后的值,也可能是更改前的值。

最终一致性

在某一时刻用户或者进程查询到的数据可能都不同,但是最终成功更新的数据都会被所有用户或者进程查询到。简单理解为,就是在一段时间后,数据会最终达到一致状态。

2、啥是可用性?

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

3、啥是分区容错性?

分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。

二、核心证明:CAP为啥只能满足其中的2个

在这里插入图片描述

N1和N2是分布式系统中的多个服务节点,比如我们从N1节点上使用A程序往DB1里写数据,写完了以后就得做数据同步的工作,把DB1的数据同步更新到DB2上,确保数据一致性。

这是正常运作的场景,也是理想的场景,然而现实是残酷的,当错误发生的时候,一致性和可用性还有分区容错性,是否能同时满足,还是说要进行取舍呢?

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

作为一个分布式系统,它和单机系统的最大区别,就在于网络,现在假设一种极端情况,N1和N2之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性,能不能同时满足一致性和可用性呢?还是说要对他们进行取舍。

在这里插入图片描述

假设在N1和N2之间网络断开的时候,有用户向N1发送数据更新请求,那DB1中的数据就是最新的,但是由于网络是断开的,所以在第2步数据同步的过程中失败了,所以N2中的数据依旧是旧数据;这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据,怎么办呢?

有二种选择,第一,牺牲数据一致性,N2节点直接响应旧的数据给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据同步完成之后,N2节点再给用户响应最新的数据。

这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。

三、那该如何权衡CAP呢?

通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?

对于多数大型互联网应用的场景,主机众多、部署分散,分区容忍性是基本要求,否则就失去了价值,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。

对于涉及到金钱财务这样的不能有一丝让步的场景,C必须保证。网络发生故障宁可停止服务,这是保证CA,舍弃P。 还有一种是保证CP,舍弃A。例如网络故障是只读不写。所以说到底如何权衡CAP,没有定论,只能根据场景定夺,适合的才是最好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值