浅析分布式理论的CAP
大家好,我是易安!
今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中,可用性和数据一致性是两个至关重要的因素,而CAP理论就是在这两者之间提供了一种权衡的原则,帮助我们在设计分布式系统时进行决策。同时,CAP理论的出现也深刻影响着分布式系统的发展和设计。但是在当今这个时间点,业界对于CAP理论的理解和应用也在不断地发生变化,我们一起探讨下这些新的思考和认识
什么是 CAP 理论
CAP 理论是加州理工大学伯克利分校的 Eric Brewer 教授在 2000 年 7 月的 ACM PODC 会议上首次提出的,它是 Eric Brewer 在 Inktomi 期间研发搜索引擎、分布式 Web 缓存时得出的关于数据一致性( C:Consistency )、服务可用性( A:Availability )、分区容错性( P:Partition-tolerance )的一个著名猜想:
It is impossible for a web service to provide the three following guarantees : Consistency, Availability and Partition-tolerance.

在这个猜想提出的 2 年以后,来自麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 Eric Brewer 教授的 CAP 猜想是成立的,从此,CAP 理论在学术上正式成为了分布式领域公认的定理,并深刻影响着分布式系统的发展。
CAP 理论告诉我们, 一个分布式系统不可能同时满足数据一致性、服务可用性和分区容错性这三个基本需求,最多只能同时满足其中的两个。为什么会这样呢?我们先来了解一下 CAP 理论对于数据一致性、服务可用性和分区容错性是怎么定义的。
一致性( C )
CAP 理论中的一致性是指强一致性( Strong Consistency ),又叫线性一致性( Linearizable Consistency ),它要求多节点组成的分布式系统,能像单节点一样运作,如果一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有的读操作都不能读到这个数据。
一致性中除了强一致性之外,还有其他的一致性级别,比如序列一致性( Sequential Consistency )和最终一致性( Eventual Consistency )等,这个在后面的课程“一致性与共识(一)”中会有详细的介绍。
可用性( A )
CAP 理论对可用性的定义,指的是要求系统提供的服务必须处于 100% 可用的状态,对于用户的每一个操作请求,系统总能够在有限的时间内返回结果。 下面我们重点来讨论可用性定义中的三个关键点:“100%可用”、“有限时间内”和“返回结果”。
第一点,100% 可用,既不是 99% 可用,也不是99.99% 可用,它说的是系统必须完全可用,不允许任何不可用的情况出现,这是一个非常理想的模型。 第二点,有限时间内,它指的是对于客户端的一个请求,系统必须在指定的时间内返回对应的请求结果,如果超过了这个时间,系统就被认为是不可用的。一般来说,“有限时间内”是系统在设计的时候,就设定好的系统运行指标,不同的系统之间会有非常大的差别。
例如,对于一个服务在线业务的 OLTP 数据库 MySQL ,它的“有限时间”一般不会超过 1 秒,但是对于服务离线分析的 OLAP 数据库 Hive ,它的“有限时间”可能会超过 30 秒,甚至更长。
虽然不同的系统对于“有限时间”的设定差别非常大,但是对于一个给定的系统来说,在设定了这个“有限时间”之后,只要对一个请求的响应超过了这个时间,我们就认为这个系统是不可用的。
第三点,返回结果,这是指系统在完成对客户端请求的处理后,必须返回一个正常的响应结果。客户端可以根据这个响应结果,来明确判断这个请求执行成功还是失败,而不是返回一个让用户无法判断的不正常的响应结果。
比如客户发起一个请求,从用户 A 的账户转 50 元到用户 B 的账户,“转账成功”和“余额不足”都是正常的响应结果,而“服务不可达”和“服务器内部错误”等就是不正常的响应结果。
分区容错性( P )
分区指的是在整个分布式系统中,因为各种网络原因,系统被分隔成多个单独的部分,它不仅包含我们通常说的网络分区,也包含因为网络丢包导致的网络不通的情况。并且,这里说的因为网络丢包导致网络不通的情形,还包含节点宕机的场景,由于系统的其他机器不知道某个节点宕机了,只知道与宕机节点的网络是不通的,所以当节点宕机发生时,其他节点发往宕机节点的包也将丢失。
在现实的分布式系统中,我们面对的就是一个不可靠的网络和有一定概率宕机的设备,这两个因素都会导致分区出现,因此在分布式系统实现中,分区容错性 P 是一个必须项,而不是可选项。
在分布式系统中,如果我们的设计放弃分区容错性,就相当于我们认为节点之间的网络通信永远是好的,那么我们对节点之间的远程调用的结果,就不需要处理超时、网络地址不可达等网络层错误了。但是这样一来,看似是简化了系统设计,实际却忽视了超时等网络错误的情况。当它们出现后,系统的行为就是未定义的了,可能会出现崩溃,或者是脏数据的问题。
因此,对于分布式系统工程实践来说, CAP 理论更合适的描述是:在满足分区容错的前提下,没有算法能同时满足数据一致性和服务可用性。
CAP 理论争论
关于数据一致性和可用性之间的争论由来已久,当时主要表现为 ACID 与 BASE 之间的争论。
基于 BASE 理论支撑的 NoSQL 运动坚持创造各种可用性优先、数据一致性其次的方案,而传统数据库则坚守 ACID 特性(原子性、一致性、隔离性、持久性),优先数据一致性,在必要的时候,可以放弃系统可用性。当时 BASE 理论还没有被广泛接受,人们还是不愿意放弃 ACID 的优点。
当 CAP 理论提出后,我们明白了在分布式系统中,只能在强一致性和 100% 的可用性之间二选一,不能两个都要。从此 BASE 理论也逐渐被人们所接受,在大规模存储的场景中广泛应用,并且开创了从 2000 年到 2010 年, NoSQL 运动的黄金十年。这十年里,工业界产生了大量优秀的 NoSQL 系统,比如 BigTable 、 HBase 、 MongoDB 、 Cassandra ,解决了人们当时遇到的大规模数据存储的问题。
CAP 理论的重新思考与理解
CAP 理论的出现是有历史使命的,让人们能够在分布式系统中,放弃以关系数据库为代表的 ACID 强一致性系统,接受以 NoSQL 为代表的 BASE 理论,并且暂时解决了人们在 2000 年前后对于分布式系统中,数据一致性和可用性之间的争论,让人们能够更加务实地解决当时由于互联网爆发式发展,产生的海量用户和数据的分布式计算与存储的问题。
一个有历史使命的事物,在使命完成后,要么就过时了,人们不再提起它,要么就会对它有新的解释,让它跟随时代一起发展下去。而 CAP 理论显然属于后者,因为直到现在,人们还在对它不断地重新思考与理解。
在 2000 年的时候,CAP 理论通过一个简单但是精确定义的模型,论证了在一个满足分区容错的分布式系统中,当我们进行系统设计时,只能在数据一致性和服务可用性之间二选一。其中, 数据一致性( C )指的是数据的强一致性,服务的可用性( A )指的是服务100 % 的可用性,这才是 CAP 理论论证模型的关键点。
对可用性的重新思考与理解
首先,我们对服务的可用性( A )进行分析,你会发现在我们的日常工作中,几乎没有见过 100% 可用的服务。可用性指标是在 0 到 100% 之间连续分布的,其实一个 100% 可用性的服务和一个 99.9999% 可用性的服务之间并没有多大的差别,如果我们的服务能实现 99.9999% 的可用性,哪怕它不符合 CAP 理论的可用性,也是符合我们工作中对可用性的要求的。
所以,在我们的系统选择了 CP 模型的时候,对于可用性( A ),我们永远无法达到 100%,但是按业务要求不断优化,是我们努力的目标。
关于具体的实践,我认为基于 Raft 算法实现的 etcd 就是一个非常好的,对可用性进行重新思考的实践。如果依据 CAP 理论来划分的话,etcd 属于 CP 模型。
而在 etcd 系统的实现中,如果网络没有出现分区,整个系统是 100% 可用的;就算网络出现分区了,也不会有整个etcd 系统都不可用的情况。在这时,超过半数 etcd 实例所在的网络分区一侧,系统是正常可用的,虽然网络分区的另一侧是不可用的,但是整个 etcd 系统的可用性依然可能超过 50% 。
对一致性的重新思考与理解
对于数据的一致性( C ) ,除了 CAP 理论要求的强一致性外,还有单调一致性、会话一致性和最终一致性等。如果我们的系统设计选择了 AP 模型, 在数据一致性方面,虽然我们无法实现强一致性,但是我们也不要全部放弃,可以努力去实现更高的一致性级别,为系统的服务提供更好的抽象。
这里我们通过一个例子来说明,假设我们设计一个 AP 模型的分布式系统,正常情况下,如果依据 CAP 理论,在系统设计时,我们需要放弃数据的一致性。但是,我们可以从另一个思路来设计,在系统没有出现网络分区的时候,这个分布式系统应该设计为强一致性的。
如果出现网络分区了,我们可以根据系统情况,有选择并且精心设计地降低系统的一致性级别。比如,从强一致性降低到单调一致性或会话一致性等,这样的设计,既符合 CAP 理论依据,也为系统提供了更好的一致性级别,特别是在网络分区的时候。
对分区容错性的重新思考与理解
最后,我们来分析一下分区容错性 P 的问题。在分布式系统中,节点之间必须通过网络来通信,可是网络可能会丢包和中断,节点也可能会宕机,这样的情况就要求我们在系统设计的时候,必须做好系统的分区容错处理。
但是,系统出现分区的情况非常少见,所以我们可以来试想一下,在网络不出现分区的时候,我们将数据强一致性和 100% 的可用性都选择,等到网络出现分区的时候,系统再选择放弃部分的可用性或者降低数据一致性的级别,这种处理方式是否可行呢?
其实这样的处理方式是可以的,在上面对可用性和一致性的重新思考与理解中,所举的例子都是按这个方式来处理的, 它实际是将 CAP 理论的选择,推迟到出现网络分区的时候,而不是系统一启动就进行 CAP 的选择。这样可以大大提高系统的可用性和数据一致性,并且系统依然能容忍网络分区。
另外,关于 CAP 理论的重新思考,特别需要说明的一个例子是 Google 的 Spanner ,我们都知道 Spanner 是一个全球分布式数据库,但是 Google 却宣称 Spanner 是一个 CA 系统,这是不是和 CAP 理论的说法产生了矛盾呢?
其实并不矛盾,Spanner 虽然是一个分布式系统,但是它运行在 Google 的内部网络中,并且拥有大量冗余的网络链路、处理相关故障的架构规划、以及非常细致的运维,以此来确保系统的可用性超过了 99.999%。虽然不能达到 100%,但是对于使用者来说,和可用性 100% 几乎没有任何区别,所以Spanner 就是一个 CA 系统。
而且,在网络出现分区的时候,Spanner 会选择一致性而不是可用性,这个时候 CAP 理论依然会生效。所以对于 CAP 理论的重新思考,总而言之就是一句话: CAP 理论给我们定义了系统的设计边界,虽然想要设计出超过边界的系统是徒劳的,但是我们却可以无限逼近边界,并且把它作为我们设计系统的目标。---
总结
今天,我们一起讨论了什么是 CAP 理论,它是指分布式系统中,在满足分区容错的前提下,没有算法能同时满足数据一致性和服务可用性,只能在数据一致性和服务可用性之间二选一。
紧接着,我们讨论了 CAP 理论产生的影响,可以说 CAP 理论的出现,让人们接受了 BASE 理论,并且推动了 NoSQL 运动的发展,开启了它的黄金十年。
最后,我们探讨了现在人们对于 CAP 理论的新理解。对于 AP 模型的系统,我们会努力去提升数据一致性的级别,而对于 CP 模型的系统,我们会努力去提升系统可用性的级别。在网络不出现分区的时候,我们可以将 A 和 C 都选择上;在网络出现分区的时候,通过推迟 CAP 选择来提高系统的可用性和数据一致性。
综上所述,CAP 理论对于分布式系统的设计和实践具有重要意义,让人们在处理数据一致性和服务可用性之间的权衡时,有了更加明确的思路和指导原则。而对于未来的发展,我们相信人们会不断地探索和挑战 CAP 理论的极限,以期创造出更加高效、稳定、可靠的分布式系统。
最后推荐你去读一下周志明老师的<<凤凰架构>>,相信你能有更加深刻的认识。
如果本文对你有帮助的话,欢迎点赞分享,这对我继续分享&创作优质文章非常重要。感谢 !
本文由 mdnice 多平台发布
相关文章:

