【软件开发】大规模分布式系统的容错架构设计

news2024/11/19 12:37:38

大规模分布式系统的容错架构设计

假设有一个数据库,数据库里有一张特别大的表,里面有几十亿,甚至上百亿的数据。更进一步说,假设这一张表的数据量多达几十个 TB,甚至上百个 TB,那么如果用 MySQL 之类的数据库,单台数据库服务器上的磁盘可能都不够放这一张表的数据!
在这里插入图片描述

假如你手头有一个超大的数据集,几百 TB!那你还是别考虑传统的数据库技术来存放了。因为用一台数据库服务器可能根本都放不下,所以我们考虑一下分布式存储技术?对了!这才是解决这个问题的办法。

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

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

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

比如说经典的 Hadoop 就是这类系统,然后 FastDFS 也是类似的。如果你可以脑洞打开,从思想本质共通的层面出发,那你会发现,其实类似 Elasticsearch、Redis Cluster 等等系统,本质都是如此。这些都是基于分布式的系统架构,把超大数据拆分成多片给你存放在多台机器上。

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

  • 一个进程是 Master 节点,就在一台机器上,负责统一管控分散在多台机器上的数据。
  • 另外一批进程叫做 Slave 节点,每台机器上都有一个 Slave 节点,负责管理那台机器上的数据,跟 Master 节点进行通信。

在这里插入图片描述

这个时候又有一个问题了,那么万一上面那 20 台机器上,其中 1 台机器宕机了咋整呢?这就尴尬了,兄弟,这会导致本来完整的一份 20TB 的数据,最后有 19TB 还在了,有 1TB 的数据就搞丢了,因为那台机器宕机了啊。所以说你当然不能允许这种情况的发生,这个时候就必须做一个数据副本的策略。

比如说,我们完全可以给每一台机器上的那 1TB 的数据做 2 个副本的冗余,放在别的机器上,然后呢,万一说某一台机器宕机,没事啊,因为其他机器上还有他的副本。我们来看看这种多副本冗余的架构设计图。
在这里插入图片描述

上面那个图里的深蓝色的 1TB 数据 01,代表的是 20TB 数据集中的第一个 1TB 数据分片。从上图中可以看到,它有 3 个副本,分别在三台机器中都有浅蓝色的方块,代表了它的三个副本。这样的话,一份数据就有了 3 个副本了。其他的数据也是类似。

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

那这个时候要紧吗?不要紧,因为 1TB 数据 01 这个数据分片,他还有另外 2 个副本在存活的两台机器上呢!所以如果有人要读取数据,完全可以从另外两台机器上随便挑一个副本来读取就可以了,数据不会丢的。

现在有一个问题,比如说有个兄弟要读取 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。

这个时候又有另外一个问题,那就是 1TB 数据 01 这个数据分片此时只有副本 1 和副本 2 这两个副本了,这就不足够 3 个副本啊。因为我们预设的是每个数据分片都得有 3 个副本的。大家想想,此时如何给这个数据分片增加 1 个副本呢?

很简单,Master 节点一旦感知到某台机器宕机,就能感知到某个数据分片的副本数量不足了。此时,就会生成一个副本复制的任务,挑选另外一台机器来从有副本的机器去复制一个副本。

比如看下面的图,可以挑选第四台机器从第二台机器去复制一个副本。
在这里插入图片描述

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

同样,我们来一张图,看看这个过程:
在这里插入图片描述
看上图,现在机器 4 上是不是又多了一个 1TB 数据 01 的副本 3 ?那么 1TB 数据 01 这个数据分片是不是又变成 3 个副本了?

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

没关系,一旦 Master 节点感知到机器 3 复活,会发现副本数量过多,此时会生成一个删除副本任务。他会在机器 3 发送心跳的时候,下发一个删除副本的指令,让机器 3 删除自己本地多余的副本就可以了。这样,就可以保持副本数量只有 3 个。

一样的,大家来看看下面的图。
在这里插入图片描述

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

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

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

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

相关文章

功率信号源的作用是什么意思

功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器,它具有高电压、大功率的特点,在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等,可以有效的帮助电子工程师解决驱动负载和放大功率的问题。同时,功率信…

使用python实现背单词功能,单词本存放在txt文件中,最后统计出回答的正确题数和错误题数。

一、编程题目 编程题目:使用python实现背单词功能,单词本存放在txt文件中,最后统计出回答的正确题数和错误题数。 单词本的内容如下: danciben.txt内容如下(按照格式,可自行定义单词本的内容)&a…

创建 Node REST API 文档

为自己开发的 Node REST API 生成文档,基本有两种方法: 1 极简版 此方法就是自己写一个文件,记录 API,不需要安装额外的 package,然后 app.js 增加一个 route 然后从浏览器查看这个文件就可以。 步骤如下&#xff1a…

酷家乐x极盾科技:“智能安全决策平台”助力日均十亿级日志分析

企业网络环境中每天都会产生大量的网络日志,还有工作站,服务器,路由器和防火墙等网络设备中的日志对网络安全的提升具有重要意义。充分利用好它们可以帮助企业及时发现潜在的风险和安全漏洞,把网络环境中存在的威胁扼杀在摇篮中。…

10年IT老兵亲述SpringCloud开发从入门到实战文档

