CAP
wiki上这样定义CAP:it is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees。
首先CAP是针对分布式数据存储系统来说的,然后该理论指出了系统最多只能保证CAP三项中的两项。
那么CAP是哪三项呢?
Consistency | Availability | Partition tolerance |
---|---|---|
Every read receives the most recent write or an error | Every request receives a (non-error) response – without guarantee that it contains the most recent write | The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes |
一致性,每一个读操作都会读到最新数据;
可用性,每一个请求(读或写)都会收到非错误响应(即操作成功),但不保证读请求读到的是最新数据;
分区容忍性,即便节点间无法正常通信(从而产生分区),整个系统仍然可以照常运行。
正常情况
假设我们用一台服务器A对外提供存储服务,为了避免这台服务器宕机导致服务不可用,我们又在另外一台服务器B上运行了同样的存储服务。每次用户在往服务器A写入数据的时候,A都往服务器B上写一份,然后再返回客户端。一切都运行得很好,用户的每份数据都存了两份,分别在A和B上,用户访问任意一台机器都能读取到最新的数据(一致性)。
异常情况
不幸的事情发生了,A和B之间的网络断开导致A和B无法通信,也就是说网络出现了分区,那么用户在往服务器A写入数据的时候,服务器A无法将该数据写入到服务器B。这时,服务器A就必须要做出一个艰难的选择:
- 选择一致性(C)而牺牲可用性(A):为了保证服务器A和B上的数据是一致的,服务器A决定暂停对外提供数据写入服务,从而保证了服务器A和B上的数据是一致,但是牺牲了可用性。
- 选择可用性(A)而牺牲一致性(C):为了保证服务不中断,服务器A先把数据写入到了本地,然后返回客户端,从而让客户端感觉数据已经写入了。这导致了服务器A和B上的数据就不一致了。
CAP就是要在异常情况下做出抉择。
分布式系统无法放弃网络分区容忍性
网络分区准确地说是指两台机器无法在期望的时间内完成数据交换。这不仅仅是指两台机器之间的网络完全断开了,还可能有其他情况产生网络分区,比如对方机器宕机了,网络延时等情况。分布式系统是基于网络的多节点系统,因此,在分布式系统中,通常是无法放弃Partition Tolerance的,也就只能在CP和AP之间做选择了。如果有个分布式系统号称是CA的,那一定是扯淡。
可用性和一致性的选择
可用性和一致性之间的选择不是非此即彼的,而是根据业务的需求在它们两者之间做妥协。比如,我们可以放弃对强一致性的追求,让其变成最终一致性,也就是说当服务器A不能把数据传给服务器B时,它先将数据缓存在其本地,等到网络恢复以后再将数据传给服务器B。这样,服务还是可用的,只是在一定的时间窗口内两者的数据是不一致的。
对网络分区的处理
对网络分区的处理有以下几个步骤:
- 检测网络是否出现分区
- 当分区出现了,进入分区模式并限制某些操作
- 当网络恢复后,启动分区恢复
参考:http://blog.csdn.net/jewes/article/details/43495639
https://www.zhihu.com/question/54105974?from=profile_question_card