在单机的数据库系统之中,我们很容易实现一套满足ACID 特性的 事务处理系统, 事务的一致性不存在问题。 但是在分布式系统之中,由于数据分布在不同的主机结点上,如何对着些数据进行分布式的事务处理就具有非常大的挑战,CAP 理论的出现,让我们对于分布式事务的一致性有了另外一种看法。

什么是CAP 理论?

在计算机科学理论,CAP 理论 (也称Brewer 定理) 又有称为 CAP原则,CAP定理,是由计算机科学家Eric Brewer 在 2000 年 提出的 ,其理论观点是, 在分布式计算机系统中,不可能存在同时提供 以下全部三个保证。

  • Consistency(一致性): 所有节点同一时间看到的是相同的数据。在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  •  Availability(可用性):不管是否成功,确保每一个请求都能接收到响应。在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • Partition tolerance(分区容错性):系统任意分区后,在网络故障时,仍能操作。以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

   CAP原则是NOSQL数据库和分布式系统的基石。

为什么说CAP 只能三选二?

举个栗子:

下图 显示了在一个网络中,N1,N2 是两个节点,他们共享数据块V  其中一个 值V0, 运行在N1 的A 程序可以认为是安全的,无Bug,可预测的和可靠的,运行在N2 的是B 程序,在这个例子中,A 将写入V的新值。而B从V 中读取值。

系统预期执行下面的操作:

  1. 写入一个V 的新值 V1 。
  2. 然后消息(M) 从N1 更新V 的副本到N2.
  3. 从B 处读取返回的V1

如果网络是分区的,当N1到N2 的消息不能传递的时候,就会出现虽然N2 能访问到V 的值(可用性),但是实际上与N1 的V 值已经不一致了。  如下图:

CAP 常见模型:

既然 CAP 理论已经证明一致性,可用性和分区容错性三者不可能通知达成。 那么在实际应用中,我们可在其他某一方面来放松条件,从而达到妥协,下面是一些常用的模型。

  1. 牺牲分区 (CA  模型)

牺牲分区容错性意味着把所有机器搬到一台机器内部,或者放到一个“要死一起上死”的机架上面(机架也可能出现部分失效),这明显就违背了我们希望的可伸缩性。

常见例子:

  • 单站点数据库
  • 集群数据库
  • LDAP
  • xFS 文件系统

实现方式:

两阶段提交, 缓存验证协议。

2. 牺牲可用性(CP 模型)

牺牲可用性意味着一旦系统出现分区这样的错误, 系统就直接停止服务。

常见例子:

  • 分布式数据库
  • 分布式锁定
  • 绝大部分协议

实现方式:

悲观锁, 少数分区不可用。

3 . 牺牲一致性(AP 模型)

常见例子:

  • Coda
  • Web缓存
  • DNS

实现方式:

到期/租赁, 解决冲突, 乐观。

CAP 的意义:

在系统架构时,应该是根据具体的业务场景来权衡CAP, 比如 对于大多数互联网应用来说(如门户网站),因为 机器数量庞大,部署结点分散,网络故障是常态的,所以可用性是必须的所以只有舍弃一致性来保证服务的AP 而对于银行等需要确保一致性的场景,通常会权衡CA, 和CP 模型。

CAP 的最新发展:

Eric Brewer 在2012 年发表文章指出了CAP里面三选二的做法存在一定的误差性,主要体现在:

  • 由于分区很少发生,那么在系统中不存在分区的情况下,没有什么理由牺牲C或A 。
  • C与A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉特定的数据或用户而有所不同。
  • 这三种性质都可以在一定程度上衡量,并不是非黑即白的有或无。可用性显然是在0% 到100% 之间连续变化的,一致性分很多级别,连分区也可以细分不同的含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。

理解CAP 理论最简单的方式 是想象两个节点分处于分区两侧,允许至少一个节点更新状态会导致数据不一致,即丧失了C 性质,如果为了保证数据的一致性,将分区一侧的节点设置为不可用, 那就丧失了A 性质,除非两个节点可以相互通讯,才能既保证A 又保证C ,但这又会丧失P 性质,一般来说 跨区域的系统,设计师无法舍弃P 性质,那么就只能在数据一致性和可用性上做一个艰难选择, 不确切的说,NoSQL 运动的主题其实是创造各种可用性优先,数据一致性其次的方案,而传统数据库坚守ACID 特性,做的是相反的事情。

