面试官让我讲讲分布式系统容错架构,结果。。。

2023-11-19

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

目录

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

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

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


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:ruyuanhadeng获得600+页原创精品文章汇总PDF

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

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试官让我讲讲分布式系统容错架构,结果。。。 的相关文章

  • Java:提取具有多个子目录的zip文件[重复]

    这个问题在这里已经有答案了 我有一个 zip Meow zip 它有多个文件和文件夹 如下所示 Meow zip 文件 txt 程序 exe Folder 资源 xml AnotherFolder OtherStuff 更多资源 xml 我
  • Spring - 是否可以获取所有使用@ComponentScan注册的包?

    是否可以获取使用 ComponentScan 注册的所有包的列表 我需要知道 我的 Spring Boot 应用程序中已经注册了哪些 root 包 可能的解决方案 在运行时扫描Java注释 https stackoverflow com q
  • 当 SwingWorker 在后台工作时,对话框没有响应

    基本上我得到了一个以 main 方法作为入口点的 JFrame 在这个主要方法中 程序必须下载一些图像 为了通知用户程序将随时启动 我想显示一个简单的对话框 如果我将对话框设置为模式 我必须在启动程序后关闭它才能触发下载 如果我将其设置为非
  • 让线程休眠的更好方法

    我一直在编写有关 Java 8 中 2D 图形的教程 当时 NetBeans 给了我一个提示 Thread Sleep会影响性能 然而 尽管我已经找到了几种更好的方法 但我还没有找到一种方法来包含它们而不弄乱代码 package platf
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • 删除最低位

    给定一个二进制数 删除最低位的最快方法是什么 01001001010 gt 01001001000 它将在代码中用于迭代变量的位 伪代码如下 while bits 0 index getIndexOfLowestOrderBit bits
  • 如何将 JTextField 添加到 JFrame 的菜单栏?

    我一直在尝试重载 JMenu 并放入一些自定义代码来支持 JTextField 但进展并不顺利 我在这里的主要目的是在菜单项的右侧添加一个搜索字段 因此 我在左侧有 文件 编辑 帮助 之类的东西 然后在右侧是搜索栏 几乎就像某些浏览器中的谷
  • 将两个表视图绑定在一起,以便它们同步滚动

    我想将两个表视图绑定在一起 以便它们同步滚动 我怎么做 我无法找到如何访问表格视图的滚动条 我做了一个CSS hack来将Tableview与外部滚动条绑定 一个滚动条控制两个表格视图 我的想法的概述 创建两个表视图 制作一个垂直滚动条 在
  • @Entity 实体无法解析为类型

    学习 Spring MVC 和 Hibernate import javax persistence Column import javax persistence GeneratedValue import javax persisten
  • Xstream:删除类属性

    我该如何删除类 某事 Xstream 中的属性 我使用带注释的 Xstream 我读了它的代码 发现你的类不是mapper defaultImplementationOf fieldType 它会为你添加默认的类属性 除非类属性名称为nul
  • Java ArrayList,在一行中获取多种类型(int、String 等)的用户输入

    我正在努力提高 Java 水平 我遇到的一个问题是获取用户输入 所有这些都在一行中 如下所示 System out println Please input numbers that you would like to work with
  • Struts 2 - 使用 CKEditor 拦截上传的图像文件

    我有一个CKEditor在网站的不同页面上 所以我将上传内容设置为true以及让它工作的所有配置内容 并且图像上传工作得很好 Send it to the Server 标签 但从这里我想拦截或互动upload函数能够将图像上传到文件夹中
  • 无法初始化类 io.confluence.kafka.schemaregistry.client.rest.RestService

    我正在尝试使用 KafkaAvroSerialzer 设置一个卡夫卡生产者以获得价值 当 rit 尝试创建生产者时 我遇到了这个错误 我正在使用 confluence 5 2 1 中提供的所有罐子 java lang NoClassDefF
  • 使用当前日期时间的 RecyclerView 的动态节标题

    我将使用 RecyclerView 作为节标题 我想在 SQLite 数据库中插入每个日期和时间数据时创建节标题 我按照以下链接获取了此解决方案 但没有成功 请参考下图 对于上面的图像数据 使用以下代码或部分是静态的 List
  • @Where 子句在 hibernate join 查询中不起作用

    我有 2 个带有 Where 注释的实体 第一个是类别 Where clause DELETED 0 public class Category extends AbstractEntity 且有如下关系 OneToMany fetch F
  • 从自定义类导入时,XMLBeans jar 无法签名

    在 NetBeans 中 我创建了一个 Exporter 类 该类使用 APACHE POI 将一些数据导出到 EXCEL 文件 而 APACHE POI 使用 XMLBeans 我通过下载 zip 二进制文件并手动添加 jar 来添加 A
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • JJWT依赖混乱

    我继承了一个java项目 在POM xml中有这个
  • 使用 HttpClient 在 java 中进行连接池 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 HttpClient 创建连接池 我必须频繁连接到同一台服务器 值得创建这样一个池吗 是否可以保持 HTTP 连接处于活动状
  • 为什么浮点数有符号零?

    为什么双打有 0也 0 其背景和意义是什么 0 通常 被视为0 当一个negative浮点数非常接近零 可以考虑0 要明确的是 我指的是算术下溢 http en wikipedia org wiki Arithmetic underflow

