cap理论具体含义_分布式系统:CAP 理论的前世今生

CAP 理论是分布式系统设计中的一个重要理论,虽然它为系统设计提供了非常有用的依据,但是也带来了很多误解。本文将从 CAP 诞生的背景说起,然后对理论进行解释,最后对 CAP 在当前背景下的一些新理解进行分析,澄清一些对 CAP 的误解。

CAP 理论诞生的背景

CAP 理论的是在“数据一致性 VS 可用性”的争论中产生。CAP 的作者 Brewer 在 90 年代的时候就开始研究基于集群的跨区域系统(实质上是早期的云计算),对于这类系统而言,系统可用性是首要目标,因此他们采用了缓存或者事后更新的方式来优化系统的可用性。尽管这些方法提升了系统的可用性,但是牺牲了系统数据一致性。

Brewer 在 90 年代提出了 BASE 理论(基本可用、软状态、最终一致性),这在当时还不怎么被接受。因为大家还是比较看重 ACID 的优点,不愿意放弃强一致性。因此,Brewer 提出了 CAP 理论,目的就是为了开阔分布式系统的设计空间,通过“三选二”的公式,解放思想,不要只抓着一致性不放。

理解了 CAP 诞生的背景,我们才能更加深入的理解 CAP 理论,以及它带来的启示。“三选二”的观点虽然帮助大家开拓了设计思路,但是也带来了很多误解。下面我们会逐一分析,首先来看一下 CAP 理论的解释。

CAP 理论的经典解释

CAP 定理是分布式系统设计中最基础,也是最为关键的理论。它指出,分布式数据存储不可能同时满足以下三个条件。

  • 一致性(Consistency):每次读取要么获得最近写入的数据,要么获得一个错误。
  • 可用性(Availability):每次请求都能获得一个(非错误)响应,但不保证返回的是最新写入的数据。
  • 分区容忍(Partition tolerance):尽管任意数量的消息被节点间的网络丢失(或延迟),系统仍继续运行。

CAP 定理表明,在存在网络分区的情况下,一致性和可用性必须二选一。当网络发生分区(不同节点之间的网络发生故障或者延迟较大)时,要么失去一致性(允许不同分区的数据写入),要么失去可用性(识别到网络分区时停止服务)。而在没有发生网络故障时,即分布式系统正常运行时,一致性和可用性是可以同时被满足的。这里需要注意的是,CAP 定理中的一致性与 ACID 数据库事务中的一致性截然不同。ACID 的 C 指的是事务不能破坏任何数据库规则,如键的唯一性。与之相比,CAP 的 C 仅指单一副本这个意义上的一致性,因此只是 ACID 一致性约束的一个严格的子集。

CAP 理论看起来难理解,其实只要抓住一个核心点就能推导出来,不用死记硬背。在出现网络分区的时候,

  • 如果系统不允许写入,那么意味着降低了系统的可用性,但不同分区的数据能够保持一致,即选择了一致性。
  • 如果系统允许写入,那么意味着不同分区之间的数据产生不一致,系统可用性得到保障,即选择可用性。

CAP 的新理解

CAP 经常被误解,很大程度上是因为在讨论 CAP 的时候可用性和一致性的作用范围往往都是含糊不清的。如果不先定义好可用性、一致性、分区容忍在具体场景下的概念,CAP 实际上反而会束缚系统设计的思路。首先,由于分区很少发生,那么在系统不存在分区的情况下没什么理由牺牲 C 或 A。其次,C 与 A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。最后,这三种性质都可以在程度上都可以进行度量,并不是非黑即白的有或无。可用性显然是在 0% 到 100% 之间连续变化的,一致性分很多级别,连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。

什么是分区容忍

在现实世界中,正常情况下分布式系统各个节点之间的通信是可靠的,不会出现消息丢失或者延迟很高的情况,但是网络是不可靠的,总会偶尔出现消息丢失或者消息延迟很高的情况,这个时候不同区域的节点之间在一段时间内就会出现无法通信的情况,也就是发生了分区。

分区容忍就是指分布式系统在出现网络分区的时候,仍然能继续运行,对外提供服务。注意,这里所说的仍然能够对外提供服务跟可用性的要求不一样,可用性要求的是对于任意请求都能得到响应,意味着即使出现网络分区所有节点都能够提供服务。而分区容忍的重点在于出现网络分区之后,系统仍然是可用的(包括部分可用)。

