> For the complete documentation index, see [llms.txt](https://yangsx95.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yangsx95.gitbook.io/notes/distributed/fen-bu-shi-ji-chu-li-lun/cap-li-lun.md).

# CAP理论

## 定义

CAP理论是指计算机分布式系统的三个核心特性：

* 一致性（Consistency），多个节点上的数据副本必须时刻保持一致
* 可用性（Availability），系统必须在任何时候都能够响应客户端请求
* 分区容错性（Partition Tolerance），系统必须能够容忍分布式系统中的某些节点或网络分区出现故障或延迟（也就是可以出现网络节点断联的情况）

CAP理论认为，分布式系统最多只能同时满足其中的两个特性，而无法同时满足全部三个特性。这是因为在分布式系统中，**网络分区和节点故障是不可避免的**，而保证一致性和可用性需要跨节点协调，这会增加网络延迟和系统复杂度。

![](/files/pWoKD8uJ4GVzVoK8JIcf)

## 证明CAP不能兼得

```txt
在保证 分区容错性，一致性 的情况下：
      当发生网络延迟或者断开，为了数据一致性，必须将请求阻塞等待，知道收到响应为止。
      这样就牺牲了可用性。

在保证 分区容错性，可用性 的情况下：
      当网络发生延迟或者断开，为了可用性，就必定损失一定的一致性。
      因为为了可用性，一定要返回一个不一致的数据。

在保证 可用性、一致性 的情况下：
      这就必定要求，所有的请求连接都不能发生故障。
      从而必须牺牲分区容错性。
```

CAP理论指导我们在设计分布式系统时要根据实际情况进行权衡和取舍，并在一致性、可用性和分区容错性之间做出适当的平衡。

## CAP怎么选

### CA 放弃分区容错性，保证一致性和可用性

这种策略适用于小规模的集中式系统，如传统的关系型数据库系统。假设不考虑分区（P）的情况下，只有一个分区（副本），副本的一致性自不必说，自然是一致的；可用性方面，一个节点的写入不需要同步到其他节点，可以高效完成。如果增加多个分区（提高分区容错性），数据的写入需要同步到多个节点（强一致性，所有节点同步成功后再返回用户），增加了同步时间和同步失败的可能性，降低了可用性；如果采用弱一致性，即写入操作在主节点成功后即返回用户结果，再通过异步方式同步到多个分区，那么会增加同步失败和数据丢失的几率，降低了一致性。

> 如果放弃分区容错，就是放弃了系统的拓展性，分布式节点将会受限（单个节点故障会导致整个网络瘫痪），违反了分布式设计的初衷。

### CP 放弃可用性，保证一致性和分区容错性

这种策略适用于对数据一致性要求比较高的系统，如金融交易系统。假设不考虑可用性（A）的情况下，多个分区之间可以采用强一致性的机制，保证数据的高度一致性（要么都成功要么都失败）。比如某个分区出现了故障或者分隔，分区没有了响应，由于放弃了可用性，所以可以无限等待并不断重试直到网络恢复，分区可用后将副本数据同步到所有节点。

### AP 放弃一致性，保证可用性和分区容错性

这种策略适用于对数据实时性要求比较高的系统，如社交网络等。假设不考虑一致性（C)的情况下，多个分区和副本可以提供高可用性。分区越多，用户越能就近访问，提供响应速度；放弃了一致性后，副本的写入操作可以写入主节点成功后即可返回成功，获得搞可用性，然后通过异步的方式将副本同步到多个分区节点上。