随机推荐

  • 注意力机制的分类

    目录 1 什么是注意力机制 2 注意力机制分类 3 代表算法 1 空间域代表算法 2 通道域代表算法 3 混合域代表算法 DANet CBAM 4 注意力机制的应用 1 什么是注意力机制 注意力机制通俗的讲就是把注意力集中放在重要的点上 而
  • linux内核驱动开发笔试题

    linux内核驱动开发笔试题 一 一些常规中举的C考题 第一题 写出下述程序结果 int m 3 1 4 7 2 5 8 3 6 9 int i j k 2 for i 0 i lt 3 i printf d m k i 问题所在 本题考点
  • redis默认过期时间:redis默认的是永不过期

    今天同事问我redis默认过期时间是多久 突然想起几年前想查一下redis默认过期时间是多久 搜到的博文全是打着 redis默认过期时间是多久 的标题在讲redis过期原理 正好闲来没事 又搜了下 几年过去了 还是一样 哪来那么多文不对题的
  • StackExchange.redis 实现模糊匹配批量查询

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net Helloantoherday article details 81286685 如果
  • 一、C++中queue和deque的区别

    1 先明白队尾和队首 back和front的联系 无论从哪个方向看 插入的地方就是队尾 所有的操作名字都与back有联系 插入端的另一端就是队首 所有的操作名字都与front有联系 其中queue的操作是 queue
  • jdbc连接mysql数据库,设置字符集编码

    jdbc连接mysql数据库 设置字符集编码 1 第一种方法 JDBC连接数据库时常会出现乱码的情况 那是因为我们的字符级与数据库的字符级不一样 我们通过定义url地址的时候定义字符级 sql代表你的数据库名称 所以当这种情况遇到乱码的时候
  • 交叉编译arm Linux环境下的android-tools-adb

    前言 项目使用Rockchip的3399挖掘机demo板 使用官方提供的Debian Linux SDK 官方github源码链接 https github com rockchip linux 进行开发定制 当前需要将Android上的调
  • 阿辉闯编程(Java入门)

    故事背景 hello 大家好 我叫阿辉 在某一个风雨交加的夜晚 我也不知道干了什么惹怒了老天爷 可能是嫉妒我帅气的颜值吧 一道闪电轰然劈下 我便晕死了过去 等我再次睁开眼睛的时候 我发现我来到了一个不知名的地方 于是我问向了一旁的人 这里是
  • 豪华股东阵容加持,九方财富有望成港股“大肉签”

    经过一段时间的盘整 曾经因行业冷却而沉寂的港股打新正在重回投资者偏好之中 2月28日启动正式招股的新股 九方财富 就受到了投资者的广泛关注 自去年底以来 港股随全球资本市场大势好转 逐渐脱离底部 也提升了市场对新股的热情 同时 九方财富与其
  • xposed开发之清除应用数据(研究历程)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在研究xposed 有个需求要做到清除其他应用数据 xposed功能足够强大 应该可以实现这个功能 下面是基于android4 4 4研究的思路 google只能开放了
  • Mac OS X 下如何使用类似 Linux 下的 /proc/pid/maps 功能

    本文转载至 http stackoverflow com questions 8058005 mac os x equivalent of virtualquery or proc pid maps 一言以概之 使用 vmmap 不过格式和
  • Objective-C语法之代码块(block)的使用

    代码块本质上是和其他变量类似 不同的是 代码块存储的数据是一个函数体 使用代码块是 你可以像调用其他标准函数一样 传入参数数 并得到返回值 脱字符 是块的语法标记 按照我们熟悉的参数语法规约所定义的返回值以及块的主体 也就是可以执行的代码
  • Microsemi Libero使用技巧6——FPGA全局网络的设置

    文章目录 前言 问题描述 问题分析 FPGA全局布线资源简介 Microsemi FPGA的全局布线资源 全局网络改为普通输入 普通输入上全局网络 总结 推荐阅读 交流群 系列教程 Microsemi Libero系列教程 前言 刚开始做M
  • linux内核-软中断与Bottom Half

    中断服务一般都是在将中断请求关闭的条件下执行的 以避免嵌套而使控制复杂化 可是 如果关中断的时间持续太长就可能因为CPU不能及时响应其他的中断请求而使中断 请求 丢失 为此 内核允许在将具体的中断服务程序挂入中断请求队列时将SA INTER
  • 刷脸支付越来越多的场景开始让人们靠脸吃饭

    技术的唯一目的是保护用户的安全 至于面部 指纹以及生物识别以外的技术手段 皆是抵达目的地的方式方法 在刷脸支付真正使用的过程中 工程师们一直在那些我们看不见的地方 默默谱写着隐私安全的前序曲 刷脸支付是基于人工智能 机器视觉 3D传感 大数
  • 【matlab图像处理笔记2】【图像变换】(一)图像的算术运算与几何变换、图像插值算法

    文章目录 前言 图像的算术运算 图像相加 图像差分 图像乘法 图像除法 图像的线性组合 图像的几何变换 图像平移 图片镜像 图片转置 图像旋转 图像缩放 图像插值算法 最近邻插值算法 双线性插值算法 单线性插值 双线性插值 双三次插值算法
  • VUEX各个模块的封装以及Router封装

    一 各个模块的作用 state 用来数据共享数据存储 mutation 用来注册改变数据状态 同步 getters 用来对共享数据进行过滤并计数操作 action 解决异步改变共享数据 异步 二 创建文件 actions js getter
  • 5种常见函数的写法和调用方式

    前言 函数在开发中随处可见 经常在开发中我们声明函数就使用了一两种就已经足够了 但是 对我这有梦想的码农来说 这显然是不够的 因此 总结整理了5中常见的声明方式和调用方式 1 函数声明 最常规写法 常规函数写法 function bar c
  • Request processing failed;nested exception is java.lang.*

    目录 问题 分析 解决 附录 注意 参考 问题 错误1 httpClient向服务端发送请求 服务端有时候就会给客户端返回 500错误 打开服务端错误日志 报如下错误 2021 05 28 21 05 06 548 default http
  • 面试官让我讲讲分布式系统容错架构,结果。。。

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 TB级数据放在一台机器上 难啊 到底啥是分布式存储 啥又是分布式存储系统 某台机器宕机了咋办 Master节点如何感知到数据副本消失 如何复制副本保持足够副本数