七种分布式系统的解决方案,一次性讲给你听!

news2024/9/28 15:28:12
V-xin:ruyuan0330 获得600+页原创精品文章汇总PDF

目录

  • TB级数据放在一台机器上:难啊!
  • 到底啥是分布式存储?
  • 那啥又是分布式存储系统呢?
  • 天哪!某台机器宕机了咋办?
  • Master节点如何感知到数据副本消失?
  • 如何复制副本保持足够副本数量
  • 删除多余副本又该怎么做呢?
  • 全文总结

这篇文章,我们将用非常浅显易懂的语言,跟大家聊聊大规模分布式系统的容错架构设计。

虽然定位是有“分布式”、“容错架构”等看起来略显复杂的字眼,但是咱们还是按照老规矩:大白话 + 手绘数张彩图,逐步递进,让每个同学都能看懂这种复杂架构的设计思想。


1、TB级数据放在一台机器上:难啊!

咱们就用分布式存储系统举例,来聊一下容错架构的设计。

首先,我们来瞧瞧,到底啥是分布式存储系统呢?

其实特别的简单,咱们就用数据库里的一张表来举例。

比如你手头有个数据库,数据库里有一张特别大的表,里面有几十亿,甚至上百亿的数据。

更进一步说,假设这一张表的数据量多达几十个TB,甚至上百个TB,这时你觉得咋样?

当然是内心感到恐慌和无助了,因为如果你用MySQL之类的数据库,单台数据库服务器上的磁盘可能都不够放这一张表的数据!

咱们就来看看下面的这张图,来感受一下。

在这里插入图片描述

2、到底啥是分布式存储?

所以,假如你手头有一个超大的数据集,几百TB!那你还是别考虑传统的数据库技术来存放了。

因为用一台数据库服务器可能根本都放不下,所以我们考虑一下分布式存储技术?对了!这才是解决这个问题的办法。

咱们完全可以搞多台机器嘛!比如搞20台机器,每台机器上就放1/20的数据。

举个例子,比如总共20TB的数据,在每台机器上只要把1TB就可以了,1TB应该还好吧?每台机器都可以轻松加愉快的放下这么多数据了。

所以说,把一个超大的数据集拆分成多片,给放到多台机器上去,这就是所谓的分布式存储

咱们再看看下面的图。

在这里插入图片描述

3、那么啥又是分布式存储系统呢?

那分布式存储系统是啥呢?

分布式存储系统,当然就是负责把一个超大数据集拆分成多块,然后放到多台机器上来存储,接着统一管理这些分散在多台机器上存储的数据的一套系统。

比如说经典的hadoop就是这类系统,然后fastdfs也是类似的。

如果你可以脑洞打开,从思想本质共通的层面出发,那你会发现,其实类似elasticsearch、redis cluster等等系统,他本质都是如此。

这些都是基于分布式的系统架构,把超大数据拆分成多片给你存放在多台机器上。

咱们这篇文章是从分布式系统架构层面出发,不拘泥于任何一种技术,所以姑且可以设定:这套分布式存储系统,有两种进程。

一个进程是Master节点,就在一台机器上,负责统一管控分散在多台机器上的数据。

另外一批进程叫做Slave节点,每台机器上都有一个Slave节点,负责管理那台机器上的数据,跟Master节点进行通信。

咱们看看下面的图,通过图再来直观的看看上面的描述。

在这里插入图片描述

4、天哪!某台机器宕机了咋办?

这个时候又有一个问题了,那么万一上面那20台机器上,其中1台机器宕机了咋整呢?

这就尴尬了,兄弟,这会导致本来完整的一份20TB的数据,最后有19TB还在了,有1TB的数据就搞丢了,因为那台机器宕机了啊。

所以说你当然不能允许这种情况的发生,这个时候就必须做一个数据副本的策略。