举个例子:使用 Paxos 进行数据复制的系统就是典型的 CP 系统,即使出现网络分区,主分区也能够提供服务,所以它是分区容忍的。再举个反例:使用 2PC 进行数据复制的系统没有分区容忍的特性,当出现网络分区时,整个系统都会阻塞。

可用性的范围

可用性其实很直观:每次请求都能获得一个(非错误)响应,但不保证返回的是最新写入的数据。换一个说法就是对于分布式系统中的每个节点,都能够对外部请求做出响应,但不要求一致性。

经常让我们疑惑的问题是衡量系统可用性的标准是什么?其实关键点在于可用性的范围,脱离了具体场景下的可用性范围是没有意义的。讨论可用性是要有具体场景来划分边界的,简单的认为某个算法是满足可用性要求其实并不严谨,因为在工程实现中会有很多的技巧去弥补修正。

举个例子:谷歌文档就是非常典型的 AP 系统,它在网络断了的情况下也能够使用。诀窍在于它在发现网络断了之后会进入离线模式,允许用户继续进行编辑,然后在网络恢复之后再对修改的内容进行合并处理。可以发现对于谷歌文档来说,用户的浏览器也是它系统的一个节点,当出现网络分区时,它仍然能够为用户提供服务,但是代价是放弃了一致性,因为用户做的修改只有本地知道,服务端是不清楚的。所以在这个例子里面,可用性的范围是包括了用户浏览器在内的,不是我们常规理解的分布式系统的节点一定就是服务端的机器。

值得注意的是在现实世界中,我们一般不会去追求完美的可用性,所以一般的说法是高可用,即尽可能保证更多的节点服务可用。这也是为什么 Paxos 这类的一致性算法越来越流行的原因之一。

一致性的范围

讨论一致性的时候必须要明确一致性的范围,即在一定的边界内状态是一致的,超出边界之外的一致性是无从谈起的。比如 Paxos 在发生网络分区的时候,在一个主分区内可以保证完备的一致性和可用性,而在分区外服务是不可用的。值得注意的是,当系统在分区的时候选择了一致性,也就是 CP,并不意味着完全失去了可用性,这取决于一致性算法的实现。比如标准的两阶段提交发生分区的时候是完全不可用的,而 Paxos 则保证了主分区的一致性和可用性。

经过上面的讨论可以发现,可用性的范围要求比一致性的范围要求要更严格,CAP 理论中的可用性要求的是整个系统的可用性,即使出现部分节点不可用也算是违反了可用性约束。而一致性的要求则没有那么高,发生网络分区的时候只要保证主分区数据一致性,也认为系统是符合一致性约束的。为什么这么说呢?因为当出现网络分区的时候,客户端只要通过访问主分区就能得到最新的值(访问超过半数以上节点,如果值都相同说明访问的数据是最新的),此时系统是满足 CAP 理论中一致性的要求的。

管理分区

网络分区是分布式系统中必然发生的事情,经典的 CAP 理论是忽略网络延迟的,但是在现实世界中,网络延迟跟分区密切相关。也就是说当系统在有限的时间内无法通信达成一致(网络延迟很高),就意味着发生了分区。此时就需要在一致性和可用性之间做出选择:选择继续重试就意味着选择一致性,放弃可用性;放弃数据一致性让操作完成就意味着选择了可用性。值得注意的是在分区的时候放弃数据一致性并不是意味着完全不管,一般工程实现会采用重试的方式达到最终一致性。

通过上面的分析可以发现,平衡分区期间可用性和一致性的影响是分布式系统设计中的关键问题。因此,管理分区不仅是需要主动发现分区,还需要针对分区期间产生的影响准备恢复过程。也就是说我们可以从另一个角度来应用 CAP 理论:系统进入分区模式的时候,如何在一致性和可用性之间做出选择。

管理分区有三个步骤:

670c35e26c72e673d34b84374cee13d9.png
  • 检测到分区开始
  • 明确进入分区模式,限制某些操作
  • 当通信恢复后启动分区恢复过程

