面试去,一个哥们叫嚣CAP理论有问题,让我给他证明,很丢人,我真的没证明出来,甚至连清楚的说明都不算。原来看的真的太皮毛了。

zhibing问你有啥技术博客么,我尴尬的摇摇头,所以啊,还是多记录点东西,自己搞明白,讲清楚,才能真的搞明白。

CAP理论也称在Brewer定理,在2000年由Eric Brewer在ACM研讨会上提出,其认为当应用系统变得越来越web化,应当放弃对数据一致性(data consistency)的担忧,因为要想获得这种新的分布式系统的高可用性(high availability),确保数据一致性是我们无法做到的,这样给予任何人3台服务器和一双关注客户体验的眼睛就可以建立一家互联网公司。Brewer的信徒(当天就有的和后来皈依的)包括像Amazon,EBay和Twitter这类公司。

Brewer认为在分布式的环境下设计和部署系统时,有3个核心的系统需求(systemic requirements),以一种特殊的关系存在。(他主要是谈论Web类的应用,但如今非常多的公司业务是多站点/多国家的,因此该理论同样适用于你的数据中心/LAN/WAN的设计)这3个核心的需求是:Consistency,Availability和Partition Tolerance,赋予了该理论另外一个名字 - CAP。

2年后,2002年,麻省理工(MIT)的Seth Gilbert和Nancy Lynch,理论上证明了Brewer猜想是正确的,就此Brewer定理(Theorem)诞生了。

理论

CAP:理论定义:在系统设计当中,针对一个数据的Consistent,Availability以及Partition-Consistency,是不可能同时兼顾的。即,不可能三项均达到最佳程度。

首先需要明确定义一下这三个性能:

Consistent:一致性,一致性类型分很多,这个可以单开一章讲了。在这里只讨论强一致性和最终一致性即可。一致性是针对分布式系统读写操作获得结果的一种描述。

  • 强一致性指对于一个系统的任何读写操作都和单机是一样的。
  • 最终一致性指,对一个系统的写操作之后,并不是立刻对有所的读操作可见,即有可能在一些读操作上读到写之前操作的结果。但经过有限的事件,整个系统最终会实现该写入操作对所有的读操作可见。

Availability:可用性。指一个请求是否在有限的时间内应答。具体来说,在分布式系统中进行一项操作之后需要一个结果等待时间,根据我的理解,Availability与该响应时间成反比。即:相应延时越低,Availability越高。

Partition-Consistency:分区容忍性。这个众说纷纭,我觉得最合理的解释是:能否避免单点故障导致数据丢失。

Gilbert 和Lynch是这样定义partition tolerance的,除了整个网络的故障外,其他的故障(集)都不能导致整个系统无法正确响应。(No set of failures less than total network failure is allowed to cause the system to respond incorrectly),请注意Brewer的注释,单节点partition就等同于服务器crash,因为如果无法连接它,那它就和不存在一样.

样例说明

人家理论说CAP不能同时满足,你得说明为什么啊。下面我们针对一组数据举一个例子。

需求:你需要存出一个INT变量,保证任意时间可读可写。

分析:

1. 首先你不能只把这个变量存在一个机器上,因为这个机器挂了,你的数据就丢了。这就是P特性,你如果不要P特性了,也就是不管单点故障了。就存一个机器上,用个数据库,A和C妥妥的。所以,不要P,AC是可以保证的。

2,既然存在多个机器上,假设2个机器h1和h2吧。那么现在的操作应该有四种,

  • h1读记作1r,
  • h1写->1w
  • h2读->2r
  • h2写->2w

一致性要求四个操作随意做,都对其他可见,因此1w之后2r就需要考虑一下怎么实现了。我们有两种实现策略:

同步或者异步。

  • 同步:意味着1w的过程中,需要同时执行2w且成功后,1w才能返回成功(否则1w对2r不可见)
  • 异步:意味着1w结束后,发出2w的命令即返回结果。
先说异步,异步牺牲了一致性,以保证可用性,因为此时等待时间仅剩下单机h1上的操作,不管你是锁着呢,还是出现故障,都可以通过程序进行处理,因此异步数据降低了C,保证了A。
3. 使用同步策略:(也是那个人把我问住的地方)
显然同步策略能够保证强一致性。因为你在所有节点写入书记之后才返回,所以写入操作对所有节点可见。
但要求一致性的时候,为什么一定是要求可用性下降?
        我当时是这么说的,这是两个机器:10000台机器呢?总有一些机器因为故障,锁住,网络等原因响应缓慢,这样你初始的1w操作至少要等一会吧?

我知道,你肯定要说,为什么备份10000份,我就用3倍副本你怎么着?为什么还要牺牲可用性。

其实我和他都陷入了误区,你三倍副本又如何就这例子中2倍副本也是同样降低了可用性的。为什么?

