分布式CAP理论
1. CAP需求
在分布式环境下,设计和部署系统时主要考虑下面三个核心系统需求:
- 一致性(Consistency):所有节点在同一时间具有相同的数据
- 可用性(Availability):保证对于每个请求的成功或失败都有响应
- 分区容错性(Partition Tolerance):系统中信息的丢失或者失败并不影响系统运行
1.1 一致性
在分布式系统中,数据存在多个副本。一致性是指对某数据修改后,存在各个副本中的该数据始终保持一致
通常将这种操作称为一致性操作,一致性操作是原子性的操作,即对数据的增删改结果是所有副本全都成功才算成功,否则失败
如果一个存储系统能够保证一致性,那么客户读取的数据可以保证是最新的数据,不会发生两个客户端在不同存储节点读取到不同的数据副本
1.2 可用性
可用性是指客户端访问数据时,可以得到响应,但系统可用并不代表存储系统的所有节点提供的数据一致
往往可对不同的应用设定一个定长响应时间,超过这个时间的服务认为是不可用的
可用性只代表服务可用,主要标志是可以完成响应,无论成功或失败
1.3 分区容错性
在分布系统中,为了提高系统性能,可以将同一数据的副本分布地存放在不同地点。分区容错性是指分布系统的容错性
除非网络的全部节点都出现故障,否则所有子集合节点的故障都不能导致整个系统的不正确响应
显然,将数据分布在不同节点上,就有形成分区的风险
如果网线被切断,分区就形成,两节点之间无法进行通信
分区容错性也可以理解为系统在存在网络分区的情况下仍然可以接受满足一致性或可用性的请求
2. CAP定理
CAP定义指出:在一个分布式系统中,不可能同时满足一致性、可用性和分区容错性三个系统需求,最多只能满足两个
2.1 三中取二原则
目前互联网中的很多分布式系统是基于首要满足可用性和分区容错性而设计。当处理CAP的问题时,有如下几个选择:
(1)放弃可用性
如果选择分区容错性和一致性,放弃了可用性,那么即使节点损坏,为保证一致性,必须百分之百地保证所有节点之间有很好的连通性,这是很难做到的
最好的办法就是将所有数据放到同一个节点中,但显然这种设计一旦遇到分区事件,受影响的服务需要等待数据一致,在等待期间就无法对外提供服务
在多个节点上控制数据一致相当复杂,而且恢复的节点需要处理逻辑,以便平滑地返回服务状态
(2)放弃分区容错性
如果要满足一致性和可用性,必须要有回滚操作。这样,系统显然无法容忍分区,当同一数据的两个副本分配到了两个无法通信的分区上并需要回滚操作时,将会返回错误的数据。
满足一致性和可用性的系统通常在可扩展性方面不太强,如传统的关系数据库系统MySQL 等
(3)放弃一致性
如果选择分区容错性和可用性,放弃了一致性,当节点损坏时,遇到分区事件,受影响的服务不需要等待数据一致,就可以对外提供服务,保证了可用性
满足可用性与分区容错性的系统主要是一些面向文档的适用于分布式系统的数据库,如SimpleDB
对于跨区域的系统,设计者无法舍弃分区容错性,那么就只能在数据一致性和可用性上做一个艰难选择
一般说来,NoSQL 的主题是创造可用性优先、数据一致性其次的方案;而传统关系数据库保持 ACID 特性
3. BASE模型
BASE(Basically Available, Soft-state,Eventually consistent)是基本可用、软状态、最终一致性的英文缩写
BASE 思想主要强调基本的可用性,显然 BASE 支持最终一致的概念。BASE 是ACID 的反面,BASE 要求牺牲高一致性,获得可用性或可靠性
BASE 理论是 CAP 理论结合解决实际问题的产物。大规模跨区域分布的系统,包括云在内,也运用了这种思路
BASE 方法通过牺牲一致性来提高可用性和系统性能
3.1 不同程度的一致性
强一致性:强一致性又称为即时一致性,假如 A 操作先写入了一个值到存储系统,存储系统保证后续 A、B、C 的读取操作都将返回最新值
弱一致性:假如 A 先写入了一个值到存储系统,存储系统不能保证后续 A、B、C 的读取操作能读取到最新值,即 A 写完的数据并不能立刻读到
最终一致性:最终一致性是弱一致性的一种特例,是指系统需要在某一时刻后达到一致性要求。假如 A 首先写了一个值到存储系统,存储系统保证如果在 A、B、C 后续读取之前没有其他写操作更新同样的值,最终所有的读取操作都将读取到 A 写入的最新值
3.2 基本可用
基本可用的含义是系统能够基本运行、始终提供服务。BASE 模型与 ACID 模型相反,通过牺牲高一致性,获得可用性分区容错性
3.3 软状态
软状态是指系统不要求一直保持强一致状态,可以有一段时间不同步。软状态也可以理解为无连接的, 而硬状态是有连接的