CAP理论概述

1998 年来自柏克莱加州大学的计算机科学家 埃里克.布鲁尔(Eric Brewer) 提出分布式系统的三个基本指标:Consistency(一致性)Availability(可用性) 、Partition tolerance(分区容错),简称:CAP。

在2000年的分布式计算原则研讨大会上(PODC)埃里克.布鲁尔提出的一个猜想:在设计一个分布式系统时,CAP三者无法同时满足。在2002年,麻省理工学院(MIT)的 赛斯·吉尔伯特(Seth Gilbert) 和 南希·林奇(Nancy Lynch) 发表了布鲁尔猜想的证明,使之成为分布式计算系统的标准定理(也是理解分布式系统的起点)。定理讨论了在两个互相矛盾的请求到达彼此连接不通的两个不同的分布式节点的时候的处理方案。

CAP定理定义

CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个 分布式计算系统 来说,不可能同时满足以下三点

  • Consistency(一致性): 所有节点在同一时间具有相同的数据
  • Availability(可用性):保证每个请求不管成功或者失败都有响应(也就是只要收到用户的请求,服务器都要在合理的时间内给出合理的响应)
  • Partition tolerance(分区容错):系统中任意信息的丢失或失败不会影响系统的继续运作(也就是分布式系统遇到任何网络分区故障时,仍然可以对外提供一致性、可用性的服务)

什么是分区?
在分布式系统中,不同的节点通常分布在不同的子网络中,由于一些客观的因素,子网络之间出现了网络不通,但子网络内部的网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。

CAP三进二

大部分分布式系统都分布在不同的子网络,分区又是高概率事件,因此分布式系统,默认是支持分区容错的。由于Partition tolerance(分区容错)的存在,导致Availability(可用性)Consistency(一致性)互相矛盾,因此一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个,即分布式系统在AP和CP之间做选择。

因此,根据 CAP 定理将 NoSQL 数据库分成了满足 CA 、CP 和 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

BASE理论

CAP 理论的经典解释,是忽略网络延迟的,但在实际中延迟和分区紧密相关。CAP 从理论变为落地的场景发生在操作的间歇,系统需要在这段时间内做出关于分区的一个重要决定:

  1. 取消操作,降低了系统的可用性
  2. 继续操作,可能损失系统一致性

2008年eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸。核心思想是通过牺牲一定的一致性(Strong Consistency,CAP的一致性就是强一致性),可以采用适合的方式达到最终一致性(Eventual Consitency),来最大程度的满足大部分分布式系统的业务需求。

  • Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用

服务降级策略?
在双十一期大促期间,为了应对海量的访问,保证下单等核心功能的可用性,各大电商平台通常会采取降级服务策略:关闭评论等非核心功能)

  • Soft State(软状态/柔性事务):允许分布式系统中的数据存在中间状态,即:分布式系统不同节点的副本数据可以存在延迟,并认为该状态不影响分布式系统可用性
  • Eventual Consistency(最终一致性):在分布式系统可接受的时间范围内,所有节点数据都将会达到一致,而可接受的时间范围受网络、业务、数据及复制技术等等因素影响。实际应用中,有可以分为以下几种
    1. 因果一致性:因果一致性是指,如果进程A在更新完某个数据项后通知了进程B,那么进程B之后对该数据项的访问都应该能够获取到进程A更新后的最新值,并且如果进程B要对该数据项进行更新操作的话,务必基于进程A更新后的最新值,即不能发生丢失更新情况。与此同时,与进程A无因果关系的进程C的数据访问则没有这样的限制。
    2. 读写一致性:读己之所写是指,进程A更新一个数据项之后,它自己总是能够访问到更新过的最新值,而不会看到旧值。也就是说,对于单个数据获取者而言,其读取到的数据一定不会比自己上次写入的值旧。因此,读己之所写也可以看作是一种特殊的因果一致性。
    3. 会话一致性:会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现“读己之所写”的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。
    4. 单调读一致性:单调读一致性是指如果一个进程从系统中读取出一个数据项的某个值后,那么系统对于该进程后续的任何数据访问都不应该返回更旧的值。
    5. 单调写一致性:单调写一致性是指,一个系统需要能够保证来自同一个进程的写操作被顺序地执行。

