分布式之CAP理论分析

news2024/11/25 16:50:33

写在前面

任何存在的事物都有其内在的特性,分布式也不例外,那么分布式都有什么特性呢?国外有大牛就帮我们总结了如下的三点:

C:Consitency,一致性
A:Available,可用性
P:Partition tolerance,分区容错

CA和都很清晰,这里的P分区容错中的分区指的是网络分区,即正常同一个局域网的环境,因为某些网络问题变为不同的局域网的情况(简单理解就是网络互通变为网络不通)。接下来我们就分别看下吧!

1:CAP指的是什么

分别来看下CAP指的是什么。

1.1:C

首先看下C,C的全称是Consistency,其所表达的含义是,承诺对于客户端的请求,要么返回最新的数据,要么是返回错误(不会没有响应,也不会响应老数据)。比如数据X的初始值是1,如下图:

在这里插入图片描述

然后客户端1访问节点1更新X为2,在节点1更新完毕后直接返回更新成功消息给客户端1(后续异步更新X=2到到节点2),如下图:

在这里插入图片描述

在X=2还没有同步到节点2时,客户端2获取X的值,此时其获取到的就是1,如下图:

在这里插入图片描述

可以看到此时获取到的X=1并不是最新的X的值2,因此不满足承诺对于客户端的请求,要么返回最新的数据,要么是返回错误的描述,所以此时是不满足一致性的,那么如何满足一致性呢?只需要客户端1更新X=2时的值同步更新到节点2,这样,在返回写入成功消息给客户端1之前所有节点都拥有最新的X值了,自然客户端2再来通过节点2读取X值时,肯定能够读取到最新值了,这个同步更新过程如下图:

在这里插入图片描述

其实,C一致性强调的是读取到的数据的正确性,在一些对数据正确性要求记为严格的场景中,是必须要满足C的,比如银行等金融业务,毕竟钱是不能开玩笑的!

1.2:A

A是可用性,其描述的是,系统给客户端这样的保证,无论分布式集群出现什么样的内部故障,如部分节点宕机,部分节点网络不可达(效果等同于宕机),都保证能够正常的对外提供服务,注意这的正常对外提供服务是正常服务,而非返回错误。对应到实际的场景中就是,在有客户端读取数据时直接返回自己所能获取的最新数据版本(一般就是本地的数据了)

注意A强调的是正常服务,即不能返回错误给客户端,而P强调的集群正常工作,即还具备响应请求的能力,但响应的到底是正常的数据还是错误信息就不一定了。

1.3:P

P,分区容错,在分布式系统发生网络分区(如节点无法访问)时,保证分布式系统本身还是能够正常工作的,即能够正常处理客户端的请求(这里的处理,可能是正常返回数据也可能是返回错误)

注意P强调的集群正常工作,即还具备响应请求的能力,但响应的到底是正常的数据还是错误信息就不一定了,而A强调的是正常服务,即不能返回错误给客户端。

2:CAP不能三角

CAP不能三角,即CAP不可能同步满足,如下图:

在这里插入图片描述

这个是业界大佬在自己实践基础上已经验证过了,我们可以当做准则来看,即记住即可。首先分布式系统工作在网络环境中,而网络环境本身是不可靠的,所以肯定会出现分区容错的情况,而如果因为出现分区容错就导致分布式系统无法正常工作,这显然是不行的,所以当我们在设计一个分布式系统的时候,P一定是要满足的,而剩下的C和A到底该如何选择就需要根据具体的业务来决定了,如果是你的系统要求必须读取到正确数据,那就选择C,此时系统就是CA的,即当出现节点故障时,会返回错误给客户端。如果你的系统允许在一定程度上读取到旧数据,但要求服务正常,那就选择A,此时系统就是AP的,即当有节点故障时,返回老数据给客户端。

3:具体实践

InfluxDB是一个存储时间序列数据的开源数据库,官方开源了其单机版本,但并未开源其分布式版本,并且分布式版本还是收费的,且价格不菲,老板为了节省这笔开支,让你来负责实现一个InfluxDB的分布式版本,你该怎么做呢?要做的第一件事就是为其确定分区容错模型,即使用CAP中的AP还是CP。

InfluxDB的架构如下图:

在这里插入图片描述

分别是DATA组件和META组件,二者的作用如下:

DATA组件:负责数据存储
META组件:负责元数据信息存储,如库,表信息等

因为DATA组件和META组件存储内容不同,即业务场景不同,所以我们需要分开来分析其适合的分区容错容错模型,首先一个分布式系统一定要满足P,这个在前面已经分析过了,接下来分别看下二者对于AC的选择吧!

DATA组件:其负责数据存储,且访问量大,要具备横向扩展能力,我们可以允许访问到旧数据,但是不允许出现服务不可用的情况,因此选择A,即最终是AP模型
META组件:其存储元数据,数据非常关键,不能出现访问到旧数据的情况,如用户新建了DB,用户要在该DB新建表的话,必须能够读取到该DB的信息,因此要求强一致性,且因为仅仅存储元数据,访问压力不会特别大,因此不要求具备特别强的横向扩展能力,所以选择C,即最终是CP模型

写在后面

小结

本文一起看了对于分布式系统特性总结的CAP理论,即一致性,可用性,分区容错。然后给出了一个CAP在具体业务实践中落地的例子。希望本文能够帮助到你!

参考文章列表

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

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

相关文章

细讲一个 TCP 连接能发多少个 HTTP 请求(二)

第三个问题:一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)? HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两…

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故,究其根源,事故本身属于架构或者需求层面需要规避的问题,测试人员的责任其实是非常小的,但实际情况是:相关测试人员因此承担了很大的压力,成为质量问题的“背锅侠”。 实际上&#…

