分布式相关理论详解
目录
1.绪论
2.什么是分布式系统,和集群的区别
3.CAP理论
3.1 什么是CAP理论
3.2 一致性
3.2.1 计算机的一致性说明
1.事务中的一致性
2.并发场景下的一致性
3.分布式场景下的一致性
3.2.2 一致性分类
3.2.3 强一致性
1.线性一致性
a) 定义
a) Raft算法是如何实现线性一致性的
2.顺序一致性
a)顺序一致性的定义
b) 顺序一致性和线性一致性的区别
c) zookeeper是如何实现顺序一致性的
3.2.4 弱一致性
3.2.5 最终一致性
3.3 可用性
3.4 分区容忍性
3.5 CAP组合
4.Base理论
4.1 Base理论的定义
4.1.1基本可用
4.1.2 软状态
4.1.3 最终一致性
5.拜占庭将军问题
6.引用
1.绪论
本文主要介绍的分布是系统中的一些常见的理论知识,比如CAP理论,BASE理论,拜占庭将军问题等。
2.什么是分布式系统,和集群的区别
分布式系统就是将整个系统根据业务拆分多个微服务,服务之间通过Rpc进行通信。
集群是将多个相同应用部署到不同的集群模式上,本质上是为了提高吞吐量已经保证高可用性。
3.CAP理论
3.1 什么是CAP理论
CAP理论是分布式系统的理论基础,即一个分布式系统最多满足CAP这三项中的两项。即只能满足一致性(Consistance)、可用性(Aviablity)、分区容忍性(Partition tolerance)中的两项。
3.2 一致性
在CAP理论中,一致性指的是,每次读取到的数据一定是当前最新的数据,否者报错。可以看出一致性其实指的是强一致性。
3.2.1 计算机的一致性说明
在计算机中机中有很多地方都会出现一致性这个概念,我们也经常将他们混淆一谈,这里将根据我的经验,来说明不同的一致性表达的含义。
1.事务中的一致性
事务有4个性质,分别是ACID,原子性,一致性,隔离性,持久性。什么是一致性呢?我认为这里的一致性是事务的操作逻辑应该客观事实一致。比如,张三向李四转账50元,张三卡中减少50,李四增加50,钱的总数是不变的。如果张三卡中减少50,而李四卡中余额未变,相当于钱的总数增加50,这是不符合客观事实的。
2.并发场景下的一致性
在并发场景下,由于资源的共享,导致锁竞争,所以可能出现每次请求到结果是不一样的问题,这样就会出现一致性问题。
3.分布式场景下的一致性
分布式场景下的一致性其实是并发场景下的一致性的演变。我们可以想象,分布式场景下,由于有副本的概念,可能因为同步时延问题,或者其他问题,导致不同的副本之间数据是不完全一致的,所以访问不同的节点,会有不同的结果,这也会有一致性问题。
那为什么说这个一致性是并发场景下一致性的演变呢?在JMM里面我们讲到过为什么会有一致性问题,主要原因是java的缓存采用二级缓存的方式,线程A读取本地缓存前,可能线程B更新数据到了共享缓存中,但是线程A读取到的还是老数据。所以这里一致性本质上是解决线程A、B、C的本地缓存之间数据不一致问题。
由于不同副本之间需要网络同步,所以在同一个时刻,不同的客户端访问不同的节点可能得到的数据是不一致的。
可以看出,并发场景下的一致性和分布式系统中的一致性其实都是为了解决同一个时刻多个副本之间数据一致的问题。
3.2.2 一致性分类
我们这里主要介绍的是分布式场景下的一致性问题,这里一致性主要分为强一致性,弱一致性和最终一致性。
3.2.3 强一致性
1.线性一致性
a) 定义
线性一致性是要求最高的一种一致性,他要求无论从哪个副本读取数据,一定读到的是当前整个集群里面最新的数据。其实在并发的一致性中,我们可以常用加悲观锁的方式,使得整个程序像是在单线程中执行一样。
像Paxos、Raft等共识算法其实就实现了线性一致性。
a) Raft算法是如何实现线性一致性的
在讲Raft算法是如何实现一致性之前,我们先来大概了解一下Raft算法接受写请求的原理,其实就是通过二阶段提交来保证数据的一致性。Raft算法详细介绍可以看深度解析RocketMq源码-高可用存储组件(一) raft协议详解
1.主节点接收写请求
2.主节点向所有的从节点发送预写请求
3.从节点返回ack给主节点
4.当主节点收到超过半数的从节点返回ack过后,将数据commit并且应用到状态机中。
5.向所有的从节点发送commit请求,从节点将数据应用到状态机中。
注:这里状态机是什么,Raft算法是一个共识算法,目的是为了让所有节点达成共识,也即可以将客户端接收的数据写入到磁盘中,而写入磁盘这个动作其实就是交给状态机来实现的。状态机其实就是应用Raft算法达到共识过后的逻辑处理。
我们知道,Raft算法的写请求只能交给主节点处理,我们如果要保证线性一致性的话,可以在有写请求到达的时候,将全部节点加锁,此时所有节点不能处理任何请求,当主节点接收请求并且应用到状态机中过后,同时将数据同步给所有的节点都成功(不只是半数以上节点成功)才给客户端返回成功,并且释放锁。这样,后面所有的读请求无论访问哪个节点,数据一定是一样的。但是这样性能太低,所以Raft算法是如何实现的呢?
1.写写顺序性:写请求只能交给主节点处理,并且Raft算法是交给主线程来处理写请求的,这样其实就保证了写写的顺序性。
2.写读顺序性:当读请求来的时候。如果访问的是主节点,主节点首先会判断当的lastApplyIndex和lastCommitIndex是否相等,如果不相等便等待。这里lastApplyIndex表示的是最后的应用状态机的index,lastCommitIndex表示的是最后达成共识的index,因为主节点可能在达成共识过后,就给客户端返回成功,但是还没有将数据应用到状态机,如果此时有读请求到达主节点,会返回老数据;如果访问的的是从节点,从节点首先会发送一个请求获取lastCommitIndex的请求到达主节点,只有当前从节点的lastApplyIndex和主节点的lastCommitIndex相等,才能返回数据,此时一定返回的是最新的数据。
2.顺序一致性
a)顺序一致性的定义
顺序一致性主要满足两点:
1.对于单个线程来说,它的所有操作一定是保证顺序性的;
2.对于多个线程的写操作,需要需要按照时间排列。即所有线程的写操作是放到一个队列中,先到达的写先被读取。
b) 顺序一致性和线性一致性的区别
对于写写的关系,顺序一致性和线性一致性都要求全局有序;对于写读操作,线性一致性要求全局写读有序,但是顺序一致性只要求本线程类写读有序。比如客户端A更新了集群的数据,客户端B来读取数据,如果是线性一致性,一定能够读取到客户端A更新的数据。如果是顺序一致性,客户端B可能读取老数据,但是在过一定的时间后,一定能够读取到A更新的数据。
c) zookeeper是如何实现顺序一致性的
zookeeper是采用自己的zab协议来实现顺序一致性的。就我的理解,zab中的顺序一致性其实只实现了写写的顺序性,没有实现单个客户端之间写读的顺序性。我们来看看zab是如何实现写写的一致性的。
1.和Raft协议一样,zab也是一个单主节点共识算法,所以他会通过选举得到一个主节点,来接收写请求。
2.如果写请求到达的时候,会给每个日志维护一个全局递增的zxid,并且采用二阶段提交的方式将数据同步给从节点。
3.当超过半数以上的节点返回同步成功(ack)响应的时候,主节点会将数据应用到状态机中,并且给从节点发送应用请求。
4.从节点应用数据到状态机。
可以看出zab协议和raft协议的最本质的区别就是否实现线性一致性读(保证写读的顺序性),这也是线性一致性和顺序一致性最本质的区别。
3.2.4 弱一致性
弱一致性包括因果一致性,会话一致性等子模型,并不常见,这里不再过多叙述。
3.2.5 最终一致性
最终一致性不关心的请求执行的先后顺序,只关心结果正确的就行。比如有A->B->C三个写请求,最终一致性要求无论你先执行A还是B或者C,只要结果正确,便满足最终一致性。而顺序一致性要求执行结果一定是按照请求到达顺序执行的,这也是最终一种性和顺序一致性的区别。
3.3 可用性
在CAP理论中,可用性指的是,每次读取到的数据一定要返回数据,可以是旧数据。
3.4 分区容忍性
分区容忍性就是当某个网络节点宕机或者丢包的情况下,依然能够向外提供服务。
3.5 CAP组合
cap理论中,c和a其实是天然矛盾的两个性质,所以在分布式系统中是不能够共存的。对于单点系统,其实是保证ca两个性质;而对于zookeeper这种,保证的是cp两个性质; 对于redis其实保证的是ap两个性质。
4.Base理论
4.1 Base理论的定义
base理论主要由基本可用、软状态、最终一致性三个性质组成.
4.1.1基本可用
基本可用指的是服务在某些情况下,比如流量突增等情况下,可以对某些边缘服务进行降级,只保证核心服务可用即可。
4.1.2 软状态
软状态指的是运行系统存在中间状态,比如下下单支付两个微服务,下单成功过后不需要立刻进行支付并支付成功,存在一个中间状态-支付中,这个状态就是软状态。在支付中这个状态中,如果我们扣款失败,可以进行重试,直到扣款成功。
4.1.3 最终一致性
最终一致性在前面已经讲过,其实就是不关心中间状态,只需要保证最后的结果达成一致性即可。
5.拜占庭将军问题
拜占庭将军问题描述的是,拜占庭的一队军队需要攻打一个城市,攻打成功需要不同的将军进行系统决策,但是有些将军可能是叛徒,他们可能发出虚假的信息干扰决策,如何让每个将军在不知道哪些将军是叛徒的情况下做出决策。
常见的解决方式就是就是采用少数服从多数的原则,每个将军会对一个指令进行投票,只要超过半数的将军的投票通过,该协议便被达成共识。只要叛徒数不超过一半,那一定能做出正确的决定。
这个解决方案在Raft协议,zab协议中都会用到,Raft协议和zab协议本质上是为了选举出拥有最新日志的节点成为主节点,这就是将军们的决议。所以在选举的时候,只要超过半数节点同意某个节点成为主节点(选举的规则就是备选举节点拥有比超过半数的节点新的日志),该节点便会升为leader。为了保证叛徒节点不超过半数,Raft协议或者zab协议在同步日志的时候,二阶段提交的时候,要求半数以上节点同步成功日志,才会返回成功,保证了整个集群至少有半数的节点拥有最新日志。
6.引用
[1] 深度剖析zookeeper原理
[2] 手写SOFA-JRAFT:实现线性一致读功能
[3] 分布式系统一致性模型:线性一致性和顺序一致性_线性一致性 顺序一致性-CSDN博客
[4] 图解一致性模型 - 哔哩哔哩
相关文章:

分布式相关理论详解
目录 1.绪论 2.什么是分布式系统,和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…...

Linux基础知识之Shell命令行及终端中的快捷键
1.察看历史命令快捷键 按键 操作 ctrl p 返回上一次输入命令字符 ctrl n 返回下一次输入命令字符 ctrl r 输入单词甚至词组搜索匹配历史命令 alt p 输入字符查找与字符相接近的历史命令 alt . 向之前执行的命令的最后一个参数轮循, 并将之添加到当前光标之后…...

研究生选择学习Android开发的利与弊?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!产品经理可以学学Axure快…...

怎么评价程序员40岁了竟然还在撸代码?
怎么评价外卖员40岁了竟然还在送外卖? 怎么评价滴滴司机40岁了竟然还在跑滴滴? 怎么评价老师40岁了竟然还在教书?难道程序员的本职工作不是敲代码吗?无论你是管理层还是螺丝钉,工业环境下怎么可能一行代码都不敲呢&…...

SQL优化(一)基础概念
基数(cardinality) 表中某个列的唯一键的数量叫做基数,主键列的基数就是表中数据的总行数。 可以用select count(distinct 列名) from 表名来计算基数。 基数的高低影像列的数据分布。 例如:先用Scott账户创建一个测试表test …...

【C++高阶】哈希:全面剖析与深度学习
目录 🚀 前言一: 🔥 unordered系列关联式容器1.1 unordered_map1.2 unordered_set 二: 🔥 哈希的底层结构 ⭐ 2.1 哈希概念⭐ 2.2 哈希冲突⭐ 2.3 哈希函数⭐ 2.4 哈希冲突解决2.4.1 🌄闭散列2.4.2 &#x…...

