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

  CAP原则是NOSQL数据库的基石。Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)。

分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

一致性与可用性的决择编辑

CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地
  1. 数据库事务一致性需求 
      很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求并不高。允许实现最终一致性。
  2. 数据库的写实时性和读实时性需求
      对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说发一条消息之 后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
  3. 对复杂的SQL查询,特别是多表关联查询的需求 
      任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角 度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。

与NoSQL的关系编辑

传统的关系型数据库在功能支持上通常很宽泛,从简单的键值查询,到复杂的多表联合查询再到事务机制的支持。而与之不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制(事务就是强一致性的体现)[2]   。
  传统的SQL数据库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要么事务中的操作全部执行,要么一个都不执行;C代表一致性,即保证进行事务的过程中整个数据加的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一量完成,那么数据应该是被写到安全的,持久化存储的设备上(比如磁盘)。
  NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串行的执行,保证了每一个Key-Value对不会被破坏。

CAP的是什么关系

It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time.
在分布式系统的设计中,没有一种设计可以同时满足一致性,可用性,分区容错性3个特性

注意:不要将弱一致性,最终一致性放到CAP理论里混为一谈(混淆概念的坑真多)
弱一致性,最终一致性 你可以认为和CAP的C一点关系也没有,因为CAP的C是更新操作完成后,任何节点看到的数据完全一致, 弱一致性。最终一致性本身和CAP的C一致性是违背的,所以你可以看到那些谎称自己系统同时具备CAP 3个特性是多么的可笑,可能国内更多的场景是:一个开放人员一旦走上讲台演讲,就立马转变为了营销人员,连最基本的理念也不要了
这里有一篇标题很大的文章  cap-twelve-years-later-how-the-rules-have-changed ,实际上本文的changed更多的是在思考方式上,而本身CAP理论是没有changed的

为什么会是这样

我们来看一个简单的问题, 一个DB服务   搭建在两个机房(北京,广州),两个DB实例同时提供写入和读取

1. 假设DB的更新操作是同时写北京和广州的DB都成功才返回成功
      在没有出现网络故障的时候,满足CA原则,C 即我的任何一个写入,更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致, A 即我的读写操作都能够成功,但是当出现网络故障时,我不能同时保证CA,即P条件无法满足

2. 假设DB的更新操作是只写本地机房成功就返回,通过binlog/oplog回放方式同步至侧边机房
      这种操作保证了在出现网络故障时,双边机房都是可以提供服务的,且读写操作都能成功,意味着他满足了AP ,但是它不满足C,因为更新操作返回成功后,双边机房的DB看到的数据会存在短暂不一致,且在网络故障时,不一致的时间差会很大(仅能保证最终一致性)

3. 假设DB的更新操作是同时写北京和广州的DB都成功才返回成功且网络故障时提供降级服务
      降级服务,如停止写入,只提供读取功能,这样能保证数据是一致的,且网络故障时能提供服务,满足CP原则,但是他无法满足可用性原则

选择权衡

通过上面的例子,我们得知,我们永远无法同时得到CAP这3个特性,那么我们怎么来权衡选择呢?
选择的关键点取决于业务场景

对于大多数互联网应用来说(如网易门户),因为机器数量庞大,部署节点分散,网络故障是常态,可用性是必须需要保证的,所以只有设置一致性来保证服务的AP,通常常见的高可用服务吹嘘5个9 6个9服务SLA稳定性就本都是放弃C选择AP

对于需要确保强一致性的场景,如银行,通常会权衡CA和CP模型,CA模型网络故障时完全不可用,CP模型具备部分可用性,实际的选择需要通过业务场景来权衡(并不是所有情况CP都好于CA,只能查看信息不能更新信息有时候从产品层面还不如直接拒绝服务)

延伸

BASE(Basically Available, Soft State, Eventual Consistency  基本可用、软状态、最终一致性) 对CAP AP理论的延伸, Redis等众多系统构建与这个理论之上
ACID  传统数据库常用的设计理念, ACID和BASE代表了两种截然相反的设计哲学,分处一致性-可用性分布图谱的两极。

