如何理解 CAP

本贴最后更新于 2936 天前,其中的信息可能已经斗转星移

(本文是自己初期对CAP的肤浅认识,实际上CAP理论说不可能发生的情况只有 “在分区发生的情况下,无法实现完美的一致性与可用性”,大家可以看我博文里转的一片文章, CAP理论12年回顾,以下内容有兴趣也可以喵喵,并无大致错误。)

 

 

CAP大家都知道,分别指代 Consistency,Availability,Partition tolerance。CAP therom就是说 Consistency,Availability,Partition tolerance最多同时只能满足两项,不可能三项都同时满足。
虽然定理的描述很简单,但是其过于简单了,让人觉得模棱两可,下面我按照自己对CAP的理解举例讲解一下把~

首先给个定义把:

Consistency:

一致性。一致性有不同的层次,有不同的维度。但在本文中最强的一致性,简称 强一致性 指代:只要一个partition写入了某个更新,那么其他的partition就马上能读取得到。

Availability:

可用性。可用性也有不同的层次,不同的维度。本文中,最强的可用性指代,在应用功能相同的集群的所有机器里,每台机器都提供相同的功能,且只要有一台能用,那么就能往外提供完整的服务。

Partition tolerance:

分区容忍性。就是说即使 集群内的机器 无法互相通讯,也能对外提供服务。这个条件是由上述Consistency以及Availability的实现方案中衍生出来的,直接看结论 会比较难理解为啥会出现这项...

 

下面我尝试用简单的文字来描述 为何 强一致性,强可用性 及 分区容忍性 不能同时实现把:

1、假设我们有两台机器,两台机器都可读可写(完整的可用性),我们要如何实现强一致性?

我们很容易想到,应用程序写入到一台机器的时候,写入本地,通过网络发送变更到远程的机器,提交远程,提交本地。那么我们的两台机器的集群就符合了 强一致性。

2、好了,一致性实现了,但如果一台机器A挂了,另外一台机器B也无法运转了,因为B无法将 数据同步写入到A,只能等到A恢复后才能继续工作。若抛下A不管,那么A在启动了之后,数据跟B就不一致了,没有保证强一致性,那要怎么解决呢?聪明的你肯定已经有了想法了~

 当B机器探测到A已经“确认A已经挂了”的时候,就把A没有同步的内容记到一个地方,等A重启的时候,读取B主机的更新,然后写入本机,写入完成后,再跟B一起执行强一致性的协同操作。这时候,你就有了 强一致性 以及 强可用性了,嗯,感觉棒棒的

3、但回头看一下上述解决方案中的加粗字段——“确认A已经挂了”,在实际的网络环境中,我们能确认A已经挂了么?显然,是不行的,有可能只是A与B之间的网络中断了!当A,B之间的网络中断后,如果A,B都认定这种情况就是对方死掉了,然后各自记录自己的更新,等待对方来获取的时候就会发生冲突,产生不一致的情况(脑裂)!实际上机器A,B是无法判断远在对方的TA是网络断了呢,还是TA挂了...因此结论就是...在脑裂的情况下 放弃可用性,等待两台机器互联通讯开始,才提供服务,或者 在脑裂的情况下 放弃一致性 保证可用性。

 

所以我认为CAP最多只能实现两个而不能三者兼得 可以这么理解:

1、在不考虑脑裂的情况下,我们可以实现 强可用及强一致

2、在考虑脑裂的情况下,如果我们要求 强可用 那么就必须放弃 强一致

3、在考虑脑裂的情况下,如果我们要求 强一致 那么就必须放弃 强可用

 

在实际的运用中,我们脑裂基本上是不允许发生的,如果发生了,那就是一场真正的灾难了。(在写这篇文章之后阅读了一篇新的文章,知识面得到了扩张,实际上分区的场景也是允许存在的,还有很多的系统实现,见http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed)那么就只能在 可用性 及 一致性 中作文章了...好在,可用性与一致性并非一个二选一的问题——要了可用性就不能要一致性,要了一致性就不能要可用性。

在考虑脑裂的情况下,一致性与可用性的关系可以用一个形容词来比喻 此消彼长。如果你要完全的可用性,那么一致性就变成了0,如果你要完全的一致性,那么可用性就变成了0。

所以,我们考虑设计分布式系统的时候,大多数情况下就是考虑 一致性 及 可用性 平衡。

好在,前人就给我们留下了关于这个平衡的思考,如BASE理念及PAXOS算法都可以看到CAP的影子,在之后的博文里,我会继续介绍PAXOS算法以及BASE理念

 

  • 一致性
    10 引用 • 5 回帖
  • CAP

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

    11 引用 • 5 回帖 • 582 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 233 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 732 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 4 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 708 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 896 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 15 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 632 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 405 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    171 引用 • 813 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 524 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    484 引用 • 906 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 605 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 31 回帖 • 8 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    541 引用 • 3529 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 60 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 2 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 262 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    16 引用 • 7 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 11 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 191 关注