比如说,我们完全可以给每一台机器上的那1TB的数据做2个副本的冗余,放在别的机器上,然后呢,万一说某一台机器宕机,没事啊,因为其他机器上还有他的副本。

我们来看看这种多副本冗余的架构设计图。

在这里插入图片描述

上面那个图里的浅蓝色的“1TB数据01”,代表的是20TB数据集中的第一个1TB数据分片。

图中可以看到,他就有3个副本,分别在三台机器中都有浅蓝色的方块,代表了他的三个副本。

这样的话,一份数据就有了3个副本了。其他的数据也是类似。

这个时候我们假设有一台机器宕机了,比如下面这台机器宕机,必然会导致“1TB数据01”这个数据分片的其中一个数据副本丢失。如下图所示:

在这里插入图片描述

那这个时候要紧吗?不要紧,因为“1TB数据01”这个数据分片,他还有另外2个副本在存活的两台机器上呢!

所以如果有人要读取数据,完全可以从另外两台机器上随便挑一个副本来读取就可以了,数据不会丢的,不要紧张,大兄弟。


5、Master节点如何感知到数据副本消失?

现在有一个问题,比如说有个兄弟要读取“1TB数据01”这个数据分片,那么他就会找Master节点,说:

“你能不能告诉我“1TB数据01”这个数据分片人在哪里啊?在哪台机器上啊?我需要读他啊!”

我们来看看下面的图。

在这里插入图片描述

那么这个时候,Master节点就需要从“1TB数据01”的3个副本里选择一个出来,告诉人家说:

“兄弟,在哪台哪台机器上,有1个副本,你可以去那台机器上读“1TB数据01”的一个副本就ok了。”

但是现在的问题是,Master节点此时还不知道“1TB数据01”的副本3已经丢失了,那万一Master节点还是通知人家去读取一个已经丢失的副本3,肯定是不可以的。

所以,我们怎么才能让Master节点知道副本3已经丢失了呢?

其实也很简单,每台机器上负责管理数据的Slave节点,都每隔几秒(比如说1秒)给Master节点发送一个心跳。

那么,一旦Master节点发现一段时间(比如说30秒内)没收到某个Slave节点发送过来的心跳,此时就会认为这个Slave节点所在机器宕机了,那台机器上的数据副本都丢失了,然后Master节点就不会告诉别人去读那个丢失的数据副本。

大家看看下面的图,一旦Slave节点宕机,Master节点收不到心跳,就会认为那台机器上的副本3就已经丢失了,此时绝对不会让别人去读那台宕机机器上的副本3。

在这里插入图片描述

那么此时,Master节点就可以通知人家去读“1TB数据01”的副本1或者副本2,哪个都行,因为那两个副本其实还是在的。

举个例子,比如可以通知客户端去读副本1,此时客户端就可以找那台机器上的Slave节点说要读取那个副本1。

整个过程如下图所示。

在这里插入图片描述


6、复制副本保持足够副本数量

这个时候又有另外一个问题,那就是“1TB数据01”这个数据分片此时只有副本1和副本2这两个副本了,这就不足够3个副本啊。

因为我们预设的是每个数据分片都得有3个副本的。大家想想,此时如何给这个数据分片增加1个副本呢?

很简单,Master节点一旦感知到某台机器宕机,就能感知到某个数据分片的副本数量不足了。

此时,就会生成一个副本复制的任务,挑选另外一台机器来从有副本的机器去复制一个副本。

比如看下面的图,可以挑选第四台机器从第二台机器去复制一个副本。

在这里插入图片描述

但是,现在这个复制任务是有了,我们怎么让机器4知道呢?

其实也很简单,机器4不是每秒都会发送一次心跳么?当机器4发送心跳过去的时候,Master节点就通过心跳响应把这个复制任务下发给机器4,让机器4从机器2复制一个副本好了。

同样,我们来一张图,看看这个过程:

在这里插入图片描述

看上图,现在机器4上是不是又多了一个“1TB数据01”的副本3 ?那么“1TB数据01”这个数据分片是不是又变成3个副本了?


