【青训营】分布式理论初探

news2024/12/24 21:12:52

本文内容总结自 字节跳动青年训练营 第五届后端组

分布式理论初探

一、概述

分布式系统是计算机程序的集合,这些程序利用横跨多个独立计算节点的计算资源实现共同目标,可分为分布式计算、分布式存储、分布式数据库。

其优势是:去中心化、低成本、弹性、资源共享、可靠性高

但是也有挑战:

  1. 普遍的结点故障
  2. 不可靠的网络
  3. 异构的机器与硬件环境
  4. 安全

常见分布式系统
image.png

二、系统模型

2.1 故障类型

故障类型可以通过正确性、时间、状态三个维度去分析

  • Byzantine failure:结点可以任意篡改发送给其他节点的数据,是一种正确性故障
  • Authentication detectable byzantine failure: Byzantine failure的特例,节点可以篡改数据,但是不可以伪造其他节点的数据
  • Performance failure: 结点未在指定时间段内收到数据,也就是时间过早或过晚,会影响性能或者直接不可用
  • Omission failure: 节点收到数据时间无限晚,也就是无法接收数据,是一种时间故障
  • Crash failure: 在Omission failure上,增加了结点停止响应的假设,也就是持续Omission failure,比如说宕机。这属于时间故障,同时故障状态不可知
  • Fail-stop failure: 在Crash failure的基础上增加了错误可检测的假设

工作中的故障以及可能对应的类型
image.png

2.2 拜占庭将军问题

拜占庭将军问题如下:
有两个将军从东面和西面包围了一座城池,他们需要派出信使商定明天早上什么时候一同进攻,但是派出的信使有一定概率在经过城池的时候被抓走。那么就有两种方法:
方法一:同时发出n个信使,任何一个到达对方军队均为成功,但是依然存在n个信使全部被抓的可能性
方法二:效仿TCP链接,设置一个超时时间,发送后没有在一定时间内返回,则增派信使

然而两种方法都无法保证双方一定达成共识。具体为何我不太说得明白,可以去查询一些其他资料

拜占庭将军Plus
上述的拜占庭将军问题是最原始的问题,下面的拜占庭将军Plus更适合用于解释分布式系统下的情况。有3个将军a,b,c投票决定是进攻还是撤退,但是其中将军b是叛徒,他和a说他要进攻,和b说他要撤退。如果此时a的意愿是进攻,而b的意愿是撤退,那么在a的视角下,有2票进攻和一票撤退,那么他会发起进攻;在b的视角下,有2票撤退,一票进攻,则b会撤退,这种情况下他们会被逐个击破。

但是如果再增加一个将军,也就是有a.b.c.d四个将军,一个叛徒,那么无论谁是叛徒,都不会影响最终的投票结果,可以自己写一写看一看。

这种情况下很类似于分布式系统中有节点发生故障,向不同的其他节点发送不一致的信息的情况,这会导致分布式系统故障。而运用数学可以证明,当有3m+1个将军,m个叛徒的时候,可以增加m轮协商,最终达成一致

拜占庭将军问题较难解决,只能增加纠错信息、加密来改善

2.3 共识和一致性

一致性

当客户端a读到x=0,客户端c正在写入x=1的时候,客户端a和b可能读取到0或者1,但是当c写入完成后,a和b读取到的x的数据是一致的,这被称为最终一致性

当客户端a读到更新版本的x=1之后,及时将消息同步给其他客户端,这样其他客户端可以立刻知道x=1,这样的一致性为线性一致性。为了实现线性一致性,多个节点之间那就必须进行协商,这会增加延迟,降低系统性能,但是可以获得更高的一致性

并发和事件顺序

如果a和b是相同节点上的两个时间,a在b之前发生,则定义为 a → b a\to b ab。如果a和b是没有先后次序之分的,也就是 a ↛ b a \nrightarrow b ab并且 b ↛ a b \nrightarrow a ba,则称a和b是并发的,此处并发和操作系统中的定义不一样

image.png

三、理论基础

3.1 CAP理论

image.png

在分布式系统中,CAP不能完全同时实现一致性、可用性和分区容错性

CA:放弃分区容错性,加强一致性和可用性,就是传统的单机数据库,不进行分布式部署

