CAP 理论(CAP Theorem)是分布式计算领域的一个基本原理,由计算机科学家 Eric Brewer 在 2000 年提出。CAP 理论描述了在设计分布式系统时面临的三个基本要素:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容忍性(Partition Tolerance)
CAP 理论
一致性(Consistency)
在分布式系统中的所有节点看到的数据副本都是一致的。即,在任何给定时间点,所有节点都具有相同的数据。更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。 一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。
可用性(Availability)
可用性指 Reads and writes always succeed ,即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时而导致无法响应。
分区容错性(Partition Tolerance)
即分布式系统在遇到某些节点或网络分区出现故障或通信中断的时候,仍然能够对外提供满足一致性和可用性的服务。
分区指的是网络中的一部分节点无法与其他节点进行通信,形成了不可达的分区。分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。
CAP 理论指出,在分布式系统中,无法同时满足一致性、可用性和分区容忍性这三个特性,只能在其中选择满足两个特性。这是因为在分布式系统中,网络分区是不可避免的,因此必须在一致性和可用性之间进行权衡取舍。
CAP 类型
CAP 三个特性只能同时满足其中两个,那么取舍的策略就共有三种。
CP without A
强调一致性和分区容忍性,牺牲可用性。在网络分区时,系统可能会拒绝一些请求,以保证数据的一致性。例如,关系型数据库系统通常倾向于 CP 模型。
如果不要求 A(可用),相当于每个请求都需要在服务器之间保持强一致,而 P(分区)会导致同步时间无限延长 (也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成 CP 的系统其实不少,最典型的就是分布式数据库,如 Redis、HBase 等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。
AP without C
强调可用性和分区容忍性,牺牲一致性。即使在网络分区时,系统仍然保持对请求的响应,但可能会返回部分数据副本之间的不一致结果。例如,大规模分布式缓存系统通常倾向于 AP 模型。
要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。
CA without P
强调一致性和可用性,牺牲分区容忍性。在系统中不允许网络分区,以确保数据的一致性和可用性。这种模型通常适用于小型的、集中式的系统。
如果不要求 P(不允许分区),则 C(强一致性)和 A(可用性)是可以保证的。但放弃 P 的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。
总结
分布式系统中,一定是存在开始状态、中间状态、结束状态的。在 CAP 理论中,希望只存在开始状态和结束状态的,但这是不可能实现的,
CAP 理论是分布式系统的理论基石。