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

分布式基础理论 CAP & BASE

时间:2023-06-30 14:31:53  来源:尚硅谷教育  作者:

CAP和BASE理论可以说是分布式系统的基础理论了,只要面试的时候遇到分布式的问题,基本上都会问到这两个理论。但是好多没毕业的同学,或者参加工作时间不长的同学,可能没有在实际开发中接触过分布式系统,这种情况我的建议是多看优质博客,自己多思考,然后找一些开源的项目看一下理论的实际运用。当然有相关经验的同学也可以复习巩固一下。

一、CAP定理

CAP定理又被称为布鲁尔定理,是加州大学计算机科学家埃里克·布鲁尔提出来的猜想,后来被证明成为分布式计算领域公认的定理。不过布鲁尔在出来CAP的时候并没有对CAP三者(Consistency,AvAIlability,Partition tolerance)进行详细的定义,所以在网上也出现了不少对CAP不同解读的声音。

CAP定理在发展中经历过两个版本,后一个版本比较完善,我们以第二个版本为准:在一个分布式系统中(指互相连接并共享数据的节点集合)中,当涉及到读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。

其中的关系如下图所示:

为了方便理解,我们先用相对通俗的语言来解释一下一致性、可用性、分区容错性的具体体现是什么,也就是保证的到底是什么。

一致性(Consistence) , 这个是针对数据来说的,比如数据库MySQL中的数据,一个分布式系统中,某个节点修改了一个数据,那么之后其他所有节点读取这条数据的时候,得到的一定是最新的数据。

可用性(Availability),分布式系统中某些节点挂掉了,但是不会影响整体的业务,比如 C 这个微服务,有10个实例组成一个集群,其中5个挂了,另外5个正常,这种情况下整个系统还是可用的,不会因为挂了那5个,导致系统整体不可用。

分区容错性(Partition Tolerance),分布式系统出现网络分区的时候,仍然能够对外提供服务。

什么是网络分区?

分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。

1.1只能三选二?

我在网上看了一些博客,有些说这三个特性只能三选二,不可能同时满足。这其实是一个具有误导性质的说法。

因为在分布式系统中,网络不是100%可靠的,网络分区是必选项,也就是P是必选的,如果我们不选P,选CA,这个时候如果网络发生了分区,那么为了保证C,系统就会禁止写入数据,这样就与A产生了冲突,如果为了保证A,那么正常的分区可以写入数据,有故障的分区就不能写入了,这就与C产生了冲突。

简单来说,就是P是必须要实现的,因为网络不是100%可靠的,在此基础上C 和 A 二选一组成 CP 或者 AP 架构

比如Zookeeper 是CP架构,Eureka是AP架构,Nacos 不仅支持 CP 架构也支持 AP 架构。

对于服务注册来说,针对同一个服务,即使注册中心的不同节点保存的服务注册信息不相同,也并不会造成灾难性的后果,对于服务消费者来说,能消费才是最重要的,就算拿到的数据不是最新的数据,消费者本身也可以进行尝试失败重试。总比为了追求数据的一致性而获取不到实例信息整个服务不可用要好。

所以,对于服务注册来说,可用性比数据一致性更加的重要,选择AP。

1.2 CAP的实际应用

1.2.1 注册中心

注册中心主要做两件事:

  1. 服务注册:实例把自身的信息给注册中心,信息包括服务的IP地址和服务Port,以及暴露服务自身状态和访问协议信息。
  2. 服务发现:实例请求注册中心,拿到想要请求的服务信息,IP+Port,就可以访问具体的实例了。

常见的注册中心组件有:Zookeeper、Eureka、Nacos等等,我们以Zookeeper和Eureka为例,分别说明一下CP和AP。

