分布式系统-CAP 理论

news2025/2/23 20:31:52

在前一篇分布式系统–拜占庭将军问题(The Byzantine Generals Problem) 我们理解了共识问题的背景,这一节主要讨论如何解决或者理解自己系统中的共识问题,通过什么来分辨自己的系统需要哪一种共识。

这个理论就是 CAP 理论,先想下面几个问题:

  • 什么是 CAP,全称是什么,之间的关系是什么?
  • CAP 之间是什么关系,场景对应是怎样的?
  • P 跟 A 都保证了可用性,但怎么区分?
  • 如何运用 CAP?

注意,如果是单体系统,不存在什么 CAP 理论 ,就不存在分区。


定义

属性全称中文描述
CConsistency一致性集群节点要么读到集群最新数据,要么全部都返回读取失败
AAvailability可用性任何来自客户端的请求,不管访问哪个**非故障节点**,都能得到响应数据,但不保证是同一份最新数据
PPartition Tolerance分区容错性当节点间出现任意数量的消息丢失或高延迟的时候,系统仍然在继续工作

从定义可以看到,CAP 就是 3 个属性,分别是一致性,可用性,分区容错性。

一致性

强调的是数据绝对的正确

下图,第一步设置了 x 为 2。但是从节点 2 获取的 x 还是 1。

第三步,节点之间通过通信,同步 x 数据。第四步,从节点 2 拉取到的 x 就是 2。

这样子,不管客服端访问哪个节点,读取到的都是同一份最新写入的数据。

在这里插入图片描述

可用性

强调的是服务绝对的正确

不管节点的数据是否一致,只要非故障节点服务器收到请求,就返回 x 的值,那么这个系统的服务就是满足可用性的。

在这里插入图片描述

分区容错性

强调的是系统在有错的前提下,依然能够正常运作

在这里插入图片描述

可用性和分区容错性看起来很相似,都保证了可用性,但是不要迷惑了。可以这么理解,有分区就有可能出现问题,但是出现问题之后给什么样的反馈,是取决于这个系统设计的人。怎么反馈,反馈成什么样,这就是 C 和 A。

因为分布式系统与单机系统不同,它涉及到多节点间的通讯和交互,节点间的分区故障是必然发生的,所以要提醒的是,在分布式系统中分区容错性是必须要考虑的。

CAP 不可兼得

因为分区容错性是前提,P一定有。可以这么理解,一个蓄水池,恒水位,有一个出水口和入水口。入水口坏了,你是想要这个蓄水池先供水,还是先保证水位正确,不要触发水位报警。这个蓄水池,肯定不能在没有入水的前提下,还能让水位保持恒定。因此,CAP 是不能兼容的。要想兼容,除非这个系统不需要分区。

CAP 不可兼得最初是埃里克·布鲁尔(Eric Brewer)基于自己的工程实践,提出的一个猜想,后被赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)证明,证明过程可以参考论文《Brewer’s conjecture and the feasibility of consistent, available, partition-tolerant web services》,记住结论就好了。

补充一点:基于证明严谨性的考虑,赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)对指标的含义做了预设和限制,比如,将一致性限制为原子一致性

如何使用 CAP 理论

有网络交互就一定会有延迟和数据丢失,而这种状况我们必须接受,还必须保证系统不能挂掉。所以就像前面提到的,节点间的分区故障是必然发生的。也就是说,分区容错性 P 是前提,是必须要保证的。

现在就只剩下一致性 C 和可用性 A 可以选择了:要么选择一致性,保证数据正确;要么选择可用性,保证服务可用。

那么 CP 和 AP 的含义是什么呢?

  • 选择了一致性 C :一定会读到最新的数据,不会读到旧数据,但如果因为消息丢失、延迟过高发生了网络分区,那么这个时候,当集群节点接收到来自客户端的读请求时,为了不破坏一致性,可能会因为无法响应最新数据,而返回出错信息。
  • 选择了可用性 A :系统将始终处理客户端的查询,返回特定信息,如果发生了网络分区,一些节点将无法返回最新的特定信息,它们将返回自己当前的相对新的信息。

CAP 适用场景

  • CA:典型的应用是 Etcd,Consul 和 Hbase,zookeeper
  • AP:Cassandra 和 DynamoDB,服务注册中心

可以看一下运用 CAP 理论分析 redis cluster Redis cluster是AP架构还是CP架构,这一篇文章。每个系统不能绝对地看说是 AP 还是 CP,每个系统里面的子系统或者模块会根据场景去区分,可能一个系统里面会同时出现 APCP 架构。


资料来源

本文档主要基于极客时间分布式协议与算法实战

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

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

相关文章

linux 线程详解

前言 程序运行在内存空间中叫进程,进程中包含有若干线程,线程是系统调度和执行的基本单位。线程才是程序运行的实体,通常程序里的main()函数就相当于主线程,把进程理解成一个容器,里面可以包含有若干线程和若干资源&am…

6)Mybatis启动流程