当系统进入分区模式之后,有两种选择:

  • 选择一致性:例如 Paxos 算法,只有大多数的主分区能够进行操作,其他分区不可用,当网络恢复之后少数节点跟多数节点同步数据。
  • 选择可用性:例如谷歌文档,出现分区时进入离线模式,等网络恢复了客户端跟服务端数据进行合并恢复。

总结

理论抽象于现实,服务于现实,但绝不等于现实。对 CAP 理论“三选二”的误解就源于我们经常把理论等同于现实。CAP 的诞生主要是为了拓宽设计思路,不要局限在强一致性的约束中。简单的把“三选二”进行套用反而限制了设计思路。在现实世界中,不同业务场景对可用性和一致性的要求不一样,并且一致性和可用性的范围和区间是动态变化的,并不是非此即彼。因此,准确理解 CAP 理论,从管理分区的角度出发,结合具体的业务场景,才能做出更好的系统设计。

参考资料

CAP twelve years later: How the "rules" have changed​ieeexplore.ieee.orgCluster-Based Scalable Network Services​citeseerx.ist.psu.eduHarvest, Yield and Scalable Tolerant Systems​citeseerx.ist.psu.edu

公众号:码上渔者

08039a247bdda8b0e76b83d200b3462c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件下载案例

一、需求分析 其中,浏览器可以直接解析图片,不能解析视频,所以视频的超链接是下载; 加载文件,则需要知道文件的真是路径(ServletContext); 前端: 二、代码实现 其中,Serv…

[转]TortoiseSVN客户端重新设置用户名和密码

在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了。 不过,如果后来在服务器端修改了用户名…

python实现截图范围框跟随_教你用Python实现截图和文字识别,就是这么简单

Author: By Runsenkeyboard是一个监控键盘输入的库安装:pip install keyboradimport keyboardimport timefrom PIL import ImageGrabdef screen(): print(开始截图) # 使用微信的截图热键 keyboard.wait(hotkeyalta) # 保存 keyboard.wait(hotkeyent…

进制转化

将N转化成R进制 View Code 1 /*进制转换2 将一个数n装化成R进制(2<R<16)3 4 Sample Input5 7 26 23 127 -4 38 9 Sample output 10 111 11 1B 12 -11 13 */ 14 #include<stdio.h> 15 int main() 16 { 17 int n,r,i,k,t; 18 char f[1000],g[18]{"0123…

JDBC基础和使用

内存泄漏意思就是内存越来越少了&#xff0c;因为垃圾太多&#xff1b; 线程泄露就是线程池中线程越来越少&#xff0c;执行过程中异常&#xff0c;没有返回给线程池&#xff0c;线程池中线程越来越少&#xff1b; 一、概念 二、快速入门 三、JDBC各个类详解 1、driverManager …

车间生产能耗管控方案_SAREN三仁净化工程:锂电池生产车间的设计规范及方案...

对于锂电池厂厂房装修而言&#xff0c;必须做好车间设计&#xff0c;因为锂电池的生产需要一个洁净的车间环境。锂电池厂厂房装修的车间设计要领主要体现在5方面&#xff0c;即&#xff1a;人员与物料布局、确定清洁度等级、确定空间压力差、确定空间空气平衡、确定机械系统布局…

将uglifyjs添加到鼠标右键菜单

之前几天根据YUICompressor和TBCompressor整合到鼠标右键菜单自己将uglifyjs也添加到了右键菜单&#xff0c;下面简单记录下过程。效果如下 uglifyjs添加到鼠标右键菜单配置windows nodepath环境 鼠标右键我的电脑&#xff0c;选择属性→高级属性管理→高级选项卡→环境变量&am…

1标志图片_这四种情况将不再扣分罚款!11月起,全国高速统一限速标志

如果你经常跑高速&#xff0c;那么你可能经常会有这样的经历&#xff1a;本来开车开得好好的&#xff0c;忽然遇到限速标志&#xff0c;赶紧进行紧急刹车。又或者限速标志在不醒目的地方&#xff0c;完全没有发现&#xff0c;等到下了高速才知道自己因为超速被扣分了~这些问题不…

NPOI 菜鸟实践行之根据指定的模板生成Excel 2003格式的文件 (一)