前言 首先给大家看一张图,不知道图上这些springcloud的技术知识点,大家是否都精通而灵活运用了呢? 如果没有精通灵活运用的话,小编将用此文来带大家一步步来深入学习这些技术知识,接下来将从Spring Boot微框架搭建、S…

Makefile及cmake学习

Makefile及cmake学习 1. g,gcc以及cpp的区别2. Makefile2.1 介绍一个例子2.2 避免头文件重复包含的方法2.2.1 宏定义2.2.2 #pargma once 2.3 使用Makefile编译文件2.3.1 手动编译2.3.2 Makefile编译-版本12.3.3 Makefile编译-版本22.3.4 Makefile编译-版本32.3.5 Ma…

【三维几何学习】网格简化-ModelNet10

网格简化-ModelNet10 引言一、网格的简化1.1 水密网格的简化可视化1.2 非水密网格的简化可视化1.3 核心代码 二、ModelNet10数据集简化三、展望 引言 计算机算力有限,特别是在深度学习领域,撇开网格的输入特征计算,现有条件很难直接训练测试…

JS逆向 -- 某联盟登录密码分析

一、输入账号密码 账号:15836353612 密码:123456 二、F12打开开发者工具,抓包分析,password被加密提交了 三、全局搜索password,定位到关键JS文件,下断调试 四、断下来后,查看formDate的值&…

AspNetCore中的中间件详解【超详细】

1 什么叫做中间件? ASP.NET Core处理请求的方式看做是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件。通常是一个可重用的类方法 每个中间件可以: (1)选择是否将请求传递给管道中的下一个组件。 &a…

第一行代码 第七章 内容提供器

第七章 内容提供器 在上一章中我们学了Android数据持久化的技术,包括文件存储、SharedPreferences存储以及数据库存储。使用这些持久化技术所保存的数据都只能在当前应用程序中访问。 虽然文件和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WR…

UU跑腿“跑男失联”:同城即配服务赛道商业逆袭难?

五一假期,人们纷纷走出家门,要么扎堆奔向“远方”,要么、享受本地烟火气息。 据文化和旅游部数据中心测算,劳动节假期,全国国内旅游出游合计2.74亿人次,同比增长70.83%。 五一假日的郑州东站 面对人山人海…

树莓派(主)与STM32(从)使用SPI通信

1.实验目的 2.SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准 2.1 接口 SPI接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。如图1…

【干货集】PCBA板边器件布局重要性

电子元器件在PCB板上的合理布局,是减少焊接缺点的极重要一环!元器件要尽可能避开挠度值非常大的区域和高内应力区,布局应尽量匀称。 为了最大程度的利用电路板空间,相信很多做设计的小伙伴,会尽可能把元器件靠板的边缘…

机器学习基础知识之数据归一化

文章目录 归一化的原因1、最大最小归一化2、Z-score标准化3、不同方法的应用 归一化的原因 在进行机器学习训练时,通常一个数据集中包含多个不同的特征,例如在土壤重金属数据集中,每一个样本代表一个采样点,其包含的特征有经度、…

《程序员面试金典(第6版)》面试题 16.16. 部分排序(double双指针(多指针),C++)

题目描述 给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n]&#xf…

什么是平台工程?如何开始?

平台工程是为开发人员构建和维护自助服务平台的学科。该平台提供了一套云原生工具和服务,帮助开发者快速高效地交付应用。平台工程的目标是通过标准化和自动化软件交付生命周期 (SDLC) 中的大部分任务来改善开发人员体验 (DX)。开发人员可以专注于使用自动化平台编码…

Type-C PD充电器诱骗PD+QC+AFC+FCP全协议快充取电5V9V12V15V20V

Type-C充电器采用的是PD快充协议,支持的电压高,电流大,一般有5V3A、9V3A、12V3A、15V3A、20V5A等等。 因为充电器内部有协议芯片,当外部设备连接时,设备会和充电器进行协议匹配,匹配成功之后,充…

ASEMI代理ADI亚德诺LT8609AJDDM#WTRPBF车规级芯片

编辑-Z LT8609AJDDM#WTRPBF特点&#xff1a; 宽输入电压范围&#xff1a;3.0V 至 42V 超低静态电流突发模式操作&#xff1a; 将 12VIN 调节到 3.3VOUT 时 IQ 为 2.5A 输出纹波 < 10mVP-P 高效 2MHz 同步操作&#xff1a; 1A 时效率为 93%, 12VIN 可获得 5VOUT 最大…

3.1 一个稍微完善的Vue.js响应式系统

前文提要&#xff1a;3.0 响应式系统的设计与实现 1、设置一个合理的effect副作用函数 如上文所说&#xff0c;如果我们直接将简单的effect函数作为副作用函数&#xff0c;如果一个副作用函数不叫effect岂不是找不到了。解决方案也很简单&#xff0c;我们设定一个全局变量用于…

在CRA中配置别名路径并添加别名路径提示

写在前面&#xff1a; 使用React官方脚手架create-react-app[简称CRA]创建react项目&#xff1a;npx create-react-app 项目名称 一、配置别名路径 1.1 写在前面 目的&#xff1a;简化项目中的路径处理&#xff0c;和Vue项目中的类似。 参考文档&#xff1a;自定义CRA的默认…