# FLP原理 CAP理论 BASE/ACID
## FLP原理(FLP不可能原理)
在网络可靠、但允许节点失效(即便只有一个)的最小化异步模型系统��,不存在一个可以解决一致性问题的确定性共识算法(No completely asynchronous consensus protocol can tolerate even a single unannounced process death)
## CAP原理
分布式系统无法同时确保一致性(Consistency)、可用性(Availability)和分区容忍性(Partition),设计中往往需要弱化对某个特性的需求。

- 一致性(Consistency):这里的一致性指的是**强一致性**——任何事务都必须是原子的,同一份数据(如数据库)的所有副本(如有)都应该在每个时刻保持完全一致;
- 可用性(Availability):系统在有限时间内正确应答所有请求的能力;
- 分区容忍性(Partition tolerance):系统在出现网络分区时(即出现互不连通的子图时),仍然能够对外提供满足一致性和可用性的服务的能力。
CAP 原理认为,分布式系统最多只能保证三项特性中的两项特性。
## 简单解释
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
[来源](https://www.zhihu.com/question/54105974/answer/139037688)
## 应用场景
既然 CAP 三种特性不可同时得到保障,则设计系统时候必然要弱化对某个特性的支持。
### 弱化一致性
对结果一致性不敏感的应用,可以允许在新版本上线后过一段时间才最终更新成功,期间不保证一致性。
例如网站静态页面内容、实时性较弱的查询类数据库等,简单分布式同步协议如 Gossip,以及 CouchDB、Cassandra 数据库等,都为此设计。
对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C。
### 弱化可用性
对结果一致性很敏感的应用,例如银行取款机,当系统故障时候会拒绝服务。MongoDB、Redis、MapReduce 等为此设计。
对于涉及到钱财这样不能有一丝让步的场景,C必须保证。网络发生故障宁可停止服务,这是保证CA,舍弃P。
### 弱化分区容忍性
现实中,网络分区出现概率较小,但很难完全避免。实践中,网络可以通过双通道等机制增强可靠性,实现高稳定的网络通信。
两阶段的提交算法,某些关系型数据库以及 ZooKeeper 主要考虑了这种设计。
# BASE
> BASE是指基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventual Consistency)
BASE理论是对CAP理论的延伸,核心思想是**即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。**
- **基本可用(Basically Available)**:系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
- **软状态(Soft State)**:软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
- **最终一致性(Eventual Consistency)**:最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性不如强一致性那么严格,最终一致性是弱一致性的一种特殊情况。
# ACID
> ACID,即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)四种特性的缩写
ACID 也是一种比较出名的描述一致性的原则,通常出现在分布式数据库等基于事务过程的系统中。
- **原子性(Atomicity)**:每次事务是原子的,事务包含的所有操作要么全做,要么全不做。一旦有操作失败,则需要回退状态到执行事务之前;
- **完整性(Consistency)**:数据库的状态在事务执行前后的状态是一致的和完整的,无中间状态。即只能处于事务成功提交后或事务回滚后的状态;
- **隔离性(Isolation)**:各种事务可以并发执行,但彼此之间互相不影响。按照标准 SQL 规范,从弱到强可以分为未授权读取、授权读取、可重复读取和串��化四种隔离等级;
- **持久性(Durability)**:状态的改变是持久的,不会失效。一旦某个事务提交,则它造成的状态变更就是永久性的。
> ACID 和 BASE 在英文中分别是“酸”和“碱”,看似对立,实则是对 CAP 三特性的不同取舍。