分布式系统的概念与设计模式

概念

定义:分布式系统是指将数据和计算任务分散到多个独立的计算机上,这些计算机通过网络进行通信和协作,共同对外提供服务。分布式系统不仅提高了系统的可靠性和可扩展性,还增强了系统的并发处理能力和数据管理能力。
特点:

  • 独立性:系统中的每个节点都是独立的计算机,它们各自拥有独立的处理器、内存和存储资源。
  • 网络通信:节点之间通过网络进行通信,传递数据和指令。
  • 协同工作:节点之间通过协作完成共同的任务,实现数据的共享和一致。
  • 透明性:对于用户而言,分布式系统看起来就像一个整体,用户无需关心数据和计算任务在哪些节点上执行。

原理

1、节点与网络
节点:系统中的每个独立计算机都是一个节点,它们按照协议完成计算工作。节点可以是执行某些工作的进程或物理机器。
网络:系统的数据传输通道,用于节点之间的通信。通信具有方向性,且可能受到网络延迟、丢包等因素的影响。

2、 数据存储与一致性
分布式系统需要解决数据存储的一致性问题。由于数据分布在多个节点上,如何保证这些节点上的数据在逻辑上是一致的,是分布式系统面临的重要挑战。
一致性可以分为强一致性、弱一致性和最终一致性等多种类型。强一致性要求所有节点在同一时间看到相同的数据;弱一致性则允许数据在一段时间内存在不一致;最终一致性则要求数据在经过一段时间后达到一致。

3、并发与容错

  • 分布式系统需要处理大量的并发请求,因此必须具备良好的并发处理能力。这通常通过多线程、异步处理等技术实现。
  • 分布式系统还需要具备容错能力,以应对节点故障、网络中断等异常情况。通过冗余部署、负载均衡、故障恢复等技术,可以提高系统的可靠性和可用性。

4、CAP理论
CAP理论是分布式系统中最著名的理论之一,它指出一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

  • 一致性要求所有节点在同一时间看到相同的数据;可用性要求系统一直可用,且对每个请求都能给出响应;分区容错性则要求系统在遇到网络分区等故障时仍能继续提供服务。
  • 在实际应用中,通常需要根据具体需求在CAP之间进行权衡和取舍。例如,一些系统可能更注重一致性和可用性(如关系型数据库),而另一些系统则可能更注重可用性和分区容错性(如分布式缓存系统)。

设计模式

1、布隆过滤器
在这里插入图片描述

Bloom过滤器是一种节省空间的概率数据结构,用于测试元素是否为某集合的成员。它用于我们只需要检查元素是否属于对象的场景。
在BigTable(和Cassandra)中,任何读取操作都必须从组成Tablet的SSTable中读取。如果这些SSTable不在内存中,则读取操作可能最终会执行许多磁盘访问以便读取所需的SSTable。为了减少磁盘访问次数,BigTable 使用Bloom过滤器。

2、一致性哈希
一致的哈希允许您轻松扩展,从而允许以有效的方式复制数据,从而实现更好的可用性和容错能力。
通过对数据项的键进行哈希处理以产生其在环上的位置,然后顺时针遍历环以查找位置大于该项位置的第一个节点,将每个由键标识的数据项分配给节点。与节点关联的节点是数据项的位置。
在这里插入图片描述
一致散列的主要优点是增量稳定性;节点离开或到达集群仅影响其直接邻居,其他节点不受影响。

3、Quorum
在分布式环境中,quorum是在确认操作成功之前需要成功执行此分布式操作的最小服务器数。
在这里插入图片描述
Cassandra,为了确保数据一致性,每个写入请求都可以配置为仅当数据已写入至少一个quorum(或大多数)副本节点时才成功。
对于领导者选举,Chubby使用Paxos,它使用quorum来确保强大的一致性。
Dynamo 将写入复制到系统中其他节点的草率quorum,而不是像Paxos那样的严格多数quorum。所有读/写操作都在首选项列表中的第一个NN正常节点上执行,该节点可能并不总是在遍历一致哈希环时遇到的第一个NN节点。

