分布式理论:CAP 定理
什么是 CAP 定理
2000年7月的时候,加州大学伯克利分校的Eric Brewer 教授提出了 CAP 猜想,2年后,被来自于麻省理工的Seth Gilbert 和 Nancy Lynch 从理论上证明了猜想的可能性。从此,CAP 定理正式在学术上成为了分布式计算领域的公认定理,并深深影响了分布式计算的发展。
CAP 定理告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A:Availability),分区容错性(P:Partition tolerance) 这三个基本需求,最多只能同时满足其中的两个
选项 | 描述 |
---|---|
C (Consistence) | 一致性,分布式环境中,数据在多个副本之间能够保持一致的特性(严格的一致性)。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证各个节点的数据仍然处于一致的状态。所有的副本都是最新的 |
A (Availability) | 可用性,指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应,但是不保证获取的数据为最新数据。系统总是可写 |
P (Partition tolerance) | 分区容错性,分布式系统在遇到任何网络分区故障时,仍然能够提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。允许网络通讯出现故障,不论是短暂延时或长时间故障,容忍网络隔离意味着系统横向扩展性增强 |
为什么只能 3 选 2
首先,我们反证一下,能不能同时满足这三个条件?
假设有一个系统如下:
上图整个系统由两个节点配合组成,节点之间通过网络通信,当节点A进行数据库更新时,需要同时更新节点B的数据库(这是一个原子操作)。
上面这个系统怎么满足CAP呢?
C : 当节点A更新时,节点B也要更新
A : 必须保证两个节点都是可用的
P : 当节点A/B 出现了网络分区,必须保证对外可用
可见,根本无法同时满足CAP,因为只要出现了网络分区,C就无法满足,因为节点A根本连不上节点B。如果强行满足C 一致性,就必须停止服务,从而放弃可用性A。
所有,最多满足两个条件。
组合 | 分析结果 |
---|---|
CA | 满足一致性和可用性,放弃分区容错。说白了,就是一个整体的应用,如果希望能够避免系统出现分区容错性的问题,一种较为简单的做法是将所有的数据(或者仅仅是那些与事务相关的数据)都放在一个分布式节点上。这样做虽然无法100%保证系统不会出错,但至少不会碰到由于网络分区带来的负面影响。但是放弃P的同时,意味着放弃了系统的可扩展性 |
CP | 满足一致性和分区容错性,一旦系统遇到网络分区或者其他故障或为了保证一致性时,放弃可用性,那么受到影响的服务需要等待一定的时间,因此在等待期间系统无法正常对外提供服务,即不可用 |
AP | 满足可用性和分区容错性,当出现网络分区,同时为了保证可用性,必须让节点继续对外服务。这样必然导致失去一致性。这里所说的放弃一致性,并不是完全不需要数据一致性,如果真是这样,那系统数据就没意义了。 这里实际上指的是放弃数据的强一致性,保留数据的最终一致性。这样的系统虽然无法保证数据实时的一致性,但是能够承诺最终会达到一个一致的状态。 这就引入了一个时间窗口的概念,具体多久能够达到数据一致取决于系统的设计,主要包括数据副本在不同节点之间的复制时间长短 |
从 CAP 定理可以看出,一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能同时满足其中的2个,还需要明确一点的是:
对于一个分布式系统而言,分区容错性是最基本的要求 。
因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就没有所谓的分布式系统了。因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要面对和解决的问题。因此架构师往往需要把精力花在如何根据业务特点在 C(一致性) 和 A(可用性) 之间寻找平衡。