定义
It is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees:
- Consistency: every read receives the most recent write or an error
- Availability: every request receives a (non-error) response – without guarantee that it contains the most recent write
- Partition Tolerance: the system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes
在一个分布式存储系统中,不可能同时满足以下三点:
- 一致性:每次读请求都可以获取到数据的最新副本或者出错
- 可用性:每次读请求都能获得一个非错响应 - 但是不保证获取的数据为最新数据
- 分区容错性:系统仍然能够对外提供一致性和可用性保障,即使有任意数量的消息在网络传输时被丢弃或延时送达
解释
CP系统
在上图的CP系统中,网络分区阻止了Slave从Master同步最新数据到本地,因此Slave无法得知本地数据副本是否为最新数据,为了保证一致性,因而拒绝对外提供响应。
- 该系统具备分区容错性,因为它允许节点通信出现故障
- 该系统具备一致性,因为它拒绝对外提供非最新的数据副本
- 该系统可用性较低,因为它会因为无法判断本地副本是否为最新而拒绝响应
AP系统
在上图的AP系统中,网络分区阻止了Slave从Master同步最新数据到本地,因此Slave无法得知本地数据副本是否为最新数据,为了保证可用性,Slave对外提供本地的副本,即使它可能不是最新数据。
- 该系统具备分区容错性,因为它允许节点通信出现故障
- 该系统具备高可用性,因为它总会提供一个数据副本,即使它非最新
- 该系统一致性较差,因为它无法确保提供的数据总是最新
CA系统
在上图的CA系统中,网络是可靠的,因此可以确保Master节点的数据更新同步到Slave节点
- 该系统具备一致性,因为它总能提供数据的最新副本
- 该系统具备高可用性,因为它的所有节点总能提供一个数据响应
- 该系统不具备分区容错性,因为这里网络是可靠的,不会出现分区(现实很残酷)