1 、 什么是分布式文件系统

    

    分布式系统,一下就提出了两个概念,一个是分布式,一个是文件系统,那么什么是分布式呢?


    分布式就是有多个计算机节点参与一项任务,通过相互之间的协调完成任务,相当于做菜的时候,油米酱油放在不同的罐子里,做菜的时候,需要用到的各种材料,然后所有的组合起来就可以做菜了。这些罐子可以理解为一个个单独的计算机,也就是计算机节点,在做菜的时候,需要他们共同参与完成做菜。


    文件系统,对于linux来说,这个是最基本,不然无法完成文件的存取,文件的读取工作,在文件系统层面,需要关注两个东西,如果找到这个文件,然后将文件的内容读出来,也就是在file system中分为元数据和真实的数据,元数据也就是文件的大小,文件的创建时间,修改时间,访问时间等相关的基本属性,这些数据是存放在inode中,那么文件真正的内容其实是存放在block,也就是块中,在读取文件的时候,首先找到的是文件元数据,然后才能找到存放文件的相关的block,然后将文件内容读出来。打一个比方就是,一个人,他的名字,年龄,血型,身份证号这些就相当于元数据,而这个人这个实体,胖胖的,长发飘飘,这种就相当于这个人的block,也就是真正的称之为人的东西。


    分布式文件系统,就是提供了文件系统的访问能力,将文件分别存储在不同的节点上,可能在每个节点存储部分数据,相互之间能够通信。


2、 为什么要有分布式文件系统


  最简单的存储可以理解为我们的电脑,也就是用一块硬盘来进行存储数据,在复杂的场景中,我们使用的存储是NAS或者SAN,这种属于集中式存储,而最高级的进化形式也就是分布式文件系统。


    为什么要使用NAS或者SAN这种集中式存储,也就是将所有需要存储的东西都放在NAS或者SAN这种介质上面?主要原因无非是:能提高更高的性能,能提高更大的存储空间,能提供额外的可用性的保障。


    那为什么需要分布式文件系统???


    分布式文件系统主要用来存储需要保存的数据的,那么你会说,有了database,为啥我要用分布式文件系统,这种就关系到数据结构的类型,一般关系型数据库主要用来存储结构化数据,也就是那种行和列比较清晰的数据,例如excel里面存放的数据结构就可以理解关系型数据。结构化可以存储在关系型数据库中,半结构化数据可以存储在nosql中,也就是redis等数据库中,那分布式文件系统用来存储啥数据???


    分布式文件系统主要用来存储非结构化数据,例如,海量的图片文件,pdf文件,html文件,txt文件,视频文件等各种非结构化数据。


    分布式文件系统能提高高可用性,也就是在文件系统的级别提供冗余能力,一个节点坏了,照样不会丢失数据,因为可能在别的节点还有保存的这个数据的副本或者叫备份,而不同于一般存储中的通过raid的硬件级别的冗余能力,最常用的raid级别应该是raid5,通过硬盘的组合提高冗余能力,如果这样说,那么分布式文件系统能提供两个级别的冗余,一个是文件系统层面的冗余,一个是硬件级别的冗余。


    分布式文件系统不存在单点故障,也就是当一个节点坏了之后,这个分布式文件系统照样是能提供工作的,一般各个组成部分,都是负载均衡模式运行,从而不会存在单点故障。


    分布式文件系统提供更好的性能,分布式系统的资源由各个分散的节点组成,从而提供了更大的容量,提供了更多的IO。


    分布式文件系统更加适用于大并发场合。主要还是融合了众多节点的资源,从而提供更强的计算能力和存储能力。


    分布式文件更加容易扩容和缩容。在集中式存储的NAS和SAN中,要进行扩容,受限于磁盘阵列能容纳多少磁盘,受限于光纤交换机的接口,而对于分布式文件系统来说,扩容就是加几个节点,安装相关的组件即可,缩容的时候,减少几个节点即可。


3、 分布式文件系统构建

    

    在使用分布式文件系统构建的时候,需要考虑到的几个问题是:


    节点之间如何相互通信进行协调;

    节点坏了一个如何不影响全局的使用;

    数据平衡,在进行扩容和缩容的时候,如果将数据打散到各个数据节点中;

    数据如何来存储,是否有控制节点?元数据和数据如何来存取?存取的接口是啥?


4、 分布式文件系统的分类


    分布式文件系统按照有无元数据分为一种为有中心控制节点的分布式文件系统一种为无中心控制节点的分布式文件系统,也就是是否将元数据进行统一存放,统一存放的为有中心控制节点的,例如mogilefs有中心控制节点,将所有的元数据存储在数据库中,而glusterfs就是无中心节点的,在每个节点中都存储了所有的元数据。


    分布式文件系统又可以分为将元数据存储在内存中还是外部的关系型数据库中,例如GFS和HDFS就是将元数据存储在内存中,从而只能存放少量的大文件,也就是适用场景是一个文件好几个G,然后文件数量比较少的;放在外部关系型数据的例如TFS和mogilefs,将元数据存储在专门的数据库中,从而应对海量的数据文件,其中主要区别就是访问速度和存储的文件数量,放在内存中访问速度快,而放在database中的,存放的文件多。


    分布式文件系统又可以按照是否在用户空间和内核空间使用的,例如ceph是内核支持的文件系统,从而在进行数据迁移的时候,只要将另外一台计算机作为这个分布式文件系统的节点即可,然后进行数据迁移。而其他的基本都是在用户空间运行的一个程序。