4、领导者(Leader)和追随者(Follower)
为了在管理数据的系统中实现容错,需要在多个服务器上复制数据。
在集群中选择一个服务器作为领导者。领导者负责代表整个集群做出决策,并将决策传播到所有其他服务器。
三到五个节点的集群,就像在实现共识的系统中一样,领导者选举可以在数据集群本身内实施,而不依赖于任何外部系统。领导者选举在服务器启动时进行。每个服务器在启动时都会启动领导者选举,并尝试选举领导者。除非选出领导者,否则系统不接受任何客户端请求。

5、心跳
心跳机制用于检测现有领导者是否失败,以便可以启动新的领导者选举。

6、Fencing
在领导者-追随者模式中,当领导者失败时,不可能确定领导者已停止工作。例如,慢速网络或网络分区可能会触发新的领导者选举,即使前一个领导者仍在运行并认为它仍然是活动的领导者。
屏蔽是指在以前处于活动状态的领导者周围设置围栏,使其无法访问集群资源,从而停止为任何读/写请求提供服务。
使用以下两种技术:
● 资源屏蔽:系统会阻止以前处于活动状态的领导者访问执行基本任务所需的资源。
● 节点屏蔽:系统会阻止以前处于活动状态的领导者访问所有资源。执行此操作的常见方法是关闭节点电源或重置节点。

7、WAL(预写日志Write-ahead Log)
预写日志记录是解决操作系统中文件系统不一致的问题的高级解决方案。受数据库管理系统的启发,此方法首先将要执行的操作的摘要记入“日志”中,然后再将其实际写入磁盘。在发生崩溃的情况下,操作系统只需检查此日志并从中断的位置继续。

8、分段日志
将日志拆分为多个较小的文件,而不是单个大文件,以便于操作。
单个日志文件在启动时读取时可能会增长并成为性能瓶颈。较旧的日志会定期清理,并且很难对单个大文件执行清理操作。
单个日志拆分为多个段。日志文件在指定的大小限制后滚动。使用日志分段,需要有一种将逻辑日志偏移量(或日志序列号)映射到日志段文件的简单方法。

9、高水位线(High-Water mark)
跟踪领导者上的最后一个日志条目,该条目已成功复制到追随者的quorum。日志中此条目的索引称为高水位线索引。领导者仅公开到高水位线索引的数据。
Kafka:为了处理非可重复读取并确保数据一致性,Kafka broker会跟踪高水位线,这是特定分区的最大偏移量。使用者只能看到高水位线之前的消息。

10、租约(Lease)
租约就像一个锁,但即使客户端离开,它也能工作。客户端请求有限期限的租约,之后租约到期。如果客户端想要延长租约,它可以在租约到期之前续订租约。
Chubby客户端与领导者保持有时限的会话租约。在此时间间隔内,领导者保证不会单方面终止会话。

11、Gossip协议
Gossip协议是点对点通信机制,其中节点定期交换有关自己和他们所知道的其他节点的状态信息。
每个节点每秒启动一轮Gossip回合,以与另一个随机节点交换有关自己和其他节点的状态信息。
在这里插入图片描述

12、Phi 累计故障检测(Phi Accrual Failure Detection)
此算法使用历史检测信号信息使阈值自适应。通用的应计故障检测器不会判断服务器是否处于活动状态,而是输出有关服务器的可疑级别。
Cassandra使用Phi应计故障检测器算法来确定群集中节点的状态。

13、脑裂
分布式系统具有两个或多个活动领导者的场景称为脑裂。
通过使用生成时钟(Generation Clock)可以解决脑裂问题,生成时钟只是一个单调递增的数字,用于指示服务器的生成。
每次选出新领导者时,时钟数字(generation number)都会增加。这意味着,如果旧领导者的时钟数为“1”,则新领导人的时钟数将为“2”。此时钟号包含在从领导发送到其他节点的每个请求中。通过这种方式,节点现在可以通过简单地信任具有最高数字的领导者来轻松区分真正的领导者。
Kafka:为了处理脑裂(我们可以有多个active controller broker),Kafka使用“纪元数”(Epoch number),这只是一个单调增加的数字来表示服务器的代次(generation)。
HDFS:ZooKeeper用于确保任何时候只有一个NameNode处于活动状态。epoch编号作为每个事务ID的一部分进行维护,以反映NameNode的代次。

