对CAP定理的理解

 

CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二。这个解释很让人费解,笔者在看了一些文章后谈谈我对它的理解,还请斧正。缓存

从问题出发

假设咱们用一台服务器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。这样,服务仍是可用的,只是在必定的时间窗口内二者的数据是不一致的。分布式

对网络分区的处理

对网络分区的处理有如下几个步骤:ide

  1. 检测网络是否出现分区
  2. 当分区出现了,进入分区模式并限制某些操做
  3. 当网络恢复后,启动分区恢复

handling partition
从图中可见(图片来自 InfoQ),系统最开始是处于一致的状态S,而后分区出现了,每一个分区的状态分别变成了S1和S2(这是为了保证系统的可用性,每一个分区继续响应客户端的请求)。接着,网络恢复后开始分区合并,将S1和S2状态合并成为新的一致状态S‘。是否是看起来和代码版本管理很相似?ui

小结

其实CAP定理自己很简单,只是被人为地搞复杂了。简单地说,就是分布式系统中,架构师只能在一致性和可用性之间妥协。而复杂的是如何根据业务系统的须要在两者之间取舍,以及如何应对网络出现分区。spa

参考文献

相关文章
相关标签/搜索