您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

CAP 定理,只能三选二吗?

时间:2023-03-20 13:46:57  来源:微信公众号  作者:猿java

不管你有没有实战过分布式系统,赫赫有名的 CAP 定理一定有所耳闻,今天我们就来聊一聊 CAP 是什么?在分布式系统设计时,CAP 该如何选择?

一、CAP 由来 

CAP 定理:CAP Theorem,又被称作布鲁尔定理(Brewer's theorem),它是由加州大学伯克利分校教授埃里克·布鲁尔(Eric Brewer)在 2000 年首次提出,主要是关于搜索引擎、分布式 Web 缓存权衡的一个猜想,直到 2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和 南希·林奇(Nancy Lynch)才提出和发表对该猜想的正式证明,使之成为分布式计算领域公认的一个定理。

埃里克·布鲁尔:

  • 博士

  • 加州大学伯克利分校教授

  • Inktomi 联合创始人兼首席科学家

布埃里克·布鲁尔 CAP 定理猜想

https://people.eecs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

二、CAP 定义 

如果你仔细研读过埃里克·布鲁尔 CAP 猜想原文,会发现:在原文,作者并没有详细定义 Consistency、AvAIlability、Partition Tolerance 三个词,因此,作为初学者甚至工作多年的小伙伴,因为学习 CAP 资料的不同,对 CAP 的理解也有所差别。

本文对 CAP 的定义基于 Seth Gilbert 和 Nancy Lynch 的 CAP 证明。

Seth Gilbert 和 Nancy Lynch 的 CAP 证明

https://groups.csail.mit.edu/tds/papers/Gilbert/Brewer6.pdf

 

C:Consistency,一致性

这里的一致性是指强一致性( Strong Consistency )或者线性一致性(Linearizable Consistency ),它要求多节点组成的分布式系统,能够像单节点一样,如果一个写操作返回成功,后面所有的读请求都必须能读到这个新数据,如果写操作返回失败,后面所有的读操作都不能读到这个数据。因此,CAP 中的一致性忽略了网络延时,要求分布式系统节点数据的写入能和单机一样即时。

A:Availability,可用性

可用性要求系统提供的服务必须处于 100% 可用的状态,对于用户的每一个操作请求,系统总能够在有限的时间内返回结果。这里强调的可用性是完全可用,不允许任何不可用的情况出现,因此这是一个非常理想的模型。

目前业内的分布式系统根本达不到 100% 的可用性,常见的可用性有:99.99% (俗称 4 个 9),即一年内服务不可用时长有 50 分钟;99.999%(俗称 5 个 9),即一年内服务不可用时长只有 5 分钟,99.9999%(俗称 6 个 9),即一年内服务不可用时长只有 31秒。

P:Partition tolerance,分区容错性

分区指的是在整个分布式系统中,因为各种网络原因,导致系统被分隔成多个独立的部分,它不仅包含通常意义上的网络分区,也包含因网络丢包导致网络不通的情况。因此,分区容错是指当出现网络分区后,系统能够继续“履行职责”。

如下图:因为网络分区,ATM1 成了一个独立的区域,ATM2 和 ATM3 又成了另外一个区域。

 

三、CAP 组合 

按照 CAP 定理,三个要素中只能取两个,组合如下图:

 

CA - Consistency/Availability

如下图:账户原余额是 0,在网络状况 ok 时,从 ATM1 存入 $100 ,再从 ATM2 查询余额也是 $100。所以,可以满足 CA。

但是,作为一名程序员,应该很清楚:日常开发中,很多工作都是为了弥补网络异常导致的问题。因此在真实的分布式环境中,网络状况是一个不确定因素,假如忽略网络状况(即忽略 P),只考虑 CA 会出现什么情况?

如下图:账户原余额是 0,当 ATM1 存入 $100 成功后, ATM1 和 ATM2 发生网络分区,为了保证两个 ATM 数据的 C(一致性),ATM 2 需要禁止存款,查询余额等操作,这样 ATM2就不能工作了,和 A(可用性) 冲突;

如下图:当 ATM1 存入 $100 成功后, ATM1和 ATM2 发生网络分区,为了保证两个 ATM 系统的 A(可用性),ATM2 就必须提供存款,查询余额等操作,但是 ATM1 存入 $100 的信息还未同步给 ATM2,所以,ATM2查询到的账户余额是 0,余额不足,和 C(一致性) 冲突;

 

因此,分布式系统,理论上是不能选择 CA 架构

CP - Consistency/Partition tolerance

如下图:账户原余额是 0,当从 ATM1 存入 $100 时发生了网络分区,ATM1 和 ATM2 无法通信,因此,从 ATM1 上存入 $100 的信息无法同步给 ATM2,ATM2 为了保证和 ATM1 数据的一致性,需要拒绝存款或者查询余额等操作,返回 error,这样就牺牲了ATM2 的 A(可用性)。

AP - Availability/Partition tolerance

如下图,账户原余额是 0,当从 ATM1 存入 $100 时发生了网络分区,ATM1 和 ATM2 无法通信,为了保证可用性,ATM 2 必须提供存款,查询余额等操作。注意:尽管 ATM2提供了服务,但是它提供的数据可能是一个错误的,因此牺牲了 C(一致性)。

 

上文我们用实例分别描述了 CA,CP,AP,因为现实环境中,网络的因素是不可控的,所以在大部分情况下,系统设计都会保留 P 属性,而在 C 和 A 中二选一。但是,在分布式系统的设计中,真的只能三选二吗?

 

四、CAP 误区 

误区一:三选二有误导性

这里是一个很容易产生误解的地方,很多资料都强调 CAP 只能选择 CP 或者 AP,但是在计算机的世界,并不是非黑即白。

CAP 定理阐明分布式系统只能选择 CP 或 AP,但这里有一个隐藏的前提:那就是系统发生了“分区”。由于分区很少发生,如果系统不存在分区的情况下没有理由牺牲 C 或 A ,CAP 在大多数时候允许完美的 C 和 A。因此,在架构设计时,既要考虑分区发生时选择 CP 还是 AP,也要考虑没有网络分区时如何保证 CA。

误区二:牺牲不等于什么都不做

CAP 定理阐明三个元素只能取两个,需要“牺牲”(sacrificed)另外一个,这里的“牺牲”只是说在分区时无法同时保证 CA,并不是什么都不做。比如:上文提到的 99.99%、99.999% 或 99.9999% 系统,一年内不可用时长不超过 1小时,因此可以在分区期间牺牲 C 或 A,在分区故障解决后,系统又重新恢复到 CA 状态。

误区三:CAP 忽略了网络延时

CAP 定理的强一致性,要求分布式系统和单点系统一样保证数据写入的即时性,忽略了节点间数据复制有网络延时(也就是说,当有数据写入时,数据能够瞬间复制到所有节点)。实际情况下,数据从节点 A 复制到节点 B,需要花费一定的时间。这就意味着,CAP 理论中的 C 在实践中是不可能完美实现的,在数据复制的过程中,节点 A 和节点 B 的数据并不一致。

通过分析几个误区,我们来回答文章标题:CAP 只能 三选二吗?

CAP 中阐述只能选择 CP 或者 AP,前提是系统出现了分区,存在误导性,因为分区比较少发生,因此在网络状况良好的,CAP都是可以保证的,在架构设计时,既要考虑分区发生时选择 CP 还是 AP,也要考虑没有网络分区时如何保证 CA。

五、ACID 和 BASE 

分析完 CAP 之后,就不得不提和 CAP 有千丝万缕关系的 ACID 和 BASE。

ACID 是数据库的传统设计思路,CAP 与 ACID 容易产生误解的一个原因是 ACID 和 CAP有相同的 C、A 字母,但是它们所代表的概念却不同。

A:ACID 中的 A 是 Atomicity,原子性。一个事务中的所有操作,要么全部完成,要么全部失败。CAP 中的 A 是可用性。

C:ACID 中的 C 是 Consistency,一致性。指事务不能破坏任何数据库规则,如键的唯一性。与之相比,CAP 的 C 仅指单一副本这个意义上的一致性,因此只是 ACID 一致性约束的一个严格的子集。

I:Isolation,隔离性。正在处理但尚未提交的事务必须与任何其他事务保持隔离。事务隔离分为:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。隔离是 CAP 定理的核心:如果系统要求 ACID 隔离性,那么它在分区期间最多可以在分区一侧维持操作。事务的可串行性(serializability)要求全局的通信,因此在分区的情况下不能成立。只要在分区恢复时进行补偿,在分区前后保持一个较弱的正确性定义是可行的。

D:Durability,持久性。事务对数据的修改就是永久的,即便系统故障也不会丢失数据。

 

BASE,它是 “Basically Available, Soft state, Eventually consistent(基本可用、软状态、最终一致性)”的首字母缩写。其中的软状态和最终一致性这两种技巧擅于对付存在分区的场合,提高了可用性。BASE 中的最终一致性其实是对 CAP 强一致性的一个补充。

 

六、真实案例 

CP 系统

redisgoogle BigTable、Hbase、MongoDB、 MemCacheDB

AP 系统

亚马逊的 DynamoDB、以及衍生物 Apache Cassandra 和 Voldemort

CA 系统

Apache Kafka 是一个比较典型的 CA系统

Kafka 从 0.8 版本之后,引入了 Replication 副本的概念。通过 In-sync-replica(同步数据副本)机制,所有的数据写入都必须在这个领导者节点中记录。另外,通过将数据复制到不同的节点上,从而增强了数据在系统中的持久性(Durability)和可用(Availability)。在 Kafka Replication 的系统设计中,所有的数据日志存储是设计在同一个数据中心(Data Center)里面的,也就是说,在同一个数据中心里网络分区出现的可能性是十分之小的。

 

七、总结 

CAP 是作者埃里克·布鲁尔 的猜想,经过麻省理工学院 赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)的证明。CAP 定理是分布式的一个基础理论,它可以开阔设计师的思路,在多样化的取舍方案下设计出多样化的系统。