7、删除多余副本

那反过来,如果说此时机器3突然恢复了,他上面也有一个“1TB数据01”的副本3,相当于此时“1TB数据01”就有4个副本了,副本不就多余了吗?

没关系,一旦Master节点感知到机器3复活,会发现副本数量过多,此时会生成一个删除副本任务。

他会在机器3发送心跳的时候,下发一个删除副本的指令,让机器3删除自己本地多余的副本就可以了。这样,就可以保持副本数量只有3个。

一样的,大家来看看下面的图。

在这里插入图片描述


8、全文总结

好了,到这里,通过超级大白话的讲解,还有十多张图的渐进式演进说明,相信大家以前即使不了解分布式系统,都绝对能理解一个分布式系统的完整的数据容错架构是如何设计的了。

实际上,这种数据分片存储 、多副本冗余、宕机感知、自动副本迁移、多余副本删除,这套机制,对于hadoop、elasticsearch等很多系统来说,都是类似的。

所以笔者在这里强烈建议大家,一定好好吸收一下这种分布式系统、中间件系统底层数据容错架构的思想。

这样,以后学习类似的一些技术的时候,对他们的原理、思想都会感到一种似曾相识的感觉。

V-xin:ruyuan0330 获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

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

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

相关文章

nps内网穿透

nps服务端: linux, 公网ip npc客户端: windows, 内网 文件提取 链接:https://pan.baidu.com/s/1HgujpVoXpLxQ-IgAnI2Izg 提取码:8hyl nps安装 1.上传压缩包到服务器, 解压 2.修改conf文件夹下nps.conf文件 #HTTP(S) proxy port, no startup if em…

vue3 antd项目实战——Form表单使用【v-model数据的双向绑定,form表单嵌套input输入框、Radio单选框】

vue3 ant design vue项目实战——单选框(Radio)的使用以及Form表单的双向绑定知识调用(form表单的源代码附在文章最后)场景复现实现需求form表单整体架构的搭建input输入框文本域的嵌套单选组合Radio的嵌套button按钮组合的嵌套fo…

JVM 面试题

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

C语言:预处理(1)

程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境: 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第二种是执行环境,它用于实际执行代码。 翻译环境: 组成一个程序的每个…

MySQL 数据库练习题记录01