CAP原则(CAP定理)相关推荐

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

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

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

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

  3. CAP 原则与 BASE 理论

    导航 引言 一.CAP 原则 1.1 Consistency 一致性 1.2 Available 可用性 1.3 Partition tolerance 分区容错性 1.4 CAP 的矛盾 1.5 C ...

  4. 什么是分布式事务(CAP原则、BASE理论、2PC|3PC协议、XA|AT等模式)

    1.CAP原则 CAP原则是指:一致性©.可用性(A).分区容错性§,分布式系统一般进行三选二,比如: CA:保证一致性和可用性,在单机情况下实现: CP:保证一致性和分区容错性: AP:保证可用性和 ...

  5. Zookeeper纸上谈兵——Zookeeper与CAP原则

    今天来介绍一下CAP原则,以及Zookeeper对于CAP的取舍. 1. 什么是CAP CAP原则又称CAP定理,是指在一个分布式系统中,Consistency(一致性).Availability(可 ...

  6. Redis-AKF/CAP原则

    Redis-AKF/CAP原则 1. AKF 扩展立方体理论 之前讨论的情况都是单机版单进程下的情况 AKF扩展立方体(Scalability Cube),是<架构即未来>一书中提出的可扩 ...

  7. 转自 kyo_san 为什么不能同时满足CAP原则

    前段时间,学习分布式网络架构时,总是会看到一个CAP原则,设计分布式架构时,这个原则只能满足其中两个条. 但对这个东西没有理解,今天试着理下.  CAP原则是指的是在一个分布式系统中, Consist ...

  8. 数据库ACID和CAP原则

    1 单机场景 单台物理机(服务器.主机)中的关系型数据库遵循ACID原则,对应关系如下表: 序号 原则 描述 1 原子性(Atomicity) 事务所有操作要么全部完成,要么全部不完成,一荣俱荣,一损 ...

  9. 【分布式】CAP原则和BASE理论

    CAP原则概述 C=Consistency=一致性 A=Availability=可用性 P=Partition tolerance=分区容错性 1998年,加州大学的计算机科学家Eric Brewe ...

最新文章

  1. 使用apache服务器配置虚拟目录
  2. html 标签开发,前端开发入门之HTML基础标签一
  3. 【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )
  4. linux——rpm的详细说明
  5. 替代触发器如何加判断 条件_《小逻辑》:如何设定目标,制定计划,做出更好的选择...
  6. python server.py_python manage.py runserver报错
  7. T-SQL SUM Functions
  8. Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
  9. Oracle/mysql查询语句的执行过程
  10. java main是标识符吗_main方法的认识 、通配符、java的注释、java的符(标识符)【Java基础】...
  11. Python递归打印函数
  12. iPhone13系列预计5499起;蔚来回应31岁企业家“自动驾驶”车祸去世;小米取消MIX4防丢失模式无卡联网服务|极客头条...
  13. CentOS 7部署 Ceph分布式存储架构
  14. bzoj 1009: [HNOI2008]GT考试
  15. 需求与商业模式分析-1-商业模式画布
  16. C语言文本输入中文乱码问题
  17. 重力加速度陀螺仪传感器MPU-6050(一)
  18. 使用Certbot申请ssl证书
  19. linux登录界面鼠标键盘失灵,在archlinux安装界面这卡住了,鼠标键盘失灵
  20. 基于ArcGIS与高分影像进行绿地变化分析

热门文章

  1. 模型学习01——评价类模型(1)
  2. 【Maven】什么是Maven?Maven有什么用?
  3. visual basic_Visual Basic的随机数生成的检验
  4. [4]Python数据类型【1】
  5. 71个外贸工具集合!2023年外贸业务员开发客户必备!
  6. Ubuntu 微信QQ企业微信不能输入中文
  7. 推广链接生成html操作流程,推广链接使用指引
  8. 世界五百强背景,为啥到了保险行业就成了「小公司」?
  9. stm32下的HX711称重模块的程序
  10. 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)