从磁盘存储到分布式文件系统

磁盘读写

我们知道,磁盘是一种持久保存,多次读写的数据介质,一般有两种,机械磁盘与固态硬盘。由于固态硬盘的成本原因,目前大部分互联网应用仍然存储在机械磁盘上。机械磁盘读取数据一般分为三步:寻道,指的是机械磁盘的探头在寻找对应的磁道。寻道完成之后,就会旋转磁盘。最后是则是读取数据。由于寻道跟旋转其实都是物理过程,所以,如果磁盘是随机读写的,那么就会大大地降低了磁盘的读写速度。

RAID

假如我们想要提高文件的读写速度,只靠一块硬盘是不够的。RAID即独立硬盘冗余阵列,多块硬盘通过硬件RAID卡或者RAID软件进行管理。RAID的核心思路就是对外屏蔽多块硬盘的事实,假如RAID管理着六块不同的硬盘,那么写一个文件,可能是将文件进行拆分,写入六个不同的硬盘。

根据磁盘组织方式的不同,常用的RAID分为五种,分别是RAID0,RAID1,RAID10,RAID5与RAID6。

RAID0,假如有N个硬盘,那么就将数据分为N份,每份写到一个硬盘里面。如下图所示,假如我们要存储一个文件File0,那么会拆分成4个文件,然后分别存储到4个硬盘当中。很显然,我们假如要读取这个文件,可以并发到4个文件中进行读取,可以理论上可以达到4倍的读取速度,但是,只要一个硬盘中的数据发生损坏,就无法获得数据。

RAID1就比较直白了,不是数据怕丢么?那么我就准备两块硬盘,每块硬盘上面都存储相同的数据。如下图所示,假如我们要保存File0,File1,那么我们每次把数据写到两个不同的硬盘上。读取数据的时候,理论上我们可以两个盘同时读取,速度更快,但是所有的数据都需要写入两个磁盘,一半的数据都是冗余的。

RAID10,综合了RAID0与RAID1的特点,将硬盘们两两分组,每个文件都拆分成子文件,每个每个子文件都挑选任意一组进行写入。RAID10相对于RAID0,容灾明显提升,只要同一组硬盘的数据不会同时损坏,数据就能够得到保证,现对于RAID1,能够并发到更多的硬盘读写数据,大大提升了效率。



无论是RAID1,还是RAID10,我们都面临着数据冗余了一倍。那么,我们有没有更好地方法,这个是无数数学家研究的问题。假如我们有N块硬盘,如果只有1块损坏,那么,我们能否根据其他几块硬盘上面的数据,计算出损坏那块硬盘的数据呢?假如我们有A,B,C,D四个数字,我们将他们异或的结果记为E,假如我们丢失的数字是A,那么我们只要将BCDE进行异或就可以求出A。

基于这样的特性,RAID5应运而生,假如我们有4块硬盘,我们会将每个文件切分为3份,并计算出第4份,随机写入4台机器当中。无论是哪一块硬盘损坏,都能够根据其他硬盘的数据进行恢复。

分布式文件系统

我们都知道,机器的性能跟价格是成指数级增长的,如果我们的数据库,存储的是非常重要的数据,那么提升机器的性能还有一定的意义。但是,如果我们的机器存储的是一些普通的数据,那么节省机器的成本,则显得非常重要。


一个分布式文件系统,最简单的话,可以分为两部分,我们以HDFS为例,第一部分,是用来读写数据的机器,我们称之为DataNodes,这部分机器的功能非常简单,你只要告诉他读取哪个文件,读取多少即可。同样,写入的时候,也只需要告诉他写哪个文件,写哪些数据即可。关键的部分,则是要解决一个文件存储在哪些机器上,一个文件要存储在哪些机器上。这便是NameNode的工作。

说来简单,但是实现起来却很复杂。举个简单的例子,如果有一台机器离线了,那么我们肯定要对曾经落在这台机器上的数据进行迁移与备份,从而保证数据的安全性。同理,扩容新机器也是如此。多个NameNode之间的数据如何保证一致性,等等等。分布式文件系统,我们可以讲好几天,如果你感兴趣,可以关注我,后续我们再一起学习。

总结

今天我们从一个硬盘的读写,到多个硬盘组成得磁盘阵列,再到多台机器组成的分布式文件系统,回答了文件读写常见的几个面试题,希望能对你有所帮助。

下一篇
« Prev Post
上一篇
Next Post »