转载自:CAP原理这样理解最简单
还有一篇讲的也挺好:CAP理论/AP架构/CP架构

前言

众所周知,CAP理论是架构师在设计分布式系统过程中,处理数据一致性问题时必须考虑的基石级理论(圣经级的,^V^)。大意是说,在分布式网络分区环境中,数据的一致性、可用性和分区容忍性三者之间,至多只能保证两者,无法三者同时保证。对于CAP理论,个人刚接触时感觉很容易理解,不就是讲的一个在分布式环境下鱼和熊掌不能兼得的问题吗?诚然,如果从直观上泛泛而谈,的确不难,即在多节点的网络环境中,当要求数据强一致性时,一定会牺牲掉可用性,反之亦然。

然而,在最近的一次公司内部技术分享会上,一个同事问我,能不能顺便通俗易懂地给大家讲一下关于CAP理论如何理解?我随即问了在场的其他几个同事,大家也认为可以给大家仔细讲一下,原因是大家对CAP理论的理解基本也处于是懂非懂的状况。最先提问的同事的问题点在于,大家普遍认为关系型数据库多采用CA,而NoSql多采用AP,然而为什么大多数关系型数据库又支持Master-Slave式的分区复制功能呢?难道关系型数据库是CAP理论的一个例外?

理解第一步:分布式是前提

为了彻底讲清楚这个问题,首先需要明白的是,CAP理论的主要场景是在分布式环境下,在单机环境下,基本可不考虑CAP问题。如果不明白什么是分布式场景,请看下面这张图(此图借用自如何正确理解CAP理论一文)。图中除最上面那台标记为“客户端”电脑以外的部分(包括横着的那根粗线,以及A\B\C三个节点)共同组成了一个分布式系统。

理解第二步:C、A、P准确定义

其次,需要搞清楚Eric Brewer大神对CAP三者的准确定义。这里借用一下维基百科CAP理论一文中关于C、A、P三者的定义。(其实也试图想参考国人的某百科,但发现貌似仍然讲得不清不楚)。

Consistency Availability Partition tolerance
Every read receives the most recent write or an error Every request receives a (non-error) response – without guarantee that it contains the most recent write The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes

三者的定义及个人理解如下:

  • Consistency:一致性,原文翻译过来是说,对于任何从客户端发达到分布式系统的数据读取请求,要么读到最新的数据要么失败。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。

  • Availability:可用性,原文翻译过来是说,对于任何求从客户端发达到分布式系统的数据读取请求,都一定会收到数据,不会收到错误,但不保证客户端收到的数据一定是最新的数据。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给您返回数据,不会给你返回错误,但不保证数据最新,强调的是不出错。

  • Partition tolerance:分区容忍性,这个词有点怪,如果直接看中文的确有点不太好理解。那么看原文翻译怎么说的,分布式系统应该一直持续运行,即使在不同节点间同步数据的时候,出现了大量的数据丢失或者数据同步延迟。
    (PS:^V^,您瞧瞧,包容度多高,简直是打不死的小强,现在应该能够理解为什么用tolerance容忍度这个词了吧。)
    换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。

理解第三步:串起来,So easy

搞明白三个字母的准确含义之后,结合到上面那张图,应该比较容易理解了。

对于一个分布式系统而言,P是前提,必须保证,因为只要有网络交互就一定会有延迟和数据丢失,这种状况我们必须接受,必须保证系统不能挂掉。试想一下,如果稍微出现点数据丢包,我们的整个系统就挂掉的话,我们为什么还要做分布式呢?所以,按照CAP理论三者中最多只能同时保证两者的论断,对于任何分布式系统,设计时架构师能够选择的只有C或者A,要么保证数据一致性(保证数据绝对正确),要么保证可用性(保证系统不出错)。

PS:其实维基百科的原文里面也有这么一段,说的也是上面的意思,我就不翻译了:
CAP is frequently misunderstood as if one has to choose to abandon one of the three guarantees at all times. In fact, the choice is really between consistency and availability only when a network partition or failure happens; at all other times, no trade-off has to be made.

结语

最后回答一下本文开头俺的同事关于关系数据库的问题,个人理解,其实关系型数据库同时保证CA时,指的并非是分布式环境下,简单地说就是单机环境下。如果在Master-Slave类复制式分布式环境下,默认保证的是CP,用过Mysql Master-Slave或者Mssql的复制-订阅模式的同仁应该知道,一旦主从机数据复制时出错,出现数据不一致的情况,必须人工干预或者重新同步。

