一个例子让你彻底弄懂分布式系统的CAP理论

news2024/11/22 1:15:41

1 推荐的文章

下面这篇知乎文章是我见过的最简单易懂的一篇,把CAP定义以及为什么AP和CP只能二选一以及场景特定下选AP还是CP作为系统目标等讲解明明白白
谈谈分布式系统的CAP

2 个人对上面这篇文章的的一些补充

可用性可以人为设置一个阈值,比如用户体验很差,响应时间过长,比如系统宕机算作是不可用

可用性指“Reads and writes always succeed”,即服务在正常响应时间内一直可用。
好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。

其实证明可用性和一致性不能同时在分布式系统满足主要看请求阻塞和非阻塞情况下系统的表现和带来的问题,一般阻塞请求会满足一致性,但是会违背可用性,不阻塞请求则相反。而阻塞和非阻塞二者不可得兼,所以可用性和一致性也不能得兼,得证

这篇知乎贴主给我举了一个为什么不能同时实现AP和CP的例子,我做一些补充:

1 一个分布式系统也可以是主从架构部署的,假设N1和N2分别是主从mysql数据库,N1是主结点,N2是N1的从结点,N1可负责读写,N2只负责读,这时操作M同步的可能是主结点N1刚刚写入磁盘的数据,如果N1,N2结点之间的网络坏了,无法正常通信,但是用户的读请求量大的时候,会被负载均衡到N1和N2,从N1读取的数据是最新的数据,但是如果用户想要读取N2结点的这个刚刚更新的数据时候,会有两种情况,
(1)一是如果要保证数据的一致性,用户请求需要等待N1和N2之间的网络通信恢复,这可能会超时等待(可能无法在指定的时间内正常响应),这就导致可用性无法得到保证
(2)二是如果要保证可用性,那么不等N1和N2之间的网络通信恢复,N2直接将旧有的数据返回给用户,这样一致性无法得到保证。
下面这个图中的分布式网络大概对应这种情况
在这里插入图片描述

这个案例和redis的主从架构的数据同步导致的一致性问题非常相似,redis主从架构是保证了AP但不保证CP的,至于证明可以参考以下链接的1.2:从分布式理论到如何做一个生产级别的分布式锁
但是1.2还缺少一个证明,为什么redis主从架构可以容忍主结点宕机后的数据不一致(Consistency)
答:快+高可用+数据丢失一部分可以接受,为什么可以丢失一部分数据呢?因为最终的数据持久化到了mysql中,redis仅仅是内容的副本,即使数据丢了也可以在mysql中得真实数据。

2 一个分布式系统,可以是主-主架构的,N1和N2都可以读写,其过程和1没有什么太大的区别

3 一个分布式系统,可以是我们的后端微服务系统,假设每一个微服务可以部署在一台独立的服务器上,服务P部署在N1上,Q部署在N2上,现在要调用服务P,但是服务P要调用服务Q,但是突然服务Q某所有实例宕机了,这个时候,如果一定要等待该服务正常上线或者被替换才会做出响应(阻塞),那么满足一致性但会让用户请求等待过长时间,如果不阻塞,服务P在服务Q规定时间内没有做出响应的时候会返回一个默认值给用户(比如说请求失败,商品购买失败),那么就不满足一致性,但是保证了可用性这个例子说明了快速响应是可用性的一个重要指标,尽管这个响应可能不正确!

4 一个分布式系统,可以是redis与mysql组成的系统,redis用作缓存,mysql用作持久化存储,两者涉及到数据一致性问题,商品信息需要放到redis中用作缓存,比如现在我需要修改mysql数据库中的某一件商品,假设我们目前采取先更新数据库再删除缓存的同步策略,即先往mysql中更新数据,再删除掉redis缓存,那么在更新mysql数据库到删除掉redis缓存成功的这段时间,允许请求继续查询redis该更改过的商品信息,获得的是旧数据,这就违背了一致性原则,但是如果我现在要求这个分布式系统必须百分百保证一致性,那么所有的读该商品信息的请求是不是就得在更新数据库到删除缓存这段时间被阻塞住,如果请求量过大,阻塞队列过长,那么请求的响应时间过长(超出正常的限定值),这个时候就违背了可用性原则,以上阻塞用户请求读取redis缓存直到数据完全一致则会违背可用性问题,而不阻塞的话,会违背一致性问题,这就是经典的可用性和一致性不能同时在分布式系统满足的经典案例。

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

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

相关文章

openPOWERLINK源码(最新)在stm32单片机上的移植指南

最近着了powerlink的道,连续几晚十二点前没睡过觉。不得不说兴趣这东西劲太大了,让人睡不着。喜欢上研究POWERLINK,最新版的源码结构挺清晰的,移植并测试了嵌入式linux作为从站和电脑主站之间的通信,挺有趣的。接下来想…

路由器配置方法(固定地址)

前言 由于学校给分配了IP地址,因此我们的路由器接入的时候不能选择自动接入方式,而要选择固定地址方式。 step 1 我们首先先将路由器接上网线,这里注意一定要接wan口 因为路由器分为两个口,wan口是入口,lan口是出口…

第十二届蓝桥杯青少组国赛Python真题,包含答案

第十二届蓝桥杯青少组国赛Python真题 一、选择题 第 1 题 单选题 设sHi LanQiao,运行以下哪个选项代码可以输出“LanQiao”子串 () 答案:A 第 2 题 单选题 已知a-2021.0529,运行以下哪个选项代码可以输出“2021.05”() 答案:…