AP:放弃一致性(指的是强一致性)。追求分区容错和可用性,能有较高的性能,例如一些注重用户体验的系统

CP:放弃可用性,追求一致性和分区容错性,比如和钱财安全相关的系统

比如在网络分区的情况下(也就是在选择了分区容错性的情况下),只能再可用性和一致性中二选一,比如有两个节点P1和P2共享变量x=0,P1执行x=1的操作,并试着将x=1同步到P2中,但是若此时长时间同步失败,那么有两种策略:

  • 选择可用性:

image.png

结点P1和P2继续向后执行,但是P1中x=1,P2中x=0,失去了数据一致性

  • 选择一致性

image.png
同步失败使得P2直接拒绝服务了,此时为了保证数据一致性,系统中只有1个结点可用了,丧失了可用性

3.2 ACID理论

事务是数据库中非常重要的概念,是数据库管理系统执行过程的逻辑单元,事务有ACID四个特性,

Atomicity:原子性

事务中的操作要么全部执行要么全部不执行

Consistency:一致性

事务执行的结果必须是使得数据库从一个一致性状态变到另一个一致性状态,也就是说一个事务执行前和执行后都需要处于一致性状态。事务的执行必须是一气呵成的。可见一致性和原子性密切相关

Isolation:隔离性

一个事务的执行不能被其他事务所干扰,就是一个事务的内部操作及其使用的数据对其他并发事务时隔离的。

Durability:持续性 一个事务一旦提交,对数据库中数据的改变应该是永久性的

ACID实现了一致性和可用性

3.3 BASE理论

BASE理论是对CAP中一致性和可用性的权衡,其来源于对大型互联网分布式实践的总结,主要可以用于对一致性要求没有那么高,需要兼顾一致性和可用性的场景。其核心思想是

Basically Available(基本可用):若系统出现了不可预知的故障,但还能使用,那么它的性能会降低,可能部分功能不可用,但不会轻易崩溃

Soft State(软状态):允许系统中的数据存在中间状态,也就是允许系统在多个不同节点的数据副本存在不一致的数据时延

Eventually Consistent(最终一致性):虽然数据有撞见状态,数据最终一定是一致的

四、分布式事务

4.1 二阶段提交

二阶段提交是基于分布式系统架构下的所有结点在进行事务提交时保持一致性而设计的一种演算法

在二阶段提交的分布式系统中,有协调者(Coordiator)节点和参与者(Participants)结点,其中协调者负责协调所有参与者的事务提交的一致性。搜右节点都采用预写式日志,并且日志被写入后立刻被保存在可靠的存储设备上。

二阶段提交的两个阶段分别是Perpare阶段和Commit阶段
image.png

假设A要向B转账1万块,那么协调者向A发送准备扣款1万的Prepare,向B发送准备入账1万的请求,此时完成了Prepare阶段,但转账动作尚未完成。在Commit阶段,协调者向A和B发送Commit,然后A和B完成各自的动作并且返回Ack,完成了转账操作。在一切顺利的时候似乎二段式并没有什么特殊的作用,但是考虑以下的情景:

1)Coordinator不宕机,但是Participant B宕机
A要向B转账1万块,在Prepare阶段,此时A已经做好了扣款准备,但是B直接宕机了,并没有做好收款准备,此时则协调者发出回滚指令,回滚到最初状态

image.png

2)Coordinator宕机,但是Participant不宕机
需要更换另一个Coordinator节点,新的Coordinator没有各个Participant的状态信息,因此需要逐个询问获取信息后,再做决策

3)Coordinator和Participant都宕机
无法确认状态,需要数据库管理员介入,防止系统出现数据不一致

在单机时代,实际上只需要直接一个操作就可以完成A向B转账,但是在分布式上则无法这样做。

4.2 三阶段提交

三阶段提交将两阶段提交的Prepare拆分成了CanCommit和PreCommit两个部分。其执行流程如下

image.png

这解决了两个问题:
1.阻塞问题
2.单点故障问题

另外引入超时机制,在DoCommit等待超时之后,会继续进行事务的提交。在二阶段提交中,如果最后的Ack发送失败,会回滚整个事务,这样的开销是非常大的。而三阶段提交的DoCommit如果超时,那还是会继续提交,而不进行开销较大的回滚操作,如果出现了数据错误,后面再回滚

4.3 MVCC

