CAP理论

在一个分布式系统中,存在一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三种特性。 这三种特性在一个系统(运行)中只能同时满足其中两项。CAP理论的前提是 “分布式”系统 ,如果一个系统不满足分布式这一性质,那就无从提起CAP理论,下文中的系统代指”分布式系统“。

CAP的定义

一致性(Consistency)

一致性指的是数据的一致性,所有节点在同一时间获取到的数据都是相同的(并发读写)。在更新、删除等操作成功并返回客户端完成后,所有的节点在同一时间的数据完全一致。

一致性策略:

  1. 强一致性

    要求更新过的数据能被后续的访问都看到,任何时刻访问任何正常服务的节点都能得到相同的数据。由于强一致性的要求通常会牺牲可用性来保证数据的一致性。

  2. 弱一致性

    容忍部分节点的数据存在一定程度的不一致,用于换取更高的性能/可用性。

  3. 最终一致性

    经过一段实际后能访问到更新后的数据。在极端情况下可能会导致部分节点的数据不是最新的,在问题解决后最终会将数据同步为一致。

CAP中无法同时满足的一致性指的是“强一致性”这一策略。强一致性模型下还有线性一致性和顺序一致性的细分。

线性一致性

线性一致性是一种最严格的强一致性模型,其强调在分布式系统中的任何时间点,读操作都应该返回最近的写操作的结果。

例:操作A在操作B之前成功完成,那么操作B在序列化中应该看起来在操作A之后发生,即操作A应该在操作B之前完成。

顺序一致性

顺序一致性相比线性一致性放宽了一些限制,分布式系统会维护全局的操作顺序,保证客户端获取操作顺序一致的结果。

顺序一致性不强调实时性,只要操作顺序是一致的就可以适当接受一定的延迟。与最终一致性的差别是,最终一致性只要求结果是一致的,并不强调操作的顺序。

可用性(Availability)

可用性指的是系统一直以正常响应时间提供可用服务。每一个非故障节点必须对所有请求做出正常响应,不出现操作失败活用户访问超时等问题。
系统中的上下游服务、负载均衡、Web服务器、数据库等任何不稳定都可能会影响系统的可用性

分区容错性(Partition tolerance)

分区容错性指系统在遇到某个节点或者网络分区故障时,其他节点依旧能够对外提供一致性或可用性的服务。

CAP的权衡

既然CAP三种特性无法同时满足,那么如何选择特性来提供服务呢?

CA without P

对于分布式系统来说,分区容错性是基本要求,这种情况几乎不存在,系统在部署不同的环境必然存在网络分区的情况,如果舍弃了P,那么这个系统就不属于分布式系统了。

CP without A

主要出现在不要求强可用性的分布式系统,或者对数据一致性要求较高的系统(如金融相关行业),允许一段时间的停机或服务无响应,就可以在保证数据一致性、分区容错性的情况下而舍弃可用性。

因此相同不保证每次服务请求的可用性,极端情况下可能会出现请求被丢弃的情况。

AP without C

主要出现在可放弃一致性的高可用分布式系统,当部分节点出现问题时,节点之间会失去联系无法同步数据,但为了保证高可用,节点会使用本地数据或剩余节点分区的数据提供服务,此时可能会导致全局数据不一致。

如购物网站、12306,在一段时间内的商品页面显示仍有剩余物品,但到最后的下单付款阶段提示余量不足,这在可用性方面(尤其是响应时间)保证了系统的正常服务,牺牲了一部分的用户体验。

结语

CAP理论存在于分布式系统中,究竟该选择AP还是CP,需要根据需求权衡取舍选择适合的特性,合适的才是最好的。