总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性使相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用。

结束语

BASE理论是对CAP定理的延伸,是Redis、MongoDB等众多NoSQL数据库管理系统的理论基础。ACID是传统关系型数据库的设计理念,ACID 和 BASE代表截然不同的两种设计哲学,强一致性-可用性的两端。

延伸阅读:

Redis-CAP定理和BASE理论(二)的更多相关文章

  1. CAP定理和BASE理论

    CAP定理和BASE理论 标签(空格分隔): 操作系统 CAP定理 CAP定理: 一个分布式系统最多只能满足一致性 (Consistency), 可用性(Availability)和分区容错性(Par ...

  2. 分布式系统中的CAP原理和BASE理论

    CAP是一致性(Consistency).可用性(Availability).分区容忍性(Partition tolerance)的缩写.CAP原理指的是这三个要素最多只能同时实现两点,不可能三者兼顾 ...

  3. CAP原理和BASE理论

    CAP原理 概述 CAP理论的主要场景是在分布式环境下,在单机环境下,基本可不考虑CAP问题. CAP理论就是说在分布式存储系统中,最多只能实现上面的两点.而由于当前的网络硬件肯定会出现延迟丢包等问题 ...

  4. CAP定理与BASE理论

    1. CAP定理 C:Consistency,一致性 A:Availability,可用性 P:Partition tolerance,分区容错性 CAP定理,指的是在一个分布式系统中,一致性.可用性 ...

  5. CAP原则、BASE理论

    CAP原则.BASE理论 2017-12-15 目录 1 CAP原则  1.1 CAP原则是什么  1.2 CAP为何三者不可得兼  1.3 一致性与可用性的决择2 BASE理论  2.1 BASE理 ...

  6. 【分布式】1、CAP原则(CAP定理)、BASE理论

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...

  7. CAP原则(CAP定理)、BASE理论

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...

  8. 关于分布式存储系统中-CAP原则(CAP定理)与BASE理论比较

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...

  9. CAP原理和BASE思想和ACID模型

    问题的解读 对于上面三个例子,相信大家一定看出来了,我们的终端用户在使用不同的计算机产品时对于数据一致性的需求是不一样的: 1.有些系统,既要快速地响应用户,同时还要保证系统的数据对于任意客户端都是真 ...

随机推荐

  1. SQL server无法绑定由多个部分绑定的标示符

    原因https://blog.csdn.net/wolfalcon/article/details/54578215给了我启发,原来有犯错在insert和update的使用上了对于已存在的表(表中有字 ...

  2. python yield 和 return 对比分析

    相同点:都是返回函数执行的结果 不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值 例子 ...

  3. js面向对象(对象/类/工厂模式/构造函数/公有和原型)

    https://www.cnblogs.com/sandraryan/ 什么是对象 js中一切都是对象(有行为和特征).js允许自定义对象,也提供了内建对象(string date math等) 对象 ...

  4. js实现开关灯游戏

    需求: 点击三个按钮,页面出现不同数量的“灯” 所有的灯有相同的点击效果.点击一个灯的时候,this和他的上下左右都会变成另一种背景色. 代码在这里~~~ 文章地址 https://www.cnblo ...

  5. 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现

    1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...

  6. HDU 1850 Nim-Sum思想总结、

    算法介绍: Nim游戏是指两个对手在m个堆中轮流随意从某一个堆中拿出n个元素,假定两个对手都是足够聪明,直至最后一次取的人将所有元素取出,此人取得胜利.与之相反的是Misere游戏,相同的游戏规则,但 ...

  7. 【12.78%】【codeforces 677D】Vanya and Treasure

    time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...

  8. css隐藏滚动条、移动端滚动卡顿的解决

    1.如果想保持容器能够滚动,同时不想看到丑陋的滚动条,chrome.firefox和移动端上不考虑兼容性直接 element::-webkit-scrollbar{ display:none } 2. ...

  9. DP刷题记录

    目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...

  10. jmeter安装配置教程及使用

    背景: 因为双11,黑五快到了,所有的互联网电商行业都要做一件事情,那就是压测,常见的压测很多区分,接口压测和全链路压测.线上压测和线下压测,单元压测和功能压测.我们这里介绍一下接口压测和全链路压测. ...