文章目录前言一、数据库练习题一1.1 表结构1.2 查询所有学生的信息(学号,姓名,性别,班级名称)1.3 查询所有人(包括没有成绩的学生)的课程分数(学号,姓名,性别,班级名称,语文分数,数学…

改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块

YOLOv5引入密集连接卷积网络DenseNet思想 CVPR 2017最佳论文 D e n s e N e t DenseNet DenseNet 论文地址:h

SpringBoot快速入门篇

💟💟前言 ​ 友友们大家好,我是你们的小王同学😗😗 今天给大家打来的是 SpringBoot快速入门篇 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞👍 收藏⭐ 评论📄 小王的主页…

手写 mini 版 Webpack

目录 1. mini 版 Webpack 打包流程 2. 创建 minipack.js 2.1 需要用到的插件库 2.1.1 babylon —— 解析 JavaScript 语法,生产 AST 语法树 2.1.2 babel-traverse —— 对 AST 进行遍历、转换的工具 2.1.3 transformFromAst —— 将 ES6、ES7 等高级的语法&am…

[Verilog]有限状态机设计举例

有限状态机设计举例 摘要:有限状态机(FSM)是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元和时序。 本实验介绍了两种类型的FSM(Mealy和Moore)的概念,以及开发此类状态机的…

Codeforces Round #837 (Div. 2)

A. Hossam and Combinatorics 题目链接:Problem - A - Codeforces 样例输入: 2 5 6 2 3 8 1 6 7 2 8 3 2 10样例输出: 2 4题意:给定一个有n个元素的数组,然后让我们求出有多少对(i,j)满足|a[i]-a[j]|max|a[p]-q[q]…

Hudi学习01 -- Hudi简介及编译安装

文章目录Hudi简介Hudi概述Hudi特性Hudi使用场景Hudi编译安装安装Maven编译hudi修改pom文件修改源码兼容hadoop3解决spark模块依赖的问题hudi编译命令Hudi简介 Hudi概述 Apache Hudi (Hadoop Upserts Delete and Incremental) 是下一代流数据湖平台。Apache Hudi 将核心仓库和…

并发编程中用到的几种常见锁

没有加锁而造成的数据竞争 任务&#xff1a;使用10个线程&#xff0c;同时对一个count加100000&#xff1b;最后我们期望的结果是100000&#xff1b; 实验代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <ti…

git项目 拉项目 提交 上传 保姆级教程

git 项目拉取提交 下载git https://git-scm.com/ 拉取代码 打开需要存代码的位置 右键 git bash打开git客户端 输入命令 git clone [复制的地址]上传代码 修改代码 方法一&#xff1a;命令行 打开对应的文件夹&#xff0c;右键打开git bash 拉取最新代码&#xff08;选…

React学习07-React扩展知识

setState setState更新状态的2种写法: setState(stateChange, [callback])------对象式的setState stateChange为状态改变对象(该对象可以体现出状态的更改)callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用 setState(updater, [callback])-…

代码随想录算法训练营第九天(字符串)| 28. 实现 strStr(),459.重复的子字符串

代码随想录算法训练营第九天&#xff08;字符串&#xff09;| 28. 实现 strStr()&#xff0c;459.重复的子字符串 28. 实现 strStr() 因为KMP算法很难&#xff0c;大家别奢求 一次就把kmp全理解了&#xff0c;大家刚学KMP一定会有各种各样的疑问&#xff0c;先留着&#xff0…

Qt编写雷达模拟仿真工具2-自定义QGraphicsItem按钮

一、前言 雷达模拟仿真工具&#xff0c;整体结构采用的QGraphicsView框架&#xff0c;场景需要设计一个可点击的自定义按钮出来&#xff0c;在QGraphicsView中一切基础元素点都是基于QGraphicsItem&#xff0c;在QGraphicsItem类中我们可以看到它不继承自QObject&#xff0c;那…

25万美金奖励章鱼加速器2022冬季获胜团队!

全长 1427 字&#xff0c;预计阅读 6 分钟 作者&#xff1a;MiX 2022年12月21日&#xff0c;章鱼加速器2022年冬季 Web3 创业营圆满落幕&#xff0c;61个入营项目中有5个脱颖而出&#xff0c;获得「章鱼未来之星」称号&#xff0c;排名不分先后&#xff0c;他们分别是&#xf…

第五章. 可视化数据分析图表—Seaborn图表(折线图,直方图,条形图,散点图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库&#xff0c;偏向于统计图表&#xff0c;主要针对的是数据挖掘和机器学习中的变量特征选取&#xff0c;相比Matplotlib&#xff0c;他的语法相对简单&#xff0c;但是具有一定的局限性…

Windows下安装oracle19c

oracle 19c 不支持 Windows 7 和 Windows 8 以及 Windows Server 2008&#xff08;GetOverlappedResultEx function 函数不支持 win7&#xff09;&#xff0c;支持 Windows 8.1 以上及 Windows Server 2012 1.下载地址&#xff1a; https://www.oracle.com/database/technolo…

Gnoppix Linux 22.12 发布

导读基于 Kali Linux 的 Linux 滚动发行版 Gnoppix 22.12 带来了 GNOME 43、Linux 内核 6.0 和新的升级。作为传统的现场 CD 发行版 Knoppix 项目的继承者&#xff0c;Gnoppix Linux 是专门为渗透测试和反向工程而设计的。它为网页应用安全和数字权利保护进行了优化。除了对安全…