CAP 定理
在计算机科学理论(TOS)中,CAP 定理也叫 Brewer’s theorem,是以计算机科学家 Eric Brewer 名字命名的,他提出在分布式数据存储中,不可能同时存在以下三点的两点;
- 一致性(Consistency):每次读都会接收最近的写或一个错误
- 可用性(Availability):每次请求接收一个(非错误)响应,它并不保证这个请求包含最新的写操作
- 分区容错性(Partition tolerance):当发生网络分区错误,网络节点之间信息丢失或延迟时,我们应该让系统继续操作
- 取消操作来降低可用性,但是要确保一致性
- 继续操作来提供可用性,但是会有非一致性的危险
特别的,CAP 定理意味着在网络分区情况下,必须在一致性和可用性之间做出选择。要注意在 CAP 中的一致性是有别于数据库事务的强一致性(ACID)的
详解
没有一个分布式系统在网络异常下是安全的,因此在一般情况下必须容忍网络分区。在存在分区下,就只剩下两个选项中选择一个:一致性或可用性。当选择一致性时,如果由于网络分区无法保证特定信息是最新的,系统将会返回一个错误或者超时。当选择可用性时,系统总是会继续处理查询以及尝试返回最进可用版本的信息,甚至这个信息由于分区不保证是最新的。
在没有网络错误的情况下——那就是说当分布式系统照常运行 ,可用性和一致性都能满足。
CAP 时常被误解的任务它必须在这三个中放弃其中一个。事实上,只有在当网络分区或发生错误时,才只在一致性和可用性上做出一个选择。在其他时候,不需要做任何取舍。
数据库系统被设计成传统的 ACID 来保证像关系型数据库选择一致性而不是可用性,然而系统是围绕最终一致性原理设计的,选择可用性而不是一致性,例如在 NoSQL 中很常见。
PACELC 定理是在 CAP 基础之上建立的,即使在没有分区的情况下,但在其他方面如延迟性和一致性之间的权衡。