2023.05.12 C高级 day4

有m1.txt m2.txt m3.txt m4.txt,分别创建出对应的目录,m1 m2 m3 m4 并把文件移动到对应的目录下 #!/bin/bash for i in 1 2 3 4 dotouch m$i.txtmkdir m$imv m$i.txt ./m$i/m$i.txt done 运行结果 2. 使用break关键字打印九九乘法表,提示&am…

【2023/05/12】Z3

Hello!大家好,我是霜淮子,2023倒计时第7天。 Share Listen,my heart,to the whispers of the world with which it makes love to you. 译文: 静静的听,我的心呀,听那世界的低语,这是它对你求…

黑客必备工具:Hydra的完整安装和使用指南

安装Hydra 1.安装必要的依赖库 在终端中执行以下命令,安装Hydra所需的依赖库: sudo apt-get install build-essential checkinstall libssl-dev libssh-dev libidn11-dev libpcre3-dev libgtk2.0-dev libmysqlclient-dev libpq-dev libsvn-dev firebi…

经典HTML前端面试题总结

经典HTML前端面试题总结 1. 1简述一下你对 HTML 语义化的理解?.1.2 标签上 title 与 alt 属性的区别是什么?1.3 iframe的优缺点?1.4 href 与 src?1.5 HTML、XHTML、XML有什么区别1.6 知道img的srcset的作用是什么?1.7 …

代码随想录算法训练营第五十九天

代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水 503.下一个更大元素II42. 接雨水复杂单调栈整合单调栈 503.下一个更大元素II 题目链接:下一个更大元素II 因为可以循环,直接拼一个nums在nums后面就行了。 class Solutio…

[OGeek2019]babyrop

小白垃圾笔记不建议阅读。。。。 这道题额………………做了好几天。。 更离谱的是还把ubuntu16给玩坏了。 师傅说kali可以打通,气得我连夜下卡里 后来发现不是版本的问题,是我的脚本的问题。libc写的不对。 先分析这道题。 32位程序。没有canary&…

串口与wifi模块

经过以下学习,我们掌握: AT指令与wifi模块的测试方法:通过CH340直接测试,研究各种AT指令下wifi模块的响应信息形式。编程,使用串口中断接收wifi模块对AT指令的响应信息以及透传数据,通过判断提高指令执行的…

C语言函数大全-- w 开头的函数(1)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcscat 1.1 函数说明 函数声明函数功能wchar_t * wcscat(wchar_t *dest, const wchar_t *src);用于将一个宽字符字符串追加到另一个宽字符字符串的末尾 参数: dest : 目标字符串src &#xf…

29.Mybatis—多表操作与注解开发

目录 一、Mybatis学习。 (1)MyBatis的多表操作。 (1.1)一对一查询。 (1.2)一对多查询。 (1.3)多对多查询。 (1.4)三种查询知识小结。 一、Mybatis学习。…

算法修炼之练气篇——练气十二层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

从零开始学习Vue3:掌握前端开发的核心技能——更新中

这里写目录标题 一、了解ts1、ts是js的超集 二、掌握ts基本写法1、数据类型2、对象使用3、类4、多态5、类修饰符6、存储器7、抽象类 一、了解ts 1、ts是js的超集 即你可以在ts中使用原生js语法:JavaScript 更多功能 TypeScript** js是弱类型语言,而t…

ESP32设备驱动-LIS3DSH加速度传感器驱动

LIS3DSH加速度传感器驱动 文章目录 LIS3DSH加速度传感器驱动1、LIS3DH介绍2、硬件准备3、软件准备4、驱动实现1、LIS3DH介绍 LIS3DSH 是一款超低功耗高性能三轴线性加速度计,属于“纳米”系列,具有嵌入式状态机,可通过编程实现自主应用。 LIS3DSH 具有 2g/4g/6g/8g/16g 的动…

八、Consul注册中心

目录 1、到官网下载Consul https://www.consul.io/ 2、解压下载好的压缩包 3、配置系统环境变量 4、WINR启动cmd窗口,输入consul启动命令 5、启动完成后访问Consul页面 http://localhost:8500(8500为Consul默认端口号) 6、server-mem…

〖Python网络爬虫实战㉔〗- Ajax数据爬取之Ajax 分析案例

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

Git安装及使用

Git简介 Git是什么 Git是目前世界上最先进的分布式版本控制系统(Version Control System)。 Git的功能 Git安装 Git官网:https://git-scm.com/ 打开安装程序后,一直点击下一步,直到以下位置: 这里选择第一项,即…

Spring基础且核心的两大概念——IoC 与 DI

什么是Spring? Spring 全称 Spring Framework,它是一个目前市场上最流行、结构最庞大的开源框架,之所以如此,是因为其有独特且全面的应用场景,这样好的生态才使企业一直对青睐。 注意这句话:Spring 是包含了…

Vector - 常用CAN工具 - CANoe软件安装常见问题

目录 一、确认电脑系统盘是否满足要求,CANoe软件对PC要求如下: 二、确认软件安装包完整 三、确认软件与电脑系统之间的兼容性 四、关闭后台程序 五、安装软件 六、清空临时文件夹 七、尝试在其他电脑上安装 一、确认电脑系统盘是否满足要求&#…