分布式相关理论详解

目录

 

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的本地缓存之间数据不一致问题。

1c06efd037594540821e26389978fc50.png

由于不同副本之间需要网络同步,所以在同一个时刻,不同的客户端访问不同的节点可能得到的数据是不一致的。

5f6a5ba4cb114843adae3e5ae3e0eb93.png

可以看出,并发场景下的一致性和分布式系统中的一致性其实都是为了解决同一个时刻多个副本之间数据一致的问题。

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] 图解一致性模型 - 哔哩哔哩

 

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

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

相关文章

跟李沐学AI:池化层

目录 二维最大池化 填充、步幅和多个通道 平均池化层 池化层总结 二维最大池化 返回滑动窗口中的最大值。 图为池化窗口形状为 22 的最大池化层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max(0,1,3,4)4。池化层与卷积层类似,不断…

职业本科专业群的生成机制研究

一、引言 随着我国经济结构的持续优化升级和职业教育体系的不断深化,职业本科教育作为连接高等教育与职业技能培养的桥梁,其专业群构建已成为提升教育质量与服务产业升级的关键。本文基于知识整合的视角,采用案例分析法,从生成决…

自定义协议(应用层协议)——网络版计算机基于TCP传输协议

应用层:自定义网络协议:序列化和反序列化,如果是TCP传输的:还要关心区分报文边界(在序列化设计的时候设计好)——粘包问题 1、首先想要使用TCP协议传输的网络,服务器和客户端都应该要创建自己…

Pytorch使用教学8-张量的科学运算

在介绍完PyTorch中的广播运算后,继续为大家介绍PyTorch的内置数学运算: 首先对内置函数有一个功能印象,知道它的存在,使用时再查具体怎么用其次,我还会介绍PyTorch科学运算的注意事项与一些实用小技巧 1 基本数学运算…

wpf中轮询显示图片

本文的需求是,在一个文件夹中,放一堆图片的集合,然后在wpf程序中,按照定时的方式,循序显示照片。 全部代码 1.声明一个PictureInfo类 namespace WpfApp1 {public class PictureInfo{public string? FileName { get; …

【网络安全学习】 SQL注入01:基础知识

💻 1. 什么是SQL注入 SQL注入是一种针对Web程序中数据库层的安全漏洞的攻击方式。它利用了程序对用户输入数据合法性的判断或过滤不严,允许攻击者在设计不良的程序中添加额外的SQL语句,从而执行计划外的命令或访问未授权的数据。攻击者可以通…

视觉SLAM第一讲

第一讲-预备知识 SLAM是什么? SLAM(Simultaneous Localization and Mapping)是同时定位与地图构建。 它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己…

Chapter 16 Python文件操作(上)

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、文件的编码二、文件的读取1.打开文件2.读取文件3.关闭文件 前言 Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能&#xff0c…

C++STL详解(五)——list类的接口详解

一.list的介绍 list容器的底层是双向循环带头链表,在CPP中,我们对双向循环带头链表进行了一定程度的封装。 如果你不了解双向链表,那么可以浏览此片博文:双向链表 二.list的定义方式以及赋值 2.1list的构造方式 在这里我们要…

idea中如何创建yml、yaml、properties配置文件

目录 1、配置文件 2、创建yml配置文件 3、配置文件的优先级 1、配置文件 我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置,那其实呢,在springboot项目当中是支持多种配置方式的,除了支持properties配置文件…

华为od机试真题:考勤信息(Python)

题目描述 公司用一个字符串来表示员工的出勤信息 absent:缺勒late: 迟到leaveearly: 早退present: 正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下: 缺勤不超过一次,没有连续的迟到/早退:任意连续7次考…

计算机二级刷题(讲+练)

【拯救者】二级C语言历届真题解析(二级期末升本均适用) 前提: 学过C语言, 想要速成可以看我的C语言课程 3套真题 赠送1套预测题(带解析)

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权,请联系删除 转自: 芯爵ChipLord 2024年07月10日 12:00 浙江 文章目录 概述DRC的概念Tessent DRC检查的概述时钟相关检查扫描相关检查BIST规则检查预DFT时钟规则检查 …

基于Vue开发的前端系统中寻找后端API及其参数

前言 在日常渗透工作中,常常遇到后台系统,且有相当一部分是自研开发的系统,没有源代码,没有弱口令漏洞,也没有swagger、webpack泄露等。幸运的是,这些系统几乎都是前后端分离的架构,而我发现使…

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度(像素变换) 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法,请参阅本专栏的其…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天,视频内容已成为信息传播的重要载体。然而,对于众多自媒体创作者和企业而言,如何高效、精准地发布视频内容,依然是一个不小的挑战。幸运的是,随着技术的不断进步,视频号矩阵系统…

0725,进程间传递文件描述符,socketpair + sendmsg/recvmsg

我要碎掉了我要碎掉了我要碎掉了 上课喵&#xff1a; pipe匿名管道的问题 #include <func.h>int main() {int fds[2];pipe(fds);pid_t pidfork();if(pid>0){ //fatherclose(fds[0]);//close readint fdopen("file2.txt",O_RDONLY);printf("father: …

Idea2024 创建Meaven项目没有src文件夹

1、直接创建 新建maven项目&#xff0c;发现没有src/main/java 直接新建文件夹&#xff1a;右击项目名->new->Directory 可以看到idea给出了快捷创建文件夹的选项&#xff0c;可以根据需要创建&#xff0c;这里点击src/main/java 回车&#xff0c;可以看到文件夹已经创建…

用户管理与高级SQL语句(数据库管理与高可用)

1.表&#xff08;Table &#xff09; 数据库中的表与我们日常生活中使用的表格类似&#xff0c;它也是由行&#xff08;Row&#xff09; 和列&#xff08;Column&#xff09;组成的。列由同类的信息组成&#xff0c;每列又称为一个字段&#xff0c;每列的标题称为字段名。行包…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…