如何理解 CAP

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

(本文是自己初期对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 回帖 • 608 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • frp

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

    20 引用 • 7 回帖 • 1 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • 新人

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

    52 引用 • 228 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 6 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    132 引用 • 188 回帖
  • sts
    2 引用 • 2 回帖 • 196 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    339 引用 • 708 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 8 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 668 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 130 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 406 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 4 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 481 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    124 引用 • 169 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 116 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 2 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 23 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 4 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 1 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 453 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注