您现在的位置是:亿华云 > IT科技类资讯
分布式容错架构很难?一篇给你讲清楚
亿华云2025-10-05 10:30:55【IT科技类资讯】3人已围观
简介虽然定位是有“分布式”、“容错架构”等看起来略显复杂的字眼,但是咱们还是按照老规矩:大白话 + 手绘数张彩图,逐步递进,让每个同学都能看懂这种复杂架构的设计思想。TB 级数据放在一台机器上:难啊!咱们
虽然定位是分布有“分布式”、“容错架构”等看起来略显复杂的式容字眼,但是错架楚咱们还是按照老规矩:大白话 + 手绘数张彩图,逐步递进,构难让每个同学都能看懂这种复杂架构的讲清设计思想。
TB 级数据放在一台机器上:难啊!
咱们就用分布式存储系统举例,分布来聊一下容错架构的式容设计。
首先,错架楚我们来瞧瞧,构难到底啥是讲清分布式存储系统呢?其实特别的简单,咱们就用数据库里的分布一张表来举例。
比如你手头有个数据库,式容数据库里有一张特别大的错架楚表,里面有几十亿,构难甚至上百亿的讲清数据。
更进一步说,假设这一张表的数据量多达几十个 TB,甚至上百个 TB,这时你觉得咋样?
当然是内心感到恐慌和无助了,因为如果你用 MySQL 之类的数据库,亿华云单台数据库服务器上的磁盘可能都不够放这一张表的数据!
咱们就来看看下面的这张图,来感受一下:

到底啥是分布式存储?
所以,假如你手头有一个超大的数据集,几百 TB!那你还是别考虑传统的数据库技术来存放了。
因为用一台数据库服务器可能根本都放不下,所以我们考虑一下分布式存储技术?对了!这才是解决这个问题的办法。
咱们完全可以搞多台机器嘛!比如搞 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 个副本在存活的两台机器上呢!
所以如果有人要读取数据,完全可以从另外两台机器上随便挑一个副本来读取就可以了,数据不会丢的,不要紧张,大兄弟。
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。
整个过程如下图所示:

复制副本保持足够副本数量
这个时候又有另外一个问题,那就是“1TB 数据 01”这个数据分片此时只有副本 1 和副本 2 这两个副本了,这就不足够 3 个副本啊。
因为我们预设的是每个数据分片都得有 3 个副本的。大家想想,此时如何给这个数据分片增加 1 个副本呢?
很简单,Master 节点一旦感知到某台机器宕机,就能感知到某个数据分片的副本数量不足了。
此时,就会生成一个副本复制的任务,挑选另外一台机器来从有副本的机器去复制一个副本。
比如看下面的图,可以挑选第 4 台机器从第 2 台机器去复制一个副本:

但是,现在这个复制任务是有了,我们怎么让机器 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 等很多系统来说,都是类似的。
所以笔者在这里强烈建议大家,一定好好吸收一下这种分布式系统、中间件系统底层数据容错架构的思想。
这样,以后学习类似的一些技术的时候,对他们的原理、思想都会感到一种似曾相识的感觉。
很赞哦!(287)
相关文章
- 域名不仅仅是一个简单的网站。对于有长远眼光的公司来说,在运营网站之前确定一个优秀的域名对有长远眼光的公司来说是非常重要的。这对今后的市场营销、产品营销和企业品牌建设都具有十分重要的意义。优秀的域名是企业在市场竞争中获得持久优势的利器。
- 2019年前端发展趋势总结
- “中台”是架构的捷径吗?
- 很可怕!NSA、GitHub 被恶搞:Windows 的锅
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 5个Linux服务器一键综合测试性能和配置脚本工具
- 我们是怎样将网站加载时间减少 24% 的?
- 谷歌ALBERT模型V2+中文版来了,GitHub热榜第二
- 为什么说注册域名注意细节?哪些我们不能忽视?
- 年末将至,值得你关注的16个Java 开源项目!
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
Spring boot集成Kafka之spring-kafka深入探秘
来得瑟一下!用Python做一个缩放自如的圣诞老人
数据科学家需要知道的5种图算法
为什么现在中文域名觉得好?使用中文域名有什么好处?
腾讯大佬告诉你,写Python到底用什么IDE合适
程序员想搞点副业太难了:谷歌已将个人项目归属问题写进雇佣协议
如何使用Flask编写Python Web API