极验2代验证码分析

目标链接 aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA接口分析 点击搜索就会跳出验证码,netWebServlet.json 的请求,会返回 challenge 和 gt 接着可以看响应请求图片信息的接口,可以看到请求参数包含cha…

iOS 组件化或SDK时对资源加载注意点

本文针对cocoapods进行打包的资源做个讲解,针对自身项目注意调整资源访问策略。 资源文件打包方式 使用pod lib create AppResourceModule 来进行演示。 use_frameworks! target AppResourceModule_Example dopod AppResourceModule, :path > ../ end podfil…

Python+Flask+MySQL开发的在线外卖订餐系统(附源码)

文章目录一、项目模块及功能介绍1、登录模块2、注册模块3、商家用户模块4、买家用户模块5、系统管理员模块源码二、项目结构三、环境依赖四、运行方法五、系统部分界面展示1、首页2、注册界面3、登录界面4、商家主界面5、商家菜单界面6、商家添加菜品界面7、商家修改菜品界面8、…

数值程序分析

原文来自微信公众号“编程语言Lab”:数值程序分析 搜索关注“编程语言Lab”公众号(HW-PLLab)获取编程语言更多技术内容! 欢迎加入编程语言社区 SIG-程序分析,了解更多程序分析相关的技术内容。 加入方式:添…

实现自动化部署前端项目,从安装Jenkins到部署完成的整体配置 --适合初学Jenkins、想实现或者学习自动化部署的同学,知识点比较全面,过程写的清晰

前言 一、什么是Jenkins 二、Jenkins安装配置 Linux环境安装JDK Linux环境安装Maven Linux安装Jenkins 启动Jenkins jenkins配置 配置汉化版的jenkins 安装gitHub插件 gitHub配置 jenkins的配置 jenkins的gitHub配置 jenkins的java环境配置 小总结 两种情况 第…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具,该工具是一款GUI工具,可以帮助广大研究人员通过ETW(Event Tracing for Windows)扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图,该…

谋变2023:家电巨头进击的“三大关口”

2022年的中国家电行业,无疑在艰难中前行。奥维云网(AVC)推总数据显示,2022年中国家电市场(不含3C)零售额为7081亿元,同比下滑7.4%。下滑背后的推力是多样的,包括地产市场下行、消费者…

服务端返回内容跨域CORS之后,也在chrome/edge浏览器里显示出响应信息

由于浏览器的同源策略,服务端返回的内容跨域,且没有允许跨域CORS的请求头之后,浏览器无法显示出服务端返回的信息,不方便问题排查。比如:Access to XMLHttpRequest at http://localhost:6001/service-app/query/common…

springcloud-工程创建(IDEA)

文章目录介绍springcloud 常用组件1.创建父工程2.删除父工程的src目录3.修改父工程的pom文件4 springcloud 版本依赖5.创建子模块6 子项目下创建启动类介绍 Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为开发中的配置管理、服务发现、断路器、智…

最全面的内网open虚拟专用网络通道搭建过程

内网open虚拟专用网络通道搭建过程 文章目录内网open虚拟专用网络通道搭建过程前言一、环境准备二、安装open虚拟专用通道2.1、安装依赖包2.2、开始安装三、证书配置3.1、easy-rsa配置修改3.2、初始化与创建CA根证书3.3、生成服务端证书3.4、生成客户端证书3.5、创建服务端配置…

SpringCloud微服务~面试题

1. SpringCloud常见组件有哪些? 问题说明:这个题目主要考察对SpringCloud的组件基本了解 难易程度:简单 参考话术: SpringCloud包含的组件很多,有很多功能是重复的。其中最常用组件包括: 注册中心组件&…

【冲刺金三银四】2023年网络安全工程师面试题合集

以下为信息/网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作~ 【一一帮助网络安全提升点我一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 …

市场调研计划书如何写?

想要做好一个产品,市场调研是必不可少的一步,也是第一步,那么如何进行市场调研呢?以下是我整理的一份市场调研计划书,希望能够帮助到大家!!! 一、文档版本控制 主要记录文档的版本…

Reverse_SSH:一款基于SSH的反向Shell工具

关于Reverse_SSH Reverse_SSH上一款基于SSH的反向Shell工具,在该工具的帮助下,广大研究人员可以使用SSH来实现反向Shell,并同时拥有下列功能: 1、使用原生SSH语句管理和连接反向Shell; 2、动态、本地和远程转发&#…

[python入门㊷] - python存储数据

目录 ❤ json.dump()存储数据 ❤ json.laod()读取数据 ❤ 保存和读取用户生成的数据 ❤ 重构 JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用 ❤ json.dump()存储数据…

基本TCP编程

1. 基本概念 TCP (即传输控制协议) 是一种面向连接的传输层协议,它能提供高可靠性通信 (即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。 2. 通信流程解析 TCP 通信的流程与打电话的过程相似,以下以一对情侣打电话的过程来展示TCP的通信流程: 其中服务端 …

4.4 序列化与反序列化

文章目录1.概述2.特点/应用场景3.涉及到的流对象4.代码实现序列化与反序列化4.1 步骤1:创建学生类Student24.2 步骤2:创建序列化测试类5.测试案例中常见的几种编译错误类型6.为什么反序列化版本号需要与序列化版本号一致?7.自动提示 生成UID …

10 亿月活用户下,快手基于 Dragonfly 的超大规模镜像分发实践

背景 挑战 快手容器云平台旨在为快手不断增长、不断变化和多样化的业务,提供基于容器化部署的超大规模基础设施服务。为了实现这一目标,快手工程师需要解决弹性、稳定性、效率和无服务器架构等挑战,在这些挑战中,镜像分发的稳定…