CAP 理论

/ 分布式 / 528浏览

CAP理论的由来

对于互联网中的大型电子商务网站,如京东商城、天猫商城等等,要求系统能够 7*24小时不间断地对外提供服务,而对于一致性,则更加是所有消费者的刚需。 如果系统期望实现一套严格满足 ACID 特性的分布式事务,很可能出现的情况就是在系统的可用性和严格的一致性之间出现冲突——因为当我们要求分布式系统具有严格一致性时,很可能就要需要牺牲掉系统的可用性。

因此,在可用性和一致性之间永远无法存在一个两全齐美的方案,于是如何构建一个兼顾可用性和一致性的分布式系统就成为了无数工程师探讨的难题,出现了诸如CAP、BASE这样的分布式系统经典理论。

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上,首次提出了著名的 CAP 猜想。2年后,来自麻省理工学院的 Seth Gibert 和 Nancy Lynch从理论上证明了 Brewer教授 CAP 猜想的可行性,从此,CAP理论正式在学术上成为了分布式计算机领域的公认定理,并深深的影响了分布式计算机的发展。

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这3个基本需求,最多只能同时满足其中的两个。

CAP理论介绍

Consistency(一致性)

分布式环境中,一致性是指数据在多个副本之间是否能保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。

对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,读取的依然时老数据(或称为脏数据),这就是典型的分布式数据不一致状态。

在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到最新的数值,那么这样的系统就被认为具有强一致性(或严格一致性)特性。

Availability(可用性)

可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在 有限的时间内 响应结果。

有限的时间内 是指,对于用户的一个操作请求,系统必须能够在指定的时间内返回处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。

有限的时间内一般是一个系统在设计之初就设定好的一个运行指标,比如对于一个搜索引擎来说,通常在0.5秒内给用户搜索的关键词对应地显示结果。而对于一个HIVE的海量数据查询平台来说,正常一次数据检索可能在20 - 30 秒,甚至更长时间。

Partition tolerance(分区容错性)

分区容错性约束了一个分布式系统需要具有如下特征:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

网络分区是指在分布式系统中,不同的节点分布在不同的子网络(即机房或异地网络)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出,都一个看作是一个特殊的网络分区。

CAP 定理结论

alt

CAP定理示意图

从CAP定理可以看出,一个分布式系统不可能同时满足一致性、可用性和分区容错性三个需求。另外分布式系统对分区容错性是一个最基本的要求(因为一个分布式系统中的组件必然需要被部署到不同的节点,否则也无所谓分布式系统了,因此必须出现子网络)。而对于分布式系统,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要面对和解决的问题。因此系统架构设设计上往往把精力放在如何根据业务特点在C(一致性)和A(可用性)之间寻求权衡。

权衡
放弃P如果希望能够避免系统出现分区容错性问题,一种较为简单的做法是将所有的数据都放在一个
分布式节点上。这样的做法虽然无法100%保证系统不会出现问题,但是至少不会碰到由于网络
分区带来的负面影响。但是通缩需要注意的是,放弃P的同时也就意味着同时也放弃了系统的
扩展能力。
放弃A相对于放弃P(分区容错性)来说,放弃可用性则正好相反,其做法是一旦系统遇到网络分区或
其它故障时,那么收到影响的服务需要等待一定的时间,因此在等待期间内系统无法对外提供正
常的服务,即不可用。
放弃C放弃C(一致性)是指放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据
保持实时的一致性,但是能够承诺的是,数据最终会达到一个一致性的状态。这就引入了一个时间
窗口的概念,具体多久能够达到数据一致性取决于系统的设计,主要包括副本在不同节点之间的
复制时间长短。

alt

配图:瑞士少女峰,坐落于伯恩阿尔卑斯山