浅析分布式理论的CAP
大家好,我是易安! 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中,可用性和数据一致性是两个至关重要的因素,而CAP理论就是在这两者之间提供了一种权衡的原则,帮助我们在设计分布式系统时进…...

使用 TensorFlow 构建机器学习项目:6~10
原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象&#x…...

使用 LXCFS 文件系统实现容器资源可见性
使用 LXCFS 文件系统实现容器资源可见性一、基本介绍二、LXCFS 安装与使用1.安装 LXCFS 文件系统2.基于 Docker 实现容器资源可见性3.基于 Kubernetes 实现容器资源可见性前言:Linux 利用 Cgroup 实现了对容器资源的限制,但是当在容器内运行 top 命令时就…...

SQL LIMIT
SQL LIMIT SQL LIMIT子句简介 要检索查询返回的行的一部分,请使用LIMIT和OFFSET子句。 以下说明了这些子句的语法: SELECT column_list FROMtable1 ORDER BY column_list LIMIT row_count OFFSET offset;在这个语法中, row_count确定将返…...

OpenCV实战之人脸美颜美型(六)——磨皮
1.需求分析 有个词叫做“肤若凝脂”,直译为皮肤像凝固的油脂,形容皮肤洁白且光润,这是对美女的一种通用评价。实际生活中我们的皮肤多少会有一些毛孔、斑点等表现,在观感上与上述的“光润感”相反,因此磨皮也成为美颜算法中的一项基础且重要的功能。让皮肤变得更加光润,就…...

