CAP是分布式系统最基础的理论,CAP分别表示三个特性:
- Consistency 一致性
- Availability 可用性
- Partition tolerance 分区容错性
一个分布式系统最多满足其中两个特性,无法同时满足三个特性,这就是CAP理论。
特性介绍
Consistency
一致性就是无论从哪个节点读取的数据应该都是相同的、最新的。
Availability
可用性就是任何时候的请求都可以获得正确的响应,但是不保证获取的数据为最新数据。
Partition tolerance
-
什么是分区?
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,系统不能在一定时限内达成数据一致性,我们就称网络产生了分区。
分区容错性就是指网络出现分区后,系统仍能正常工作,即系统能够容忍节点之间的网络通信的故障。提高分区容错性的方法就是将数据复制存储在多个节点上。
数据复制存在的节点越多,分区容错性越高,但是要复制的数据就越多,一致性就越难保证。而要保证一致性,那么系统达到一致性的时间就越久,可用性就越差。
如果要满足分区容错性,就必须在多台机器上备份数据,因此只要是分布式系统,可以理解为就必须满足分区容错性。
无法同时满足
上述说到分布式系统一般满足分区容错性,那我们看看为什么不能同时满足C和A。
假设系统有两个节点S1、S2,C是访问客户端。
-
满足一致性,假设C给S1更新值,那么S1要将值同步到S2,这需要一定时间,或者出现网络故障,可能需要更长的恢复时间,在系统未达到完全一致的这段时间内,无法对外提供服务,即不满足可用性。
-
满足可用性,即S1还未更新到S2这段时间内也可对外提供服务,那么则没法满足一致性。
如何选择
- 不要 P,不满足 P 的系统不是分布式系统。
- 不要 C,即满足可用性损失一定一致性。这是互联网环境下最多的使用场景,优先满足系统高可用,损失短暂的一致性,但随着节点同步系统会迅速恢复一致性。
- 不要A,即满足一致性损失一定可用性。这只在数据一致性要求比较高的场合下应用,如 zookeeper、Hbase。