1. 首先Mybatis会加载配置文件mybatis-config.xml, 主要实现在Mybatis的builder模块,包路径org.apache.ibatis.builder,解析入口XMLConfigBuilder private void settingsElement(Properties props) {configuration.setAutoMappingBehavior(Au…

指针进阶篇(2)

进阶指针 🤔前言🤔 一、😊函数指针😊 二、😜函数指针数组😜 三 、😝指向函数指针数组的指针😝 四、🌝回调函数🌝 🍀小结🍀 &…

摩丝-题解

看到题目,怀疑是莫尔斯电码,打开发现果然是莫尔斯电码的点和划.. .-.. --- ...- . -.-- --- ..-简单说一下电报的原理最简单的电报模型就是一个电源,一个开关和一个电磁铁当需要长距离使用时候,需要用到继电器按下开关&#xff0c…

【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)

前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员&…

C#【必备技能篇】使用NPOI实现对excel的读取和写入

文章目录1、Winform界面布局2、引用NPOI的dll3、源码4、运行效果5、NPOI的dll下载地址6、补充【以上步骤只能打开.xls文件(97-2003版本),打不开.xlsx文件(2007版本)】1、Winform界面布局 2、引用NPOI的dll 3、源码 us…

(十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置

前言 本节内容我们主要介绍一下在jenkins中如何集成sonar qube代码质量检查工具,sonar qube可以在流水化项目集成部署前对我们的代码质量检查。开始本节内容前我们需要先搭建好sonar qube服务,关于sonar qube服务的搭建可参考作者往期博客内容&#xff…

P4391 [BOI2009]Radio Transmission 无线传输

题目描述 给你一个字符串 s_1s1​,它是由某个字符串 s_2s2​ 不断自我连接形成的。但是字符串 s_2s2​ 是不确定的,现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 LL,表示给出字符串的长度。 第二行给出字符串 s_1s1​ 的一个子…

【linux入门】基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell(Xshell替代品)【第二章-Linux基础命令】1.Linux目录结构2.什么…

Linux---权限

目录 1.文件访问者的分类(人/用户) 2.文件类型和访问权限(事物属性) 3.文件权限值的表示方法 a)字符表示方法 b)8进制数值表示方法 4.文件访问权限的相关设置方法 4.1 改属性 4.2 改人(改拥有者/所属组)…

数组常用方法总结 (3) :map / forEach / every / some

map 遍历数组的每一项。如果是简单数组,不改变原始数组(值类型)。如果是对象数组,原始数组可以被改变(引用类型)。遍历原始数组,返回值为原始数组的每一项,最终可组合成新数组。 简…

LeetCode 78 子集 | 解题思路分享

原题链接:78. 子集 - 力扣(LeetCode) 题目难度:中等 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任…

忆享聚焦|5G投资、网络安全市场、云计算、Web3技术……近期热点资讯一览

“忆享聚焦”栏目第11期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1. SA:全球…

ubuntu虚拟机VmWare与主机共享文件夹

一、说明: 宿主操作系统:Windows 11 64位。 客户操作系统:Ubuntu 18.04.1 64位。 虚拟机软件:VMware Workstation 17 pro 二、步骤: 1、参考教程链接1,在主机设置共享文件夹。 注意:教程链接…

聚焦技术,2022巨杉荣获国内外多家权威机构认可

作为分布式数据库的领先企业 巨杉成立十年来,一直聚焦分布式技术的自研与深耕 在分布式数据库领域已取得丰硕的成果 回望2022,巨杉除在客户案例及产品方面屡获殊荣外 也凭借过硬的技术实力及规模化的行业应用 得到多家国内外权威机构的认可 国际权威…

TensorRT学习笔记--基本概念和推理流程

目录 前言 1--Tensor RT基本概念 2--推理流程 3--实例代码 前言 以下 Tensor RT 的基本概念和推理流程均为博主自我的理解,可能部分内存会存在错误或偏差,仅供参考! 1--Tensor RT基本概念 ① Logger:日志记录器,…

ssm:spring定时任务Task和CronExpression表达式

开发一个定时任务&#xff1a;每天晚上23点执行数据归集任务 首先Spring配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.or…

Java中的常用的代理模式

本文介绍在Java种常用的3种动态代理。 代理模式是23种模式中的一种&#xff0c;属于结构型设计模式。这种模式的作用就是要创建一个中间对象&#xff08;相当于中介或者代理对象&#xff09;&#xff0c;通过操作中间对象来间接调用目的对象的方法&#xff0c;字段等&#xff0…

Everything搜索知识总结

1.只知道那个文件以 .txt结尾 .*\.txt$ ($表示以什么结尾) 2.搜索某个路径下的文件 D:\ configure.bat (搜索D盘下的该文件,注意要用这种类型的"\",和被搜索的文件之间有空格;要先打出路径,再打出搜索文件.) 3.搜索指定路径下的多个文件 路径\ 文件1 | …

Halcon亚像素边缘缺陷检测案例

一、下面的案例是总结的Halcon边缘缺陷检测的一种情况。本案例是利用阈值分割获取金属区域&#xff0c;并利用boundary和edges_sub_pix获取到亚像素边缘。然后综合利用fit_rectangle2_contour_xld拟合出金属对应的放射矩形&#xff0c;最后利用dist_rectangle2_contour_points_…