# CAP 原理

<mark style="color:blue;">**CAP 原理**</mark>认为，<mark style="color:orange;">**一个提供数据服务的存储系统无法同时满足数据一致性（Consistency）、数据可用性（Availibility）、分区耐受性（Patition Tolerance，系统具有跨网络分区的伸缩性）这三个条件。**</mark>

在大型网站应用中，数据规模总是快速扩张的，因此<mark style="color:blue;">**可伸缩性即分区耐受性必不可少**</mark>，规模变大以后，机器数量也会变得庞大，这时网络和服务器故障会频繁出现，要想保证应用可用，就必须保证分布式处理系统的高可用性。所以<mark style="color:blue;">**在大型网站中，通常会选择强化分布式存储系统的可用性（A）和伸缩性（P），而在某种程度上放弃一致性（C）**</mark>。一般说来，数据不一致通常出现在系统高并发写操作或者集群状态不稳定（故障恢复、集群扩容……）的情况下，**应用系统需要对分布式数据处理系统的数据不一致性有所了解并进行某种意义上的补偿和纠错，以避免出现应用系统数据不正确**。

数据一致性可分为如下几点：

* <mark style="color:blue;">**数据强一致**</mark>
  * **各个副本的数据在物理存储中总是一致的**；
  * **数据更新操作结果和操作响应总是一致的**，即操作响应通知更新失败，那么数据一定没有被更新，而不是处于不确定状态。
* <mark style="color:blue;">**数据用户一致**</mark>\
  即数据在物理存储中的各个副本的数据可能是不一致的，但是**终端用户访问时，通过纠错和校验机制，可以确定一个一致的且正确的数据返回给用户**。
* <mark style="color:blue;">**数据最终一致**</mark>\
  这是数据一致性中较弱的一种，即物理存储的数据可能是不一致的，终端用户访问到的数据可能也是不一致的（同一用户连续访问，结果不同；或者不同用户同时访问，结果不同），但**系统经过一段时间（通常是一个比较短的时间段）的自我恢复和修正，数据最终会达到一致**。

因为难以满足数据强一致性，网站通常会综合成本、技术、业务场景等条件，结合应用服务和其他的数据监控与纠错功能，使存储系统达到用户一致，保证最终用户访问数据的正确性。