CAP 定理强调的是强一致性和 100% 服务可用,但是,在真实分布式环境中 100% 可用只能是一种理想的状态。因此,4个9、5个9、6个9 的系统, 哪怕它不符合 CAP 定理的可用性,也符合工作中对可用性的要求。CAP 的强一致性,在分布式环境的多个节点间,因为数据同步有网络延时,因此也会存在一段时间的不一致。

CAP 定理断言任何基于网络的数据共享系统,最多只能满足数据一致性、可用性、分区容忍性三要素中的两个要素。但是通过显式处理分区情形,系统设计师可以做到优化数据一致性和可用性,进而取得三者之间的平衡。

百种业务百种架构,在架构设计时,既要考虑分区发生时选择 CP 还是 AP,也要考虑没有网络分区时如何保证 CA。



Tags:CAP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
深入浅出:分布式、CAP 和 BASE 理论
1. 引言大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。在计算机科学领域,分布式系统是一门极具挑战性的研究方向...【详细内容】
2023-09-19  Search: CAP  点击:(216)  评论:(0)  加入收藏
分布式架构入门:一文轻松搞懂晦涩的CAP理论!
对于设计分布式系统的架构师来说, CAP 是必须掌握的理论。CAP 定理( CAP theorem )又被称作布鲁尔定理( Brewer’s theorem),由加州大学伯克利分校(计算机领域神一样的大...【详细内容】
2023-08-09  Search: CAP  点击:(336)  评论:(0)  加入收藏
分布式系统中的CAP理论
对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统中...【详细内容】
2023-08-03  Search: CAP  点击:(230)  评论:(0)  加入收藏
分布式基础理论 CAP & BASE
CAP和BASE理论可以说是分布式系统的基础理论了,只要面试的时候遇到分布式的问题,基本上都会问到这两个理论。但是好多没毕业的同学,或者参加工作时间不长的同学,可能没有在实际...【详细内容】
2023-06-30  Search: CAP  点击:(304)  评论:(0)  加入收藏
聊聊浏览器最新特性 ImageCapture?
1.什么是ImageCapture?MediaStream Image Capture API 的 ImageCapture 接口提供了从相机或其他摄影设备捕获图像或照片的方法。 它提供了一个接口,用于从通过有效的 MediaStr...【详细内容】
2023-05-22  Search: CAP  点击:(195)  评论:(0)  加入收藏
网友分享 Win11 原生功能 Live Captions 使用体验
IT之家 4 月 18 日消息,网友 pizza_sushi85 于 2 天前在国外 Reddit 社区上发帖,表示在玩《刺客信条》游戏的时候,使用 Win11 系统中原生的 Live Captions 功能来创建字幕。游...【详细内容】
2023-04-18  Search: CAP  点击:(339)  评论:(0)  加入收藏
CAP 定理,只能三选二吗?
不管你有没有实战过分布式系统,赫赫有名的 CAP 定理一定有所耳闻,今天我们就来聊一聊 CAP 是什么?在分布式系统设计时,CAP 该如何选择?一、CAP 由来 CAP 定理:CAP Theorem,又被称作...【详细内容】
2023-03-20  Search: CAP  点击:(33)  评论:(0)  加入收藏
KgCaptcha 行为验证码安全策略设置
前言在验证码项目中,都会遇到验证码被恶意大量高频的调用,给服务造成很多无效的注册或登录,占用大量的系统资源。而我在想,有没有哪一款验证码产品可以设置黑/白名单限制IP访问...【详细内容】
2023-03-03  Search: CAP  点击:(133)  评论:(0)  加入收藏
Automated Libra通过CAPTCHA绕过自动创建GitHub账号,进行加密货币挖矿
Automated Libra黑客组织通过CAPTCHA绕过技术自动账号创建,进行加密货币挖矿。近期,南非黑客组织'Automated Libra'通过CAPTCHA绕过技术实现自动账号创建,在云平台创建...【详细内容】
2023-01-09  Search: CAP  点击:(327)  评论:(0)  加入收藏
业界首个!华为完成5G Redcap关键技术验证 让5G基站便宜如4G
9月23日,中国信息通信研究院MTNet实验室,IMT-2020(5G)推进组完成全球首个5G R17 RedCap基站与芯片关键技术测试。据了解,该测试采用华为商用基站和国内知名厂家商用芯片,遵循IMT-2...【详细内容】
2022-09-24  Search: CAP  点击:(243)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条