我们看一下同步策略过程中都发生了什么,1w开始,1w本地完成,1w发送消息给h2,2w完成,发送消息给h1,h1确认1w,2w都完成,则返回1w结束。

对比异步策略:1w开始,1w完成,发送消息给h2,1w结束。

这就是可用性降低了,为什么?你还需要额外等待h2的操作啊,当然,大部分时间下h2都可以正常完成,但总之你依赖了更多的网络,依赖更多的其他机器,那么你的可用性就必然下降。

所以,结论是,不要P,可以有AC并存,一旦要了P,AC无法并存。

至于说其他几种,用的很少,就不证明了。

http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed/

参考文献:

http://blog.sina.com.cn/s/blog_493a8455010161hi.html

CAP理论举例及说明相关推荐

  1. NoSQL 与 CAP 理论

    之前我们讨论了传统的数据库事务的 ACID 特性: 解读事务的ACID! 其实传统数据库和 NoSQL 中对于可用性.一致性的理解不一样. 因为有时候会听到一些新型数据库宣称满足强一致.高可用.且多地 ...

  2. 分布式系统中的FLP不可能原理、CAP理论与BASE理论

    前言 分布式系统是由多个不同的服务节点组成,节点与节点之间通过消息传递进行通信和协调.根据消息传递的不同,分布式系统的运行模型可以分为异步模型系统 和同步模型系统. 1.同步与异步 同步和异步关注的是 ...

  3. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  4. ZooKeeper和CAP理论及一致性原则

    ZooKeeper和CAP理论及一致性原则 一.CAP理论概述 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:Consistency) 可用性(A:Available) 分区容 ...

  5. cap理论与分布式事务的解决方案

    现在很火的微服务架构所设计的系统是分布式系统.分布式系统有一个著名的CAP理论,即一个分布式系统要同时满足一致性(Consistency).可用性(Availablility)和分区容错(Partit ...

  6. 肝了3版才满意:分布式系统之CAP理论,我们对它的理解和误解

    引言 CAP 理论,相信很多人都听过,它是指: 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance) ...

  7. 浅论服务端应用程序开发中的CAP思想(非分布式系统中的CAP理论)

    本文从属于笔者的<服务端应用程序结构风格变迁之路> CAP理论是分布式系统构建中的基础理论之一,其中的C(Consistency),一致性即指所有的节点都能访问同一份最新的数据副本.A(A ...

  8. 分布式理论:CAP理论

    2019独角兽企业重金招聘Python工程师标准>>> 一.CAP理论原理 1.CAP理论介绍 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上 ...

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

    分布式理论(一) CAP理论 一.CAP理论前言 CAP原则又称为CAP理论,主要思想是在任何一个分布式系统中都无法同时满足CAP. C(Consistency):表示一致性,所有的节点同一时间看到的 ...

最新文章

  1. Lisp 家族迎来新成员,函数式语言 Lux 是什么?
  2. 童心未泯的 YOLO 之父,小马哥 Joseph Redmon 笑傲 CV 江湖记
  3. mysql 事件里定义事物_聊一聊 MySQL 中的事务及其实现原理
  4. linux mysql temp 设置_linux上mysql的简单入门
  5. TCP/IP网络编程之基于TCP的服务端/客户端(二)
  6. java_IO流之 NIO
  7. 《团队激励与沟通》第 5 讲——沟通的技巧 重点部分总结
  8. css3仿天气风车旋转
  9. SSAS的MDX的基础函数(三),及聚合函数
  10. Android初学第55天
  11. 在SIP对讲机中RTP/RTCP的实现
  12. 新罗马字体linux,WPS文字办公—将阿拉伯数字替换为新款Times New Roman字体
  13. python 读写西门子PLC 包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  14. Postgresql本地语言环境参数设置(LC_COLLATE,LC_CTYPE)
  15. 波形图控件html,[转载]LabVIEW中的波形图(Waveform Chart)详解
  16. KinectFusion
  17. 《怪物猎人》交互设计如何调动玩家大脑
  18. PCIe(peripheral component interconnect express)
  19. .NET 20个面试要点
  20. 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

热门文章

  1. Pillow图像处理(PIL.Image类的详细使用)
  2. 如何使用物联网低代码平台进行模型管理?
  3. paddlespeech 语音识别 web流服务部署(Streaming Speech Recognition)
  4. OpenGL - Deferred Rendering
  5. 建筑八大员培训湖北劳务员培训施工现场劳务人员多元化管理
  6. 知乎上神回复,看完神清气爽
  7. libuv访问mysql_libuv中的QUEUE
  8. 如何做一个简单的XX(学生/图书馆)管理系统(二)
  9. 如何创建一个Windows软件
  10. .NetCore——Autofac使用