当前位置: 首页 > 科技观察

分布式容错架构难吗?一篇文章给你解释清楚

时间:2023-03-14 11:11:34 科技观察

虽然定位有“分布式”、“容错架构”等看似复杂的词,但我们还是按老规矩:大白话+手绘几张彩图,一步一步来,让每个学生都能理解这个复杂架构的设计思路。将数TB的数据放在一台机器上:这很困难!下面以分布式存储系统为例,谈谈容错架构的设计。首先我们来看一下,什么是分布式存储系统?其实很简单。我们以数据库中的一张表为例。比如你手头有一个数据库,数据库里面有一个非常大的表,里面有几十亿甚至上百亿的数据。再者,假设这张表的数据量高达几十TB,甚至几百TB,此时你的感受如何?当然,你内心是恐慌和无助的,因为如果你使用MySQL之类的数据库,单台数据库服务器上的磁盘可能是不够放这张表的数据的!我们先看下图感受一下:什么是分布式存储?所以,如果你有一个超大的数据集是几百TB!那你就不应该考虑用传统的数据库技术来存储。因为使用数据库服务器可能根本放不下,那我们考虑一下分布式存储技术吧?顺便一提!这是这个问题的解决方案。我们可以有多台机器!比如我们设置20台机器,每台机器放1/20的数据。比如总共有20TB的数据,那么每台机器只需要放1TB就可以了。1TB应该没问题吧?每台机器都能轻松愉快地放下这么多数据。因此,将一个大数据集拆分成多个块,放在多台机器上,就叫分布式存储。我们再看下图:那么什么是分布式存储系统呢?什么是分布式存储系统?分布式存储系统当然是负责把一个大的数据集拆分成多份,然后分多份放入。一套系统,将数据存储在一台机器上,然后统一管理存储在多台机器上的数据。比如经典的Hadoop就是这样一个系统,FastDFS也是类似的。如果你能敞开心扉,从思想本质的共同层面出发,那么你会发现,其实像Elasticsearch、RedisCluster等系统,本质都是一样的。这些基于分布式系统架构,将大数据拆分为多个部分,并为您将它们存储在多台机器上。我们的文章从分布式系统架构层面出发,不拘泥于任何一种技术,所以我们可以这样设置:这个分布式存储系统有两个进程。一个进程就是Master节点,在一台机器上,负责对分散在多台机器上的数据进行统一管控。另一批进程称为从节点。每台机器都有一个Slave节点,负责管理本机上的数据,并与Master节点通信。下面我们来看一下这张图,通过这张图让我们直观的看一下上面的描述:我的天!如果某台机器宕机了怎么办?这时候还有一个问题,那么如果上面20台机器,其中1台机器宕机了怎么办?就尴尬了,兄弟,这样会导致20TB数据的完整拷贝,至少还有19TB还在,还有1TB的数据会丢失,因为那台机器宕机了。所以你当然不能允许这种情况发生。这时候就必须制定数据复制策略。比如我们可以把1TB的数据在每台机器上做两份冗余副本,放到其他机器上。那么,如果某台机器宕机了,那也没关系,因为其他机器上也有它的副本。我们来看看这个多副本冗余的架构设计图:上图中淡蓝色的“1TB数据01”代表20TB数据集中的第一个1TB数据分片。图中可以看到,他有3个副本,三台机器各有淡蓝色的方块,代表它的三个副本。在这种情况下,一份数据有3个副本。其他数据类似。这时候我们假设一台机器宕机了,比如下面这台机器宕机了,必然会导致数据分片“1TB数据01”的一份数据副本丢失。如下图所示:此时有关系吗?没关系,因为“1TB数据01”的数据片段在两台幸存的机器上还有另外两份!所以如果有人要读取数据,那是完全可以的,只要从另外两台机器上挑一份读取即可,数据不会丢失,大哥别紧张。Master节点如何感知数据副本的消失?现在有一个问题。比如有位师兄要读取“1TB数据01”这个数据分片,他会找到Master节点说“你能告诉我”1TB数据01“数据01”这个数据分片器在哪里吗?在哪台机器上?我要读他!”我们看下图:这时候Master节点需要从3个副本中选择一个,告诉别人:“兄弟,在哪个机器上,有一个副本,你可以去那台机器上读一份“1TB数据01”就可以了。”但是现在的问题是Master节点并不知道“1TB数据01”的副本3已经丢失,那么如果Master节点还通知其他人去读取一个丢失的副本3,那肯定是不可能的。那么,我们如何让Master节点知道副本3已经丢失了呢?其实很简单。Slave节点负责管理每台机器上的数据每隔几秒(例如1秒)向Master节点发送一次心跳,然后一旦Master节点发现自己有一段时间没有收到Slave节点发送的心跳(例如,30秒内),它会认为Slave节点所在的机器宕机,那台机器上的数据副本丢失了,那么Master节点不会告诉其他人读取丢失的数据副本。看看下面的图片。一旦Sl??ave节点宕机,Master节点收不到心跳,就会认为那台机器上的副本3丢失了。Copyof3.那么这个时候Master节点可以通知其他人读取“1TB数据01”的copy1或者copy2,哪个都可以,因为那两个copy其实还在。比如可以通知客户端去读副本1,这时候客户端可以请求那台机器上的Slave节点去读那个副本1,整个过程如下图所示:副本数量保持充足.这时又出现了一个问题,就是“1TB数据01”这个数据片段只有copy1和copy2两个副本,不够3个副本。因为我们预设每个数据分片必须有3份。想一想,这个时候怎么给这个数据分片增加一个副本呢?很简单,Master节点一旦感知到某台机器宕机,就可以感知到某个数据分片的副本数不足。此时会产生一个copy副本任务,会选择另一台机器从有copy的机器copy一份。比如看下图,可以选择第4台机器从第2台机器上复制一份:但是既然有复制任务,我们怎么让4台机器知道呢?其实很简单,机器4不是每一秒都会发一次心跳吗?当机器4发送心跳时,主节点会通过心跳响应将复制任务发送给机器4,让机器4从机器2复制一份。同样,我们来一张图看看这个过程:看上图,机器4上是否还有“1TB数据01”的另一个副本3?那么,“1TB数据01”的数据片段是否又发生了变化呢?有3本吗?删除多余的副本。反之,如果这时候机器3突然恢复,那么上面还有一个“1TB数据01”的副本3,相当于此时有4个“1TB数据01”的副本了,这个副本不是多余的吗?没关系,一旦Master节点感知到机器3复活了,就会发现副本过多,此时会产生删除副本任务。当机器3发送心跳时,他会发出删除副本的命令,让机器3删除它本地冗余的副本。这样就可以让replicas的数量保持在只有3个。同理,我们来看下图:总结完毕,到这里,通过超大白话的讲解,一共有十多张图片循序渐进,相信即使你之前不了解分布式系统,也一定能理解一个分布式系统完整的数据容错架构是如何设计的。事实上,这种数据分片存储、多副本冗余、宕机感知、副本自动迁移、冗余副本删除的机制与Hadoop、Elasticsearch等很多系统类似。所以笔者在这里强烈建议大家一定要吸取分布式系统和中间件系统底层数据容错架构的思想。这样,以后学习一些类似的技术时,就会对他们的原理和思想产生一种似曾相识的感觉。