谈谈对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。这样,服务还是可用的,只是在一定的时间窗口内两者的数据是不一致的。

对网络分区的处理

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

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


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

小结

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

参考文献

  • http://codahale.com/you-cant-sacrifice-partition-tolerance/
  • http://ksat.me/a-plain-english-introduction-to-cap-theorem/
  • http://www.quora.com/Can-someone-provide-an-intuitive-proof-explanation-of-CAP-theorem
  • http://robertgreiner.com/2014/08/cap-theorem-revisited/
  • http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed
  • http://blog.foundationdb.com/minimal-explanation-of-the-cap-theorem
  • http://blog.cloudera.com/blog/2010/04/cap-confusion-problems-with-partition-tolerance/

谈谈对CAP定理的理解相关推荐

  1. 谈谈对摩尔定理的理解及其当前是否继续有效

    摩尔定理是由英特尔(Intel)创始人之一戈登·摩尔提出来的.其内容为:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍.换言之,每一美元所能买到的电脑性能,将 ...

  2. 分布式系统不得不说的CAP定理

    21天学会C语言?3天学会弹钢琴? 放弃一切错误方法,从今天开始"刻意练习", 因为这才是最强大的,也是唯一正确的学习方法. --<刻意练习>Anders Ericss ...

  3. 深入理解 CAP 定理

    深入理解 CAP 定理 什么是 CAP 定理 结点.系统.集群 一致性.可用性.分区容错性 一致性.可用性.分区容错性之间的区别 为什么不能同时满足 CAP 总结 什么是 CAP 定理   CAP 定 ...

  4. 从另一个角度理解分布式系统与CAP定理

    从另一个角度理解分布式系统与CAP定理 参考:性能之殇(七)-- 分布式计算.超级计算机与神经网络共同的瓶颈 分布式计算的本质 分布式系统的产生,来源于源于人们日益增长的性能需求与落后的x86架构之间 ...

  5. 分布式学习(二)——CAP定理理解篇

    前言:CAP定理是学习分布式所必备的知识点之一,所以先深入的理解一下这个知识点.初看CAP定理时,有些不以为意,在后续的学习中发现这是个特别值得仔细揣摩的点. 一.CAP定理 我们了解到分布式是将一个 ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?

    04谈谈你对分布式的理解,为什么引入分布式? 引言 刚刚毕业第一份工作,没接触过分布式微服务相关的知识,后来换工作才了解到这些,面试官看了我简历里写了分布式相关,就开始揪住这个问题问,虽然一知半解地说 ...

  7. 分布式 - 谈谈你对分布式的理解,为什么引入分布式?

    不啰嗦,我们直接开始! 划重点: 真正了解分布式系统的概念,日后工作中具有分布式系统设计思想. 能否在设计中对系统稳定性方面考虑周全. 能构建高 QPS 健壮的系统架构. 1.面试官:那谈谈你对分布式 ...

  8. 数据库选型绕不开“CAP定理”是什么

    这两年,不管是传统数据库厂商,还是云计算大厂,都在主推"云数据库",对于云数据库概念,不同人有不同理解,可以说是众说纷纭.那么,到底什么是云数据库?数据库从本地迁移到云上,就是云数 ...

  9. 分布式理论(一) - CAP定理

    前言 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性)这三个基本需求,最 ...

最新文章

  1. Informix IDS 11体系打点(918考试)认证指南,第 5 局部: 数据库管事器操作(4)
  2. squid之反向代理服务器
  3. 解决pandas不计算/不保存运算结果/数值不变的问题
  4. 谋求“同股不同权”,旷视赴港上市渐近
  5. 磁盘阵列(RAID)-很详细的介绍
  6. 在Windows系统上安装PHP工作环境
  7. ImageMagick中文使用手册——复合字体效果
  8. Android-SEAndroid权限问题指南
  9. 两台电脑如何直接用一根网线传数据?
  10. 自动化部署流程_自动化会议提交工作流程:部署到生产
  11. 公众号网站——微信登录
  12. ubuntu查询mac地址
  13. HTML5+CSS大作业——蓝色的异清轩个人博客(6页) 个人博客模板源码异清轩博客
  14. 五 、Kotlin学习之命名参数默认参数
  15. 柴达木盆地第四大气区探实 尖北产量超亿方
  16. python脚本问题:Non-ASCII character '\xe6' in file
  17. 无盘服务器启动不了,无盘工作站不能启动的解决方案
  18. 实验六 自动驾驶建模与仿真
  19. java的actionlistener_Java swing: 实现ActionListener监听器的三种途径
  20. oracle rman ora19602,学习笔记:OracleRMAN备份入门 将RMAN备份数据放到nfs远程文件系统中...

热门文章

  1. 亡命威龙评测:像城管一样开警车
  2. er图转换成关系模型的例题_有关数据库系统的练习题 E-R图的关系画图转换,,急需 谢谢了...
  3. C语言之顺序程序设计学习笔记
  4. 地质勘查土质分类图片_土质的分类表
  5. (2022年)SpringBoot+Vue3前后端分离的在线报名系统
  6. GitOps最强工具-2. Argo CD安装
  7. 一个监听home键锁屏键的工具类
  8. 用计算机弹欢乐斗地主,欢乐斗地主免费版电脑版
  9. 第11章 只读光盘存储器
  10. cnpm安装 指定版本_vue npm install安装某个指定版本的方法