分布式系统在设计与处理时,往往会考虑可用性与数据一致性的问题,因此引入了 CAP 理论分析分布式系统设计
定义
维基百科:
-
Consistency : Every read receives the most recent write or an error
-
Availability : Every request receives a (non-error) response, without the 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
解释
-
一致性: 客户端每次读取数据时,要么返回错误,要么返回最新数据。
- 一致性强调的是数据是最新、一致且正确的。
-
可用性: 客户端每次请求都能得到非异常的响应,可以不保证数据是最新的。
- 可用性强调的是不向外界暴露错误或异常
-
分区容错性: 当节点之间的网络出现丢包时,系统仍能对外提供服务。
- 分区容错性强调的是服务不会因一个节点故障导致系统错误,整个系统能够保证不宕机。
CAP 理论即:一个分布式系统,不可能同时做到以上三点
C、A、P的冲突
若要保证一致性与可用性,就必须舍弃分区策略。
在单机服务上,我们可以保证数据的高一致性与可用性,但加入分区之后就不可以,因为我们无法忽略网络延迟与网络故障。
若要保证一致性和分区容错性,就无法保证可用性。
维护数据一致性在分区策略中必须采取数据同步策略,那么在数据同步期间,就必须使得新的请求阻塞,否则就会破坏数据一致。
若要保证可用性和分区容错性,就必须舍弃一致性。
若保证系统实时访问,就必定存在在节点之间做数据同步的过程中,访问不同节点出现的不同数据。
C、A、P的取舍
舍弃 P,即放弃分区。
这在单机服务中是可行的,但违背了分布式系统的设计初衷,所以分布式系统一般都是在 C、A之间抉择。
舍弃 A,即放弃高可用。
这类系统一般是要求强数据一致性的系统,例如对于大多数的分布式数据库来说,数据一致性是最基本的要求。但分区之间的同步会限制用户对系统的访问,而且需要面临网络故障或消息丢失导致的同步时间延长,影响客户体验的问题。
舍弃 C,即放弃一致性。
为了保证高可用,分区之间会使用本地数据提供服务,因此会出现全局数据可能不一致的情况。此类系统一般是为了提高用户体验而牺牲了一定的数据一致性。例如商品抢购、订单等场景,可能用户浏览的库存余量并不是真实的库存,但是避免了用户访问时出现严重的阻塞。