对CAP原理的理解  

  CAP原理按照定义,指的是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分区容错性在一个完整的计算机系统中三种特性不能同时得到完全满足。

  Consistency((强)一致性):指的是在同一时间点,所有的数据状态是否是一致的。对于一致性的理解,个人认为可以从关系型数据库的事务概念出发来进行理解。例如:一次银行账户的转账,双方账户的金额必须同时增加,和减少。不能出现转账账户已经扣钱,而被转账账户未能增加金额的情况。

  Availability((高)可用性):顾名思义,指的是计算机系统特别的好用,总是能满足用户的需求(接受更多请求,响应更快),用形式化的语言描述就是系统拥有非常高的非故障运行时间百分率。这一特性在如今互联网时代,海量用户,大并发请求的场景下对于计算机系统显得尤为重要,毕竟没有用户喜欢一到高峰时期就停止响应的系统。

  Partition tolerance(分区容错性):指的是在整个系统拥有两台或以上数量的计算机单元提供服务,当其中部分分区节点故障时,整个系统依然可以向用户提供可靠的服务。

CAP定理告诉我们CAP这三种特性不能同时完全满足,因此存在以下三种取舍情况: 

  1.选择CA,放弃P

  通常是由一台非常强大的计算机对外提供服务来保证A(高可用性),所有的数据操作都在同一台机器上。在上面提到的银行账户转账例子中,在数据库层面上通过本地事务来轻松满足C((强)一致性)。试想如果此时想要拥有P,即转账双方位于不同分区,那么一旦被转账方出现故障,要么耗费时间等待其重新开始服务(放弃A);或者暂时仅仅处理转账方的业务,等待后续的一致性补偿操作(放弃C)。
  该方案的缺点:由于目前科学技术上的限制,无法横向扩容的系统是无法应付海量请求,大并发的场景的,同时也容易导致单点故障出现,因此这里的A(高可用性)实际上是大打折扣的。

  2.选择CP,放弃A

  意味着系统在提供服务时,一旦出现分区故障,为了确保数据的强一致性,所涉及到的服务全部都会停止响应,因此A(高可用性)也就不复存在啦。暂时还没有想到什么场景下会采取这种方案。
  该方案的缺点:个人认为低可用性本身就是系统的一大缺点。

  3.选择AP,放弃C。这种架构可以说是如今互联网时代最流行的架构。通过分布式和集群进行横向的系统性能拓展,尽可能的舍弃对数据强一致性的需求,同时在遇到不可避免的分布式事务场景时,大牛们也已经提出了各种各样的方案来满足最终的数据一致性((弱)一致性),就不展开说明了。
  该方案的缺点:不适合对数据一致性C((强)一致性)有极高要求的场景,以及不追求A(高可用性)的场景(分区总是会带来额外的麻烦)。
  其实,选择AP而放弃C的设计理念并不仅仅适用于整个系统的整体架构,例如在系统内部,数据库集群(可以理解为一个子系统)主从分离的同步延迟造成从库数据与主库数据出现数据暂时不一致的情况等等。

  除此之外,CAP中的三个元素也并不是完全的互斥,例如选择AP,其实也不是彻底的放弃了C(一致性),而是进行了一定程度的让步,同时C(一致性)也能细分为读一致性,写一致性等。因此不能机粗暴的将CAP理论理解为完全互斥,三选二,而是在这三个维度上面进行不同程度的取舍。个人认为CAP理论其实是告诉人们天下没有免费的午餐,也不存在完美无缺的系统设计,需要反复的斟酌,权衡,才能设计出合理的,符合需求的系统架构。

  以上是我对CAP原理的一些理解,存在不少误区,欢迎交流。

对CAP原理的理解的更多相关文章

  1. NOSQL数据模型和CAP原理

    NOSQL数据模型和CAP原理 http://blog.sina.com.cn/s/blog_7800d9210100t33v.html 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoS ...

  2. [转]CAP原理与最终一致性 强一致性 透析

    在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick).在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子.CAP原理中,有三个要素: 一致性 ...

  3. CAP原理的证明

    CAP概述 C: Consistency 一致性 A: Availability 可用性 P:Partition Tolerance分区容错性 CAP理论的核心是:一个分布式系统不可能同时很好的满足一 ...

  4. 在分布式数据库中CAP原理CAP+BASE

    本篇博文的内容均来源于网络,本人只是整理,仅供学习! 一.关系型数据库 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (At ...

  5. CAP原理中的一致性

    CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾.因此在进行分布式架构设计时,必须做出取舍.而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值.因此设计分布式数据系统,就是在 ...

  6. CAP原理与最终一致性 强一致性 弱一致性

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

  7. redis学习之——在分布式数据库中CAP原理CAP+BASE

    分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...

  8. CAP原理详解

    转载 https://blog.csdn.net/u013332124/article/details/82874178 文章目录 一.CAP原理介绍 对CAP原理的一些常见的理解误区 二.CAP原理 ...

  9. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

随机推荐

  1. 20155326刘美岑 2016-2017-2 《Java程序设计》第5周学习总结

    20155326刘美岑 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 使用 try.catch (1)java中所有的错误都会被打包为对象,如果愿意,可以尝 ...

  2. Greys--JVM异常诊断工具

    https://github.com/oldmanpushcart/greys-anatomy/wiki/greys-pdf 一.简介 我们平时在线上或者开发中会遇到各种性能.功能等问题,在运行过程中 ...

  3. Eclipse配置maven web项目问题总结

    clipse创建Maven结构的web项目的时候选择Artifact Id为maven-artchetype-webapp,点击finish之后,一般会遇到如下问题 1. The superclass ...

  4. python之基础1

    一.python介绍 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字 ...

  5. IDHTTP的基本用法

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. ovs flow 原理及实验

    OpenFlow概述 在支持OpenFlow的交换机中包含了若干个Flow table,Flow table可以用来控制数据包的处理,交换机会执行与flow相匹配的表项中所罗列的动作. OpenFlo ...

  7. 【计算机网络】数据交换技术和多路复用技术的正(nao)确(can)打开方式

    交换的作用   数据交换是计算机网络中两个终端进行数据传输的方式,它又可以分成两种类型:电路交换和分组交换.很显然,问题的核心在于“交换”,那么我们首先要思考的是:交换的作用是什么?   “交换”的作 ...

  8. 关于GROUP BY和聚合函数

    可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...

  9. centos7下 vsftpd初使用

    一. 安装 1. 命令: yum -y install vsftpd 2. 创建一个用户专门用来登录vsftpd #在根目录下创建一个文件夹ftpfile mkdir ftpfile  #创建用户ft ...

  10. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...