Java技术栈—重装系统后不重新安装也能正常使用的设置方式
声明: 最近在重装电脑,重装完后,开发工具会有些功能使用不了,在这做个记录!这里是 JAVA 技术栈 问题描述: git 右键无菜单 111 git git 右键无菜单 参考文章:注册表修复git右键无菜单 git …...

智驾升级!ADB+AFS「起势」
目前,乘用车前大灯已经完成从传统卤素、氙气到LED的转型升级,高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)乘用车前装标配LED前大灯搭载率达到75.99%,同比2021年提高约7个百分点。 而相比而…...

算法记录 | Day27 回溯算法
39.组合总和 思路: 1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要 candidates数组 targetSum(int)目标和。 startIndex(int)为下一层for循环搜索的起始位置。 2.终止条件…...

性能测试总结-根据工作经验总结还比较全面
性能测试总结性能测试理论性能测试的策略基准测试负载测试稳定性测试压力测试并发测试性能测试的指标响应时间并发数吞吐量资源指标性能测试流程性能测试工具JMeter基本使用元件构成线程组jmeter的分布式使用jmeter测试报告常用插件性能测试的计算1.根据请求数明细数据计算满足…...

类型断言[as语法 | <> 语法
TypeScript中的类型断言[as语法 | <> 语法] https://huaweicloud.csdn.net/638f0fbbdacf622b8df8e283.html?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-1-107633405-blog-122438115.2…...
barret reduction原理详解及硬件优化
背景介绍 约减算法,通常应用在硬件领域,因为模运算mod是一个除法运算,在硬件中实现速度会比乘法慢的多,并且还会占用大量资源,因此需要想办法用乘法及其它简单运算来替代模运算。模约减算法可以利用乘法、加法和移位等…...

NLP / LLMs中的Temperature 是什么?
ChatGPT, GPT-3, GPT-3.5, GPT-4, LLaMA, Bard等大型语言模型的一个重要的超参数 大型语言模型能够根据给定的上下文或提示生成新文本,由于神经网络等深度学习技术的进步,这些模型越来越受欢迎。可用于控制生成语言模型行为的关键参数之一是Temperature …...

c#快速入门~在java基础上,知道C#和JAVA 的不同即可
☺ 观看下文前提:如果你的主语言是java,现在想再学一门新语言C#,下文是在java基础上,对比和java的不同,快速上手C#,当然不是说学C#的前提是需要java,而是下文是从主语言是java的情况下ÿ…...

nginx--基本配置
目录 1.安装目录 2.文件详解 2.编译参数 3.Nginx基本配置语法 1./etc/nginx/nginx.conf 2./etc/nginx/conf.d/default.conf 3.启动重启命令 4.设置404跳转页面 1./etc/nginx/conf.d/default.conf修改 2. 重启 5.最前面内容模块 6.事件模块 1.安装目录 # etc cd …...

R语言中apply系列函数详解
文章目录applylapply, sapply, vapplyrapplytapplymapplyR语言系列: 编程基础💎循环语句💎向量、矩阵和数组💎列表、数据帧排序函数💎apply系列函数 R语言的循环效率并不高,所以并不推荐循环以及循环嵌套…...

红黑树探险:从理论到实践,一站式掌握C++红黑树
红黑树揭秘:从理论到实践,一站式掌握C红黑树引言为什么需要了解红黑树?红黑树在现代C编程中的应用场景树与平衡二叉搜索树树的基本概念:二叉搜索树的定义与性质:平衡二叉搜索树的特点与需求:红黑树基础红黑…...

CDH6.3.2大数据集群生产环境安装(七)之PHOENIX组件安装
添加phoenix组件 27.1. 准备安装资源包 27.2. 拷贝资源包到相应位置 拷贝PHOENIX-1.0.jar到/opt/cloudera/csd/ 拷贝PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha、PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel到/opt/cloudera/parcel-repo 27.3. 进入cm页面进行分发、…...

【C++要笑着学】搜索二叉树 (SBTree) | K 模型 | KV 模型
C 表情包趣味教程 👉 《C要笑着学》 💭 写在前面:半年没更 C 专栏了,上一次更新还是去年九月份,被朋友催更很久了hhh 本章倒回数据结构专栏去讲解搜索二叉树,主要原因是讲解 map 和 set 的特性需要二叉搜索…...

微信小程序开发 | 小程序开发框架
小程序开发框架7.1 小程序模块化开发7.1.1 模块7.1.2 模板7.1.3 自定义组件7.1.4插件7.2 小程序基础样式库—WeUI7.2.1 初识WeUI7.2.2【案例】电影信息展示7.3 使用vue.js开发小程序7.3.1 初识mpvue7.3.2 开发工具7.3.3 项目结构7.3.4【案例】计数器7.4 小程序组件化开发框架7.…...

气候系统设计
基础概念 一个星球(例如地球)的气候系统主要是一些基本参数基于公转周期(年)和自转周期(日)的变化,这其中会有两个变化因素:地理位置(经纬度)和天气变化&…...

如何使用Thymeleaf给web项目中的网页渲染显示动态数据?
编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录一. 什么是Thymeleaf?二. MVC2.1 为什么需要MVC?2.2 MVC是什么?2.3 MVC和三层架构之间的关系及工…...

01 | 电机常用语
1 电机常用术语 1.1 原点 原点是指步进电机在驱动直线运动机构时的起始点。 1.2 点动 点动是电动机控制方式中的一种。 点动由于在这一控制回路中没有自保,也没有并接其它的自动装置,只是按下控制回路的启动按钮,主回路才通电,松开启动按钮,主回路就没电了。最典型的是…...

Leetcode.2601 质数减法运算
题目链接 Leetcode.2601 质数减法运算 Rating : 1779 题目描述 给你一个下标从 0 开始的整数数组 nums,数组长度为 n 。 你可以执行无限次下述运算: 选择一个之前未选过的下标 i ,并选择一个 严格小于 nums[i]的质数 ppp &…...

DP7416国产192K数字音频接收芯片兼容替代CS8416
目录192K 数字音频应用DP7416简介芯片特性192K 数字音频应用 采样率192khz,能将192,000hz以下的频率都录下来,而且对声波每秒连续采样192,000次。在回放的时候,这192,000个采样点按顺序播放,从而还原原来的声音。 过采样技术除…...

全球土壤湿度数据获取方法
土壤湿度亦称土壤含水率,表示土壤干湿程度的物理量。是土壤含水量的一种相对变量。通常用土壤含水量占干土重的百分数是示,亦称土壤质量湿度,如用土壤水分容积占土壤总容积的百分数表示,则称土壤容积湿度。通常说的土壤湿度&#…...

在proteus中仿真arduino实现矩阵键盘程序
矩阵键盘是可以解决我们端口缺乏的问题,当然,如果我们使用芯片来实现矩阵键盘的输入端口缺乏的问题将更加划算了,本文暂时不使用芯片来解决问题,而使用纯朴的8根线来实现矩阵键盘,目的是使初学者掌握原理。想了解使用芯…...

【ROS2指南-5】理解ROS2服务
目标:使用命令行工具了解 ROS 2 中的服务。 教程级别:初学者 时间: 10分钟 内容 背景 先决条件 任务 1 设置 2 ros2服务列表 3 ros2服务类型 4 ros2 服务查找 5 ros2界面展示 6 ros2 服务调用 概括 下一步 相关内容 背景 服务是 …...

探索Apache Hudi核心概念 (3) - Compaction
Compaction是MOR表的一项核心机制,Hudi利用Compaction将MOR表产生的Log File合并到新的Base File中。本文我们会通过Notebook介绍并演示Compaction的运行机制,帮助您理解其工作原理和相关配置。 1. 运行 Notebook 本文使用的Notebook是:《A…...

100Wqps异地多活,得物是怎么架构的?
说在前面 在40岁老架构师尼恩的数千读者群中,一直在指导大家简历和职业升级,前几天,指导了一个华为老伙伴的简历,小伙伴的优势在异地多活,但是在简历指导的过程中,尼恩发现: 异地多活的概念、异…...

35岁的测试工程师被公司强行辞退,感叹道:我以前就该好好努力了
曾经的高薪软件测试工程师,今年35岁了,被公司劝退了,外卖跑到凌晨,很累,但还是有一种想诉说的冲动。哪怕让大家觉得已经说得太多了,烦了,都成祥林嫂了,但是,我是真的想说…...