BASE :

BASE 来自于互联网的电子商务领域的实践,它是基于CAP 理论逐步演化而来的,核心思想是即便不能达到强一致性,但可以根据应用特点采用适当的方式来达到最终一致性的效果。BASE 是对CAP 中C和A 的延伸。 其含义如下 :

  1. Basically Available  基本可用
  2. Soft state 软状态/柔性事务,即状态可以有一段时间的不同步。
  3. Eventual consistency  最终一致性。

分布式系统CAP理论的更多相关文章

  1. 分布式系统CAP理论与CA选择

    总结: CAP指的是数据一致性.服务可用性.分区容错性:(这里的一致性指的是强一致性,又叫原子性或线性一致性:可用性指的是所有读写操作都要能终止,没有时延上的要求) 分布式系统中P是必选项:在P必选的 ...

  2. 分布式系统CAP理论以及注册中心选择

    CAP定理:指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可同时获得. 一致性(C-数据 ...

  3. 分布式零基础之--分布式CAP理论

    研究到分布式系统CAP理论,记录下来下回详细分析它: CAP是指三个单词的简称 C: 一致性(Consistence) 所有节点访问的都是同一份最新的数据副本. A: 可用性(Availability ...

  4. 转载:分布式系统的CAP理论

    原文转载Hollis原创文章:http://www.hollischuang.com/archives/666 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提 ...

  5. 分布式系统之CAP理论杂记[转]

    分布式系统之CAP理论杂记 http://www.cnblogs.com/highriver/archive/2011/09/15/2176833.html 分布式系统的CAP理论: 理论首先把分布式 ...

  6. 分布式系统之CAP理论

    任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的 ...

  7. 分布式系统之CAP理论杂记

    分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.● 可用性(A):在集群中一部分节点故障后,集群整体是否 ...

  8. 分布式系统的CAP理论

    一.CAP理论概述 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项. 二.CAP ...

  9. 重温分布式系统的CAP理论

    1. CAP理论的历史 2000年7月,Eric Brewer教授提出CAP猜想:2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP:之后,CAP理论正式成为分布式计算领域的 ...

随机推荐

  1. SuperMap iObject入门开发系列之三管线系统标注

    本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 管线系统会涉及到一些坐标标注,属性标注,提供给用户查询获取其需要的信息,这期的文章介绍的是基于超图iObject开发的 ...

  2. 必看!如何让你的LBS服务性能提升十倍!

    本文由云+社区发表 作者:腾讯云数据库团队 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.MongoDB对LB ...

  3. keil4编译Error: User Command terminated, Exit-Code = 1解决

    编译出错结果如下图: 通过分析可看出,错误原因是:调用fromelf.exe指令的路径不对.Keil中设置的是 E:\Keil\ARM\BIN40\fromelf.exe(安装Keil位置不同,此处显 ...

  4. 我的IDEA配置

    记录一下我的IDEA配置 图片看不清可以在新的标签页打开,因为被我压缩过了 目录: 1.插件 2.配置 一.插件 1.装逼类 (1)Power Mode II 写代码有飘落的像素效果,增加趣味性,因为 ...

  5. Spark学习之路 (一)Spark初识

    目录 一.官网介绍 1.什么是Spark 二.Spark的四大特性 1.高效性 2.易用性 3.通用性 4.兼容性 三.Spark的组成 四.应用场景 正文 回到顶部 一.官网介绍 1.什么是Spar ...

  6. 原生的 django 分页

    原始的 django 分页 # 基本 写法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, ...

  7. spring集成shiro登陆流程(下)

    首先声明入门看的张开涛大神的<跟我学shiro> 示例:https://github.com/zhangkaitao/shiro-example 博客:http://jinnianshil ...

  8. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  9. AI - TensorFlow - 张量(Tensor)

    张量(Tensor) 在Tensorflow中,变量统一称作张量(Tensor). 张量(Tensor)是任意维度的数组. 0阶张量:纯量或标量 (scalar), 也就是一个数值,例如,\'Howd ...

  10. 架构师入门:Spring Cloud系列,Hystrix与Eureka的整合

    和Ribbon等组件一样,在项目中,Hystrix一般不会单独出现,而是会和Eureka等组件配套出现.在Hystrix和Eureka整合后的框架里,一般会用到Hystrix的断路器以及合并请求等特性 ...