Zookeeper 保证的是CP。任何时刻对Zookeeper的读请求都能得到一致的结果,但是zookeeper不`能保证服务的可用性,比如在选举Leader的时候,或者一半以上的机器不可用,那么整个系统就是不可用状态。

Eureka保证的是AP。因为在设计的时候就是优先保证AP,而且Eureka集群中没有Leader节点,每个节点都是一样的,所以Eureka可以做到只要有一个节点可用,那么系统就是可用的,只不过这个节点上的数据不能保证是最新的。

1.2.2 小结

对于服务注册来说,针对同一个服务,即使注册中心的不同节点保存的服务注册信息不相同,也并不会造成灾难性的后果,对于服务消费者来说,能消费才是最重要的,就算拿到的数据不是最新的数据,消费者本身也可以进行尝试失败重试。总比为了追求数据的一致性而获取不到实例信息整个服务不可用要好。

所以,对于服务注册来说,可用性比数据一致性更加的重要,一般选择AP。

二、BASE理论

BASE 是 Basically Available(基本可用)Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性 C 和可用性 A 权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。

BASE理论本质上是对CAP的延伸和补充,是对CAP中的AP方案的一个补充,即在选择AP方案的情况下,如何更好地最终达到C。

2.1 BASE理论三要素

基本可用:出现故障的时候,允许损失部分可用性,即,保证核心可用

如,电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。

软状态:允许系统存在中间状态,而该中间状态不会影响系统整体可用性。

软状态本质上是一种弱一致性,允许的软状态不能违背“基本可用”的要求。如,分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时(某些时刻副本数低于3)。

最终一致性:系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。

最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

分布式中的一致性有三种级别:

①强一致性:系统在某个节点中写入或修改了数据,那么之后在任意节点读取到的数据都是最新的数据。

②弱一致性:不一定能读到最新的值,也不能保证在一定时间后读取到的数据是最新的,只会尽量在某个时刻达到数据一致的状态。

③最终一致性:弱一致性的升级版,可以保证在一定时间内达到数据的最终一致性。

一般常用的是最终一致性,但是也有一些对一致性要求比较高的,比如银行的交易系统,这种要保证强一致性。

三、总结

在分布式架构中,是无法脱离CAP理论的,因为网络永远不能100%可靠,硬件也会老化,软件可能出现BUG,所以分区容错性(Partition Tolerance)是避不开的,只要是分布式,只要是集群,都面临着选AP或者CP,如果你都想要,那只能对一致性做出一些妥协,也就是引入BASE理论,在业务允许的情况下实现最终一致性。

究竟是选择AP还是CP,在于业务,比如涉及到金钱交易,库存相关的会优先考虑CP模型,而例如社区发帖,评论这种相关的可以选择AP模型。总之选什么模型是由业务来决定的。



Tags:分布式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: 分布式  点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: 分布式  点击:(40)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03  Search: 分布式  点击:(50)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: 分布式  点击:(59)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 分布式  点击:(96)  评论:(0)  加入收藏
分布式场景下的事务机制
事务消息是RocketMQ的一个非常特色的高级特性,它的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据⼀致性。我们在单机版本下面只需要在业务方法上加上对应的事务就可以...【详细内容】
2023-12-26  Search: 分布式  点击:(123)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  Search: 分布式  点击:(48)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: 分布式  点击:(72)  评论:(0)  加入收藏
聊一聊雪花算法与分布式ID生成
生成全局唯一ID的雪花算法原理雪花算法是一种用于生成全局唯一ID的算法,最初由Twitter开发,用于解决分布式系统中生成ID的问题。其核心思想是将一个64位的长整型ID划分成多个...【详细内容】
2023-12-12  Search: 分布式  点击:(134)  评论:(0)  加入收藏
Redis分布式锁常见坑点分析
日常开发中,基于 Redis 天然支持分布式锁,大家在线上分布式项目中都使用过 Redis 锁。本文主要针对日常开发中加锁过程中某些异常场景进行讲解与分析。本文讲解示例代码都在 h...【详细内容】
2023-12-11  Search: 分布式  点击:(111)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条