image.png

锁对性能是有一定的影响的,是一种牺牲可用性换数据一致性的操作。

五、公司协议

QuorumNWR模型

N表示在分布式系统中有几份备份数据

W表示一次成功更新操作至少有几份数据写入成功

R表示一次成功读数据操作要求至少有R份数据成功读取

为了保证强一致性,需要保证W+R>N
该模型CAP选择交给用户,是一种简化的一致性模型

RAFT协议

这是一种分布式一致性算法,也就是即便出现部分节点故障、网络时延等情况,也不影响各个节点,进而提高系统的整体可用性。这是使用较为广泛的协议。其中有三种角色:

Leader:通常是一主多从的,Leader负责处理所有的客户端请求,并且向Follower同步请求日志,当日志同步到大多数节点上之后,通知Follower提交日志

Follower:跟随者,不会发送任何请求,接受并且持久化Leader的同步日志。当Leader出现故障的时候,主动推荐自己成为Candidate

Candidate:Leader选举过程中的临时角色,向其他节点发送请求投票信息,如果获得多数选票则晋升为Leader

下面是三个角色之间的状态机转换图

image.png
想要看懂这幅图还需要了解以下概念:

  • Log:节点之间同步的信息,解决了数据被覆盖的问题
  • Term 任期号:单调递增,一个Term中只能有一个Leader
  • Committed: 日志被复制到多数派节点,就可以认为已经被提交

刚开始都大家都是Follower,如果到了选举期则转化为Candidate,然后进行选举,选出一个Leader,其他的Candidate变回Follower,如果任期到了或者Leader宕机,那么Leader变回Follower,然后重新选举

由于Leader的数据一定是最新数据,因此需要读数据只需要读取Leader的数据,而不需要像Quorum那样读取数份e’m

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

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

相关文章

ESP32设备驱动-TEA5767收音机模块驱动

TEA5767收音机模块驱动 1、TEA5767介绍 TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76—108MHZ自动数字调谐。 该收音机完全无需调整,高灵敏度,高稳定性,低噪音,收音模块。只需要最少的小型低…

Win10安装MySQL、Pycharm连接Mysql、Pycharm中运行django

目录 一、windows系统mysql相关操作 1、检查当前系统是否已安装mysql 1. 按win r 键(调出运行窗口) 2. 输入service.msc,点击[ 确定 】 3.打开服务列表 - 检查是否有mysql服务 2、windows安装mysql 1.下载mysql 2. 解压 mysql 到自己…

【面试题:三个线程轮流打印A ,B,C】

面试题:三个线程轮流打印A ,B,C面试介绍说明思考方案代码实现Print 打印基类APrint 打印字符A 线程CPrint 打印字符C 线程PrintConstant 常量类StrRun 启动类测试结果总结面试介绍说明 当时是2022 年3月 在深圳面试的一家公司。由于疫情比较…

内网渗透(三)之基础知识-域环境的介绍和优点

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 域介绍 域的介绍 Windows域是计算机网络的一种形式&#…

DMTet 阅读笔记

介绍 主页 https://nv-tlabs.github.io/DMTet/论文pdf https://nv-tlabs.github.io/DMTet/assets/dmtet.pdf视频汇报 https://slideslive.com/38967642/deep-marching-tetrahedra-a-hybrid-representation-for-highresolution-3d-shape-synthesis?refhomepage疑似代码 在nvdi…

【手写 Promise 源码】第十八篇 - EventLoop 简介

theme: fancy 一,前言 近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾; 在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习…

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…

HTTP协议(1)

1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的,但是当下的互…

实战动态代理

代理模式介绍代理模式有点像老大和小弟,也有点像分销商。主要解决的是问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用到过的组件中,它们都提供给你一种非常简…

【CVPR 2018】PU-Net: Point Cloud Upsampling Network

文章目录PU-Net: Point Cloud Upsampling Network网络架构训练数据生成点特征嵌入Feature ExpansionCfoordinate Reconstruction端到端训练Joint Loss FunctionPU-Net: Point Cloud Upsampling Network 网络架构 PU-Net有四个组件:patch extraction, point feature…

「自定义类型」C语言中的构造数据类型如结构,联合,枚举

​​​​​​​🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀目录 🐰结构 🏡 前言 🌸数据类型的定义 &…