14、校验和(checksum)
在分布式系统中,在组件之间移动数据时,从节点获取的数据可能会损坏。
计算校验和并将其与数据一起存储。
要计算校验和,请使用MD5、SHA-1、SHA-256或SHA-512等加密哈希函数。哈希函数获取输入数据并生成固定长度的字符串(包含字母和数字);此字符串称为校验和。
当系统存储某些数据时,它会计算数据的校验和,并将校验和与数据一起存储。当客户端检索数据时,它会验证从服务器接收的数据是否与存储的校验和匹配。如果没有,则客户端可以选择从另一个副本检索该数据。
HDFS和Chubby将每个文件的校验和与数据一起存储。

15、CAP定理
CAP定理指出,分布式系统不可能同时提供以下所有三个理想属性:
一致性(C)、可用性(A)和分区容差(P)。
根据CAP定理,任何分布式系统都需要从三个属性中选择两个。这三个选项是CA、CP和AP。
Dynamo:在CAP定理术语中,Dynamo属于AP系统的类别,旨在牺牲强一致性为代价实现高可用性。
BigTable:就CAP定理而言,BigTable是一个CP系统,即它具有严格一致的读取和写入。

16、PACELEC定理
PACELC定理指出,在复制数据的系统中:
● 如果有一个分区(‘P’),分布式系统可以在可用性和一致性(即’A’和’C’)之间进行权衡;
● 否则(‘E’),当系统在没有分区的情况下正常运行时,系统可以在延迟(‘L’)和一致性(‘C’)之间进行权衡。
在这里插入图片描述
定理(PAC)的第一部分与CAP定理相同,ELC是扩展。整个论点假设我们通过复制来保持高可用性。因此,当失败时,CAP定理占上风。但如果没有,我们仍然必须考虑复制系统的一致性和延迟之间的权衡。

17、提示交接(Hinted Handoff)
如果节点关闭,系统会保留它们错过的所有请求的提示(或注释)。故障节点恢复后,将根据存储的提示将请求转发给它们。
当节点关闭时,领导者会在本地磁盘上的文本文件中写入提示。此提示包含数据及其所属的节点信息。当领导者意识到它为其保留提示的节点已恢复时,它会将每个提示的写入请求转发到该节点。

18、读取时修复
在分布式系统中,数据跨多个节点复制,某些节点最终可能会拥有过时的数据。
在读取操作期间修复过时的数据,因为此时,我们可以从多个节点读取数据以进行比较并找到具有过时数据的节点。此机制称为读取修复。一旦已知具有旧数据的节点,读取修复操作就会将较新版本的数据推送到具有较旧版本的节点。
Cassandra和Dynamo使用“读取修复”将最新版本的数据推送到具有旧版本的节点。

19、默克尔树(Merkle Trees)
“读取修复”可在处理读取请求时消除冲突。但是,如果某个副本明显落后于其他副本,则可能需要很长时间才能解决冲突。
副本可以包含大量数据。单纯地拆分整个范围来计算校验和进行比较并不是很可行;有太多的数据需要传输。相反,我们可以使用Merkle树来比较一个范围的副本。
Merkle树是哈希的二叉树,其中每个内部节点是其两个子节点的哈希,每个叶节点是原始数据一部分的哈希。
在这里插入图片描述

比较Merkle树在概念上很简单:
● 比较两个树的根哈希。
● 如果它们相等,请停止。
● 在左边和右边的孩子上递归检查。
为了实现反熵和在后台解决冲突,Dynamo使用Merkle树。

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

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

相关文章

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

库仑定律-库仑力-两个电荷之间静电力的计算公式

图中: q1,q2 为两个电荷r 为电荷间的距离 r ^ 1 , 2 \widehat{r}_{1,2} r 1,2​ 为从 q1 指向 q2 的单位向量 F ⃗ 1 , 2 \vec{F}_{1,2} F 1,2​ 为 q1 施加到 q2 上的静电力 公式: F ⃗ 1 , 2 q 1 q 2 K r 2 r ^ 1 , 2 \vec{F}_{1,2} \f…

七种修复错误:由于找不到msvcr110.dll 无法继续执行的方法

当你在运行某些程序时遇到“找不到msvcr110.dll”的错误提示,这通常意味着你的系统缺少了Microsoft Visual C 2012 Redistributable包中的一个重要文件。这个DLL文件是Microsoft Visual C Redistributable的一部分,用于支持许多使用Visual C编写的软件和…

Tornado 是一个 Python 异步网络库和 web 框架