PHP西陆招聘求职系统小程序源码
🔥【职场新宠】西陆招聘求职系统,你的职场加速器🚀 🎉【开篇安利:一站式求职新体验】🎉 还在为找工作焦头烂额吗?是时候告别传统招聘网站的繁琐与低效了!今天给大家种草一个超赞的…...

系统移植(十一)根文件系统(未整理)
文章目录 一、根文件系统中各个目录文件功能解析:二、对busybox进行配置和编译(一)执行make help命令获取make的帮助信息(二)对busybox源码进行配置,配置交叉编译器(三)执行make men…...
mac中docker常用命令总结
在Mac中,Docker的常用命令可以总结如下表格: 命令用途docker run运行一个新的容器实例。可以指定镜像名来启动容器,并支持多种参数来调整容器的运行方式。docker ps列出当前正在运行的容器。可以通过添加-a参数来列出所有容器(包…...

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程) 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#x…...
Linux 4: Bash
1 Bash环境 1 命令执行的顺序 1 绝对路径、相对路径 2 alias 3 内置的builtin 4 $PATH找到的第一个命令 2 bash的登录信息,保存在哪里? 保存在/etc/issue. 3 bash的环境配置文件 1 如果是login shell,读以下,有优先级:如果…...

第十四天学习笔记2024.7.25
Git安装 1.安装git 2.创建git仓库 3.创建文件并且提交文件 (git add . 将文件提交到缓存)(git commit -m 说明)(git log 查看历史) 4.分支创建与解决分支冲突问题 创建主机(git 192.1…...

花几千上万学习Java,真没必要!(三十七)
IO 流: 读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。 写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存…...
SSA-GRU(自适应平滑自回归门控循环单元)预测模型及其Python和MATLAB实现
SSA-GRU(自适应平滑自回归门控循环单元)预测模型是结合了SSA(Singular Spectrum Analysis,奇异谱分析)和GRU(Gated Recurrent Unit,门控循环单元)模型的一种时间序列预测方法。以下是…...

【ROS】让你的回调函数并行起来
【前言】 众所周知,ROS中的所有回调函数,都由 ros::spin() 这个家伙来统一管理和唤醒。这里说的是所有通过ROS方式创建出来的回调函数,比如ros::Subscriber、ros::Timer等等的回调函数。 【举例】 我们先来看一个示例节点: #i…...

M12电连接器的编码分类及应用领域分析
12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型,每种编码都有其特定的应用场景和功能: A编码:适用于传感器、直流电、1G以太网。 B编码:主要用于PROFIBUS总线系统。 C编码:适用于交流电。 D编码&#x…...

基于YOLOv8的道路裂缝坑洼检测系统
基于YOLOv8的道路裂缝坑洼检测系统 (价格88) 包含 【“裂缝”,“凹坑”】 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov8的权重文件,运用在其他检测系…...

蓝鹏测径仪非标定制订制流程
测径仪通常属于非标定制设备,非标定制意味着这些设备不是按照标准规格批量生产的,而是根据特定的客户需求和应用场景设计和制造的。例如,某些测径仪可能需要特殊的测量范围、精度、传感器或软件来满足特定的工业检测要求。 测径仪非标定制的…...

vue基础3
1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…...

LINUX -exec函数族
1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...