1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance(分区容错)
Eric Brewer 说,这三个指标不可能同时做到,这个结论就叫做CAP理论
分区容错
大多数分布式系统分布在多个子网络中。每个子网络就叫做一个区。分区容错的意思是,区间通信可能会失败。比如一台服务器放在中国,另一台服务器放在美国,这就是两个区,他们之间可能无法通信。
一般来说,分区容错无法避免,一次可以认定CAP中的P一定要保障。
一致性
意思是写操作之后的读操作,比如返回该值
可用性
意思是只要收到用户的请求,服务器就必须给出响应。
用户可以选择向G1或G2发起读操作。不管哪台服务器,只要收到请求,就必须告诉用户,到底是v0还是v1,否则就不满足可用性。
一致性和可用性的矛盾
一致性和可用性为什么不能同时成立?答案很简单,因为可能通信失败(即出现分区容错)
如果保证G2的一致性,那么G1必须在写操作时,锁定G2的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2不能读写,没有可用性。
如果保障G2的可用性,那么势必不能锁定G2,所以一致性不成立。
综上所述,G2无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保障所有节点的可用性;如果追求所有节点的可用性,那么就没法做到一致性。
CP和AP
等待分区节点的响应可能会导致延时错误。如果你的业务需求需要原子读写,CP 是一个不错的选择。
如果业务需求允许最终一致性,或当有外部故障时要求系统继续运行,AP 是一个不错的选择。