Tornado 是一个 Python 异步网络库和 web 框架,它最初由 FriendFeed 开发,后来被 Facebook 收购并开源。Tornado 因其非阻塞的 I/O 操作和优秀的性能而广受欢迎,特别是在需要处理大量并发连接的应用中。Tornado 的底层实现主要依赖于 Python …

【软件测试】如何设计测试用例? 设计测试用例常用的方法.

目录 一.什么是测试用例?二.总体设计测试用例的万能公式.2.1 功能性能界面兼容易用安全2.2 弱网测试2.3 安装卸载测试. 三. 常用设计具体测试用例的方法3.1 等价类3.2 边界值3.3 正交法3.3.1 正交表3.3.2 如何设计正交表,并根据正交表编写测试用例 3.4 判定表法3.4.1 根据判定…

《Nginx核心技术》第18章:基于主从模式搭建Nginx+Keepalived双机热备环境

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

光子架与电子架 -- 光子架与电子架

电子架 指插放交叉板、OTU单板、支/线路板、保护类单板的子架。 在通用型平台子架和平台子架中如果仅插放OTU单板(非中继模式)视为电子架。光电混合的子架视为电子架。 电子架主要实现将客户侧信号转换成标准波长的光信号,供光子架调度。 光子…

p18 docker镜像原理之联合文件系统,p19 docker镜像分层的理解

镜像是什么 镜像其实就是一种轻量级的,可执行的一种软件包,用来打包基于环境开发的软件,里面可以包括代码,环境,数据库,配置文件等信息 如何得到镜像? 可以从镜像仓库下载比方说dockerhub 比…

jenkins分布式构建

Jenkins分布式构建是一种将构建任务分散到多个机器上的方法,以提高构建效率和并行处理能力 1. 架构 主节点(Master):负责管理构建任务、调度和监控所有从节点。从节点(Slave):实际执行构建任务…

JavaEE: 深入探索TCP网络编程的奇妙世界(六)

文章目录 TCP核心机制TCP核心机制九: 面向字节流TCP核心机制十: 异常处理 小小的补充(URG 和 PSH)~TCP小结TCP/UDP 对比用UDP实现可靠传输(经典面试题) 结尾 TCP核心机制 上一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(五) 书接上文~ TCP核心机制九: 面向字节流 TCP是面…

C++vector类的模拟实现

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟实现vector类 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 前置说明 1. vecto…

密集行人数据集 CrowdHumanvoc和yolo两种格式,yolo可以直接使用train val test已经划分好有yolov8训练200轮模型

密集行人数据集 CrowdHuman voc和yolo两种格式,yolo可以直接使用 train val test已经划分好 有yolov8训练200轮模型。 CrowdHuman 密集行人检测数据集 数据集描述 CrowdHuman数据集是一个专为密集行人检测设计的数据集,旨在解决行人密集场景下的检测挑…

Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式,这里记录一下,仅供参考 目录 一、主从架构 1、搭建方式 2、同步原理 3、优化策略: 4、总结: 二、哨兵架构 1、搭建哨兵集群 2、RedisTemplate如何使用哨兵模式 三、分片集群架构 1&#…

SkyWalking 环境搭建部署

架构简介 skywalking agent : 和业务系统绑定在一起,负责收集各种监控数据skywalking oapservice : 是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapserv…

19_Python中的上下文管理器

Python中的上下文管理器 在Python中,上下文管理器(Context Manager)是一种用于资源管理的技术,它可以确保资源在使用后被正确释放,例如文件、网络连接或锁。 上下文管理器(Context Manager)是…

计算机毕业设计 | SSM 凌云招聘平台 求职问答审批系统(附源码)

1,绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火,可有人提问,这么火的语言它的底层又是什么语言编写的呢? python是C语言编写的,它有很多包也是用C语言写的。 所以说,C语言还是很…

中间件:maxwell、canal

文章目录 1、底层原理:基于mysql的bin log日志实现的:把自己伪装成slave2、bin log 日志有三种模式:2.1、statement模式:2.2、row模式:2.3、mixed模式: 3、maxwell只支持 row 模式:4、maxwell介…

全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口

1.创建user文件夹 作为增删改查的根包 路径 src/main/java/com.example.demo/user 2.文件夹里文件作用介绍 1.User(实体类) package com.example.demo.user; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; impo…