感谢群里的各位朋友的指导和教学&#xff0c;感谢Tony Qu的热心指导&#xff0c;感谢阿修罗兄提供的Excelhelper类 谈谈个人对Excel的理解&#xff0c;结合NPOI&#xff0c;个人水平一般般&#xff0c;菜鸟一只 Excel 打开后&#xff0c;分为sheet-文件簿&#xff0c;Rows-行&a…

Java设计模式12:装饰器模式

装饰器模式 装饰器模式又称为包装&#xff08;Wrapper&#xff09;模式。装饰器模式以多客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。 装饰器模式的结构 通常给对象添加功能&#xff0c;要么直接修改对象添加相应的功能&#xff0c;要么派生子类来扩…

JDBC使用案例

一、结果集中获取数据并对实体set值&#xff0c;封装成对象返回&#xff1b; 2、封装JDBC工具类 只要执行一次的&#xff0c;如读取配置文件&#xff0c;则写静态代码块&#xff1b; 异常抛出要写明方法才可以throw&#xff0c;静态代码块异常只能捕捉try catch; 类加载器两个作…

Android入门:Log介绍

一、Log类介绍 在Logcat视图中查看Android日志信息&#xff1b; (1)Log.v()&#xff1a;任意信息&#xff1b; (2)Log.e()&#xff1a;error信息&#xff1b; (3)Log.w()&#xff1a;warning信息&#xff1b; (4)Log.i()&#xff1a;提示信息&#xff1b; (5)Log.d()&#xff1…

JAVA中的日志框架-log4j的使用

JAVA日志-使用log4j 1. log4j.jar下载 windows下载地址&#xff1a; http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip Linux平台下的下载地址&#xff1a; http://download.chinaunix.net/download.php?id12696&ResourceID6256 把l…

PreparedStatement预编译的sql执行对象

一、预编译&#xff0c;防sql注入 其中&#xff0c;设置参数值占位符索引从1开始&#xff1b;在由sql 连接对象创建 sql执行对象时候传入参数sql语句&#xff0c;在执行对象在执行方法时候就不用再传入sql语句&#xff1b; 数据库索引一般是从1开始&#xff0c;java对象一般是从…

Linux下Vi/Vim的使用方法

本文介绍了vi (vim)的基本使用方法&#xff0c;但对于普通用户来说基本上够了&#xff01;i/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim 是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法…

JDBC管理事务

一、事务概念&#xff1a;打包一起的多个步骤的业务操作&#xff0c;要么同事成功&#xff0c;要么同时失败&#xff0c;则需要用事务管理&#xff1b; 二、代码实现 转载于:https://www.cnblogs.com/wmqiang/p/11600776.html

Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...

SQLite是一种转为嵌入式设备设计的轻型数据库&#xff0c;其只有五种数据类型&#xff0c;分别是&#xff1a; NULL&#xff1a; 空值 INTEGER&#xff1a; 整数 REAL&#xff1a; 浮点数 TEXT&#xff1a; 字符串 BLOB&#xff1a; 大数据 在SQLite中&#xff0c;并没有专门设…

根据企业信息化应用需求来分析工作流平台的选型

随着企业信息化建设的发展&#xff0c;选择一个能快速满足个性化需求并灵活稳健的系统架构是企业信息化建设成功的基础&#xff0c;这已经成为一个不争的事实。工作流平台软件作为一个中间件产品&#xff0c;在企业信息系统架构中对于业务流程管理、快速开发及高效维护起着相当…

excel 某个单元格不是等于空值_这些稀奇古怪的符号,却是Excel高手们常玩的!...

Excel高手的世界&#xff0c;刚接触excel的同学们&#xff0c;真还不懂。高手们在编写excel函数公式&#xff0c;经常会玩大括号({})、双减号(--)、百分号(%)、连接空值(&"")等等稀奇古怪的符号&#xff0c;看得我们是一愣愣的。当然这些进阶的思路也是excel帮助…

Cookie会话技术

java web动态资源有Servlet和JSP&#xff1b; HTTP协议是无状态的&#xff0c;即每次请求响应和其他的互补相关&#xff0c;所以要共享数据&#xff0c;需要会话技术&#xff1b; 一、概念 二、Cookie会话技术 代码写在服务器端&#xff0c;设置Cookie和发送Cookie以及接收Cook…