CAP原理这样理解最简单相关推荐

  1. 为什么CAP不能同时满足的简单理解

    为什么CAP不能同时满足的简单理解 cap定理:前提是分布式系统中,cap三个只能满足两个,不能同时满足三个特性. Consistency (一致性):所有节点在同一时间的数据都是完全一致的. Ava ...

  2. 理解vue ssr原理,自己搭建简单的ssr框架

    理解vue ssr原理,自己搭建简单的ssr框架 前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟对于WEB应用来说,搜索引擎是一个很大的流量入口.Vue SSR现在已经比较成熟了,但是如 ...

  3. 理解 call、apply、bind 原理,手写简单的 call、apply、bind 方法

    理解 call.apply.bind 原理,手写简单的 call.apply.bind 方法 call 原理及实现 MDN定义:call()方法使用给定的 this 值和单独提供的参数调用函数. 用自 ...

  4. redis学习之——CAP原理CAP+BASE

    Remote Dictionary Server 分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建 ...

  5. 分布式系统以及CAP原理

    分布式系统以及CAP原理 文章首发于微信公众号:大数据每日哔哔.文章:分布式系统以及 CAP 原理 ● 本文主要分为以下几个部分:<br />什么是分布式系统<br />对 C ...

  6. 分布式系统架构以及 CAP 原理

    精选30+云产品,助力企业轻松上云!>>> 点击蓝色"大数据每日哔哔"关注我 加个"星标",第一时间获取大数据架构,实战经验 ● 本文主要分为 ...

  7. redis学习-分布式数据库CAP原理

    传统的ACID分别是什么 A (Atomicity) 原子性 C (Consistency) 一致性 I (Isolation) 独立性 D (Durability) 持久性 关系型数据库遵循ACID ...

  8. 分布式系统中CAP原理

    分布式系统CAP原理 分布式系统发开虽然有点很多但是并不是完美的,CAP原理就是其中的体现之一. CAP原理:指的是在一个分布式系统中,Consistency(一致性).Availability(可用 ...

  9. 分布式系统的CAP原理及其应用

    什么是分布式系统的CAP原理 在分布式系统中,一致性(C)指每一次读都得到最近的写数据,或者一个异常:可用性(A)指每一个请求都得到一个非异常的响应,而不保证取得最近的写数据:分区容错性(P)是指结点 ...

最新文章

  1. php熊掌号怎么设置json-ld,dedecms织梦系统怎么对接百度熊掌号并添加JSON_LD数据
  2. Servlet的学习笔记
  3. java 查询功能实现的八种方式
  4. 【算法分析与设计】查找第K大/小元素问题
  5. linux中的medium_如何在freeCodeCamp Medium出版物中发布
  6. php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)
  7. 51单片机dds信号发生器 扫频 c语言,基于AT89C51单片机和DDS器件实现频率特征测试仪的设计...
  8. java NIO入门小记
  9. 浏览器对象模型bom的作用是什么?
  10. Linux下Socket通信中非阻塞connect、select、recv 和 recvfrom、send和sendto大致讲解,附带非租塞connect代码、MSG_NOSIGNAL
  11. 华为手机android7价格,华为7怎么样?报价多少?
  12. 矢量、栅格、瓦片地图傻傻分不清
  13. sourceinsight 查看源码的利器
  14. uint64 和字符串相互转换
  15. Unity debugger detected e0030 sentinel ldk protection system
  16. 51nod3054 听指挥打胜仗
  17. Ethercat 从站开发总结四:从站硬件分析
  18. 传奇自动吃元宝经验卷等脚本
  19. 电脑显卡html接口无信号,笔记本电脑HDMI连接电视机显示无信号的解决方法
  20. 深蓝学院,激光slam第二讲作业,踩坑总结

热门文章

  1. MsgPack的浅浅理解
  2. 【人脸表情识别】如何做好表情识别任务的图片预处理工作
  3. 树枝学术 | 论文搜索与论文下载全攻略
  4. Spring boot+mybatis 编写接口(例:注册账号)
  5. 基于畸变图像本身的径向畸变矫正(无需镜头标定)
  6. Isolated User Mode (IUM) Processes(MSDN翻译)
  7. MySQL-基础-DDL语句(一)-数据库的操作
  8. Excel 表格如何添加计算并发数公式
  9. 学习Python的三种境界
  10. SpringBoot-核心技术篇