分布式文件系统


一、存储

存储是指将数据或信息保存在某种介质中,以便以后可以检索、使用或处理的过程。存储可以是临时的,如计算机的内存,也可以是永久的,如硬盘驱动器、光盘、磁带或云存储等。存储可以用于各种目的,包括保存文件、图像、音频、视频、数据库等。存储技术的发展使得越来越多的数据可以被存储和访问,从而支持了现代计算和信息技术的发展。

1、存储分类

1.1 按照网络拓扑结构的存储分类

可分为NAS、SAN、DAS三种

1)DAS Direct-Attached Storage:直连式存储

将磁盘使用scsi或sata母线直接与主板相连给系统提供存储的一种方式,如我们的笔记本默认就是这种方式。
优点:
技术简单
传输速率最高(直接对接文件系统,中间未加杂任何应用程序的转换)
缺点:
存储设备与磁盘相互绑定,不能共享。也就意味着存储能力有上限,因为每个主板都有添加磁盘的数量限制,而且数据与磁盘绑定,在不使用其他存储介质的情况下,得拆掉才能将数据传给别人。注意这里只考虑直连附加存储,如果使用文件共享软件来分享数据,严格上就不叫直连附加存储了。
  1. NAS Network Attached Storage:网络附加存储
 通过局域网提供一个文件共享的接口,比如samba服务就完全可以承接NAS存储,网络附加存储解决了数据不能共享或单一性的问题,当然也带来存储效率较慢的问题,而且NAS一般是单机给多机共享,进一步拉低了传输效率,所以用NAS实现集群化也不太现实。

优点:
技术相对简单
不要求存储设备直连本机,只需在同局域网下即可

缺点:
存储速率较慢

3) SAN Storage Area Network:存储区域网络

核心原理是将用户网络和存储网络分开,降低访问压力。如图,服务器与存储设备使用交换机连接在一个广播域。服务器端有2张网卡,分别连接公网接收访问和通过交换机连接存储设备,这就使得服务器与用户数据传输的网路和服务器与存储设备数据传输的网络分开。

优点:
存储安全性较高(用户无法直接访问存储设备)
存储速率较高

缺点:
造价昂贵
技术难度相对较高

1.2 按存储技术分类

  1. 块存储:iSCSI、硬盘、光盘、U盘
优点:速率块 不可取代 可以简单的方式实现数据的可用性
缺点:不可共享 以及 文件系统的约束
  1. 文件存储 / 网络存储:samba、NFS
为了解决块设备无法共享的问题。
优点:
构建资金较低
可在不同主机之间共享存储
缺点:
读写速率低,传输速率慢
  1. 分布式存储 (MFS、CEPH)/ 对象存储 / 存储桶

3.1)分布式存储:

元数据:指文件的详情信息(属者、大小、名称、存放在哪个block块等),在存储集群里面一般有1台元数据服务器用来承接数据访问请求,存储数据的元数据信息。
真实数据:指文件的数据内容,在存储集群里面一般有多台真实数据服务器存储着数据的内容,如此便组成了分布式存储。

3.2)对象存储:

按照一定的访问方式调取指定类型的数据,就会返回所需数据,如根据用户名,密码,文件类型,文件大小,就可以返回指定的数据。当然,在后端会有一批服务器,逻辑上有存储桶这个概念,一个用户对应多个存储桶,用户的数据存放在存储桶中,存储桶的属主可以访问里面的数据。在访问请求到达后端服务器之前要经过一个应用程序编程接口(API)。对象存储在云原生领域使用较多,如阿里云、百度云。
优点:
读写效率高(一个用户可同时在多个服务器读取数据,而且有单独的IO)
可在不同主机之间共享存储(使用MFS服务实现)
有着更高的磁盘IO 网络 IO,存储量级更高
缺点:
造价昂贵
技术实现难度较高

1.3 常见的存储介质

1、SATA盘:比较早的硬盘,现在基本不用了,特点是存储容量大,价格低;缺点是读取速度慢,不适合频繁的操作。
2、SAS盘:串行SCSI盘,现在比较流行的盘,特点是读取速度快,价格适中,性价比高。
3、SSD盘:固态硬盘,特点是读取速度极快,价格昂贵,生命周期短暂,性价比底。
4、NL-SAS:近线SAS,盘体采用的SATA,接口采用SAS,结合了两者的优点于一身,主要用在容量盘中

1.4 常见的存储形态类型

RAID的定义:独立磁盘冗余阵列,它的作用主要是容灾和备份,容灾可以理解为容许灾难发生,备份就不用多说了,也可以理解为数据恢复技术还有就是保障数据的写入和读取的效率。

RAID根据业务不同的分为不同的等级:0、1、2、3、4、5、6、10、50等,其中2和4不常用,但是确实存在,剩下的 是比较常用的RAID级别,下面简单的说一下几个RAID的区别。

1.4.1 RAID 0(stripe,条带卷)

原理:是把连续的数据分散到多个磁盘上存取,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于他自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。

磁盘空间=磁盘总量=100%

需要的磁盘数>=1

读写性能=优秀=磁盘个数(n)*I/O速度=n*100%

块大小=每次写入的块大小=2的n次方=一般为2~512kb

优点: 
1. 充分利用I/O总线性能使其带宽翻倍,读写速度翻倍。

2. 充分利用磁盘空间,利用率为100%。

缺点: 1. 不提供数据冗余。

1. 无数据检验,不能保证数据的正确性。
2. 存在单点故障。

应用场景:

1. 对数据完整性要求不高的场景,如:日志存储,个人娱乐。
2. 要求读写效率高,安全性要求不高,如图像工作站。

image-20210903113225855

1.4.2 RAID 1(Mirror,镜像卷)

是磁盘阵列中单位成本最高的,磁盘利用率最低,但提供了很高的数据安全性和可用性。

原理:将一个两块硬盘所构成RAID磁盘阵列,其容量仅等于一块硬盘的容量,因为另一块只是当做数据“镜像”通过镜像实现数据冗余,成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID1可以提高读取性能。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。最大允许互为镜像内的单个磁盘故障,如果出现互为镜像的两块磁盘故障则数据丢失。

磁盘空间=磁盘总量/2=50%

需要的磁盘数(n)>=2*n

读性能=优秀=I/O性能*n=200%

写性能=正常=I/O性能=100%

优点:

1. 提供数据冗余,数据双倍存储。
2. 提供良好的读性能

缺点:

1. 无数据校验。
2. 磁盘利用率低,成本高。

应用场景:

1. 存放重要数据,如数据存储领域。

image-20210903113302169

1.4.3 RAID 5 奇偶校验(XOR)

RAID 0和RAID 1的折中方案。

原理:数据以块分段条带化存储。校验信息交叉地存储在所有的数据盘上。数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上,其中任意N-1块磁盘上都存储完整的数据。

磁盘空间=n-1

需要的磁盘数>=3

读写性能≈优秀=磁盘个数(n)*I/O速度=n*100%

优点:

1. 读写性能高
2. 有校验机制
3. 磁盘空间利用率高

缺点:

磁盘越多安全性越差

应用场景:

安全性高,如金融、数据库、存储等、

image-20210903094226651

1.4.4 RAID 6

与RAID 5相比,RAID 6增加了第二个独立的奇偶校验信息块。双重奇偶校验

原理:两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但RAID 6需要分配给奇偶校验信息更大的磁盘空间,写性能比RAID5差。

磁盘空间 = n-2
需要的磁盘数 ≥ 4

优点:
1、 良好的随机读性能
2、 有校验机制

缺点:
1、 写入速度差
2、 成本高

应用场景:
对数据安全级别要求比较高的企业

image-20210903094351182

1.4.5 RAID 01

RAID 01:RAID 0和RAID 1的组合形式

原理:先做RAID 0再将RAID 0组合成RAID 1,拥有两种RAID的特性。

磁盘空间= n/2 = 50%

4 ≥ 需要的磁盘数 ≥ 2*n

读写性能 = RAID0

优点:

1、 较高的IO性能

2、 有数据冗余

3、 无单点故障

缺点:

1、 成本稍高

2、 安全性比RAID 10 差 

应用场景:

特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。

image-20210903094300886

1.4.6 RAID 10

RAID 0和RAID 1的组合形式

原理:先做RAID 1再将RAID 1组合成RAID 0,拥有两种RAID的特性,安全性高

磁盘空间=n/2=50%

4≤ 需要的磁盘数 ≥ 2*n

优点:

1. RAID 10的读性能将优于RAID 01
2. 较高的IO性能
3. 有数据冗余
4. 无单点故障
5. 安全性高

缺点:

成本稍高

应用场景:特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。

image-20210903113625031

1.4.7 RAID 50

RAID 50也被称为镜像阵列条带

原理先做RAID 5再将RAID 5组合成RAID 0,拥有两种RAID的特性。

需要的磁盘数≥ 6

image-20210903102347657

二、分布式文件系统

1、什么是分布式文件系统?
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接本地节点上,而是通过计算机网络与节点相连。就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有连接到虚拟共享文件夹内的共享文件,用户感觉不到这些共享文件夹是分散于各个计算机上的。

好处:集中访问、简化操作、数据容灾、提高文件存取性能、在线扩容。
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈献给用户的是一个统一的资源,对于这个统一的源,可挂载使用。
2、为什么需要分布式文件系统?
  多台web服务器通过nfs共享一个存储,虽然业务上满足需求,但在性能与容量上无法胜任更高的要求,nfs服务器不堪重负,出现超时问题,同时也存在单点故障问题。尽管可以使用rsync同步数据到另一台服务器上做nfs服务的备份,但对提高整个系统的性能毫无帮助。可对nfs进行优化或者采取别的解决方案,但是优化并不能满足日益增多的客户端的性能要求。
解决方案是采用分布式文件系统。采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系,而是多对多的关系(即多web服务器对多文件服务器),这样可以使性能得到大幅提升。
3、分布式文件系统的类别
GFS(Google File System)
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。


HDFS
Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,

使用JAVA 开发,占用资源比较大,一般用于日志分析。

后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。

Ceph(赛夫)
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。
说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。
可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。

Lustre
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的。
该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。
目前Lustre已经运用在一些领域,例如HP SFS产品等。
适合存储小文件、图片的分布文件系统研究,但是SUN被oracle收购了后,相关的资料越来越少了。


MogileFS
由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。
MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。
MogileFS由3个部分组成:
  第1个部分是server端,包括mogilefsd和mogstored两个程序。前者即是 mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
  第2个部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
  第3个部分是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能。
  
  无单点故障,自动文件复制,适用于存储小文件存储,使用API来调用,搭建复杂。
  

mooseFS(驼鹿)
 支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多


FastDFS
是一款国人(淘宝:于庆)开发的分布式文件系统(51cto使用),类似Google FS的开源分布式文件系统,是纯C语言开发的。
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。


TFS
TFS(Taobao FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

三、什么是MFS?

http://www.moosefs.com/

MooseFS[MFS]是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。

mooseFS(moose 驼鹿)是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接

1、MFS的特性
1、层析结构(目录树)
2、存储文件属性(权限,访问和修改时间)
3、支持特殊文件(块设备,字符设备,管道)
4、符号链接,软硬链接
5、对文件系统访问可以通过IP地址或者密码进行访问限制 
6、高可靠(数据的多个拷贝存储在不同的计算机上)
7、通过附加新的计算机或者硬盘可以实现容量的动态拓展
8、删除文件可以根据一个可配置的时间周期进行保留
9、不受访问和写入影响的文件连贯快照
2、MFS的优点
1、轻量、易配置、易维护

2、开发活跃、社区活跃,资料丰富

3、扩容成本低,支持在线扩容、不影响业务

4、以文件系统的方式展示,比如存图片,但是chunk server上存储的是二进制文件

5、硬盘利用率比较高,测试需要较大的磁盘空间

6、可以设置删除文件空间的回收时间,避免误删文件丢失及恢复不及时而影响业务

7、系统负载,即数据读写分配到所有的服务器上。

8、可以设置文件备份的副本数,一般建议是3份以上。
3、MFS的缺点
1、master服务器对服务器的内存有一定的要求

2、metalogger复制元数据间隔时间比较长,默认24小时(可调整)

3、Master 社区版目前是单点,会将数据信息同步到备份节点,但是恢复时间较长


内存使用问题:
    处理100W个文件chunkserver,大概需要300M的内存空间,据此类推,如果未来需要存储1亿个文件,大致需要30G的内存空间。
4、MFS的应用场景
1、大规模高并发的线上数据存储及访问(小文件,大文件)
2、大规模的数据处理,比如日志分析

建议:有太多的应用场景不太适用于分布式文件系统,不要为了使用而使用,尽量在前端加CACHE应用,而不是一味的扩充文件系统

高并发访问的核心原则就是一句话:“把所有的用户请求尽量往前推”
  
  比如:用户能缓存在本地的,就不要去让他访问CDN,能缓存在CDN上的尽量不要去访问源服务器(静态资源),能访问静态的资源的,尽量不要访问动态服务器,能不访问数据库和存储的,尽量不要去访问。

四、MFS分布式文件系统的结构和原理

1、MFS架构图

image-20211214205044246

image-20211214205446799

内部运行机制
1:客户端请求访问存储,请求发送到了MFS Master
2:MFS Master根据我们的请求,查询所需要的文件分布在那些服务器上
3:客户端直接和存储服务器进行数据存储和读写
2、MFS的工作原理

1)MFS读数据的处理过程

客户端向元数据服务器发出读请求
元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
客户端向已知的Chunk Server请求发送数据
Chunk Server向客户端发送数据

image-20211214211027598

2)写入的过程

客户端向元数据服务器发送写入请求
元数据服务器与Chunk Server进行交互,但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由hunk Servers告知元数据服务器操作成功
元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
客户端向指定的Chunk Server写入数据
该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功客户端告知元数据服务器本次写入完毕

image-20211214210859964

3、MFS总结说明
   1)Master记录的信息:比如,文件的路径,大小,存储的位置,副本数,时间等,元数据是存放在内存中的,会定期写入到metadata.mfs.back文件中,定期同步到metalogger,操作实时写入changelog.*.mfs,实时同步到metalogger中,Master启动将metadata.mfs载入内存,重命名为metadata.mfs.back
   
   2)文件以chunk大小存储,每个chunk的最大为64M,小于64M的即为该文件的大小,大于64M的会被切分成多分,每一份不超过64M,块的生成原则:目录循环写入(00-FF 256个目录循环,步进为2),chunk文件递增生成,大文件切分目录连续
   
   3)ChunkServer上剩余的空间要大于1GB,新的数据才能被写入,否则你会看到"No space left on device"的提示,实际测试中,当磁盘的使用率达到95%左右的时候,就已经无法写入了。
   
   4)文件可以有多个副本,当goal为1的时候,文件会被随机调度到一台chunkserver上,当goal值大于1的时候,副本会被调度到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多余的副本不会有chunkserver保存。

五、实战:部署MFS分布式文件系统

安装环境准备:

所有服务器端和客户端都要支持fuse内核模块。

由于mfs的客户端程序也就是加载mfs磁盘系统的命令是使用了fuse,因此只要是想挂载mfs的服务器,必要的前提条件就是先安装fuse,这样编译mfs的时候才能顺利通过。

fuse概述:

用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如NTFS-3G(作用:让Linux中对NTFS文件系统提供支持) 使用FUSE实现。
1、实验拓扑和地址规划

image-20220415155635256

IP地址规划如下:

IP地址主机名角色
192.168.1.100master元数据节点
192.168.1.101logger元数据日志节点
192.168.1.102dataserver-1数据存储节点-1
192.168.1.103dataserver-2数据存储节点-2
192.168.1.105client客户端
2、安装MFS

https://moosefs.com/download/#older

所有节点导入官方的yum仓库和秘钥
curl "http://repository.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
curl "https://repository.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS

官方提供安装方式

image-20211214213758073

2.1 先从master节点开始安装

[root@master ~]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
Master节点的配置文件在/etc/mfs目录下,主要修改mfsmaster.cfg和mfsexports.cfg文件。 存放元数据的目录默认为/var/lib/mfs.

mfsmaster.cfg文件,主要是mfs-master的配置文件。

默认的内容即可,也可根据实际情况进行修改。

mfsexports.cfg文件,用来设置mfs的挂载权限。

默认的内容即可,也可根据实际情况进行修改。

cat mfsmaster.cfg
 # MATOCS_LISTEN_HOST = *    #监听所有 IP,也直接写一个 IP 地址,如 192.168.1.100
 # MATOCS_LISTEN_PORT = 9420  
 # DATA_PATH = /usr/local/mfs/var/mfs 
注:这个配置文件中所有注掉的设置都是默认的配置。 
如果有需要还可以修改 DATA_PATH 的设置将元数据目录存储到其他的分区或磁盘。其他的参数都很简单根据需要调整即可。 
master 会打开 9420 端口等待 mfschunkserver 数据存储服务器连接 

2.2 启动和查看master服务

[root@master ~]# systemctl start moosefs-master
[root@master ~]# systemctl enable moosefs-master
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-master.service to /usr/lib/systemd/system/moosefs-master.service.
[root@master ~]# systemctl status moosefs-master
● moosefs-master.service - MooseFS Master server
   Loaded: loaded (/usr/lib/systemd/system/moosefs-master.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2021-12-14 21:45:22 CST; 31s ago
 Main PID: 22475 (mfsmaster)
   CGroup: /system.slice/moosefs-master.service
           ├─22475 /usr/sbin/mfsmaster start
           └─22476 mfsmaster (data writer)

12月 14 21:45:22 master mfsmaster[22475]: no charts data file - initializing empty charts
12月 14 21:45:22 master mfsmaster[22475]: master <-> metaloggers module: listen on *:9419
12月 14 21:45:22 master mfsmaster[22473]: no charts data file - initializing empty charts
12月 14 21:45:22 master mfsmaster[22473]: master <-> metaloggers module: listen on *:9419
12月 14 21:45:22 master mfsmaster[22473]: master <-> chunkservers module: listen on *:9420
12月 14 21:45:22 master mfsmaster[22473]: main master server module: listen on *:9421
12月 14 21:45:22 master mfsmaster[22473]: mfsmaster daemon initialized properly
12月 14 21:45:22 master mfsmaster[22475]: master <-> chunkservers module: listen on *:9420
12月 14 21:45:22 master systemd[1]: Started MooseFS Master server.
12月 14 21:45:22 master mfsmaster[22475]: main master server module: listen on *:9421
[root@master ~]# 

================================================================================================
注意:
端口号:
9419  : MFS master和MFS metalogger端通信端口
9420  : MFS master和MFS chunck通信端口
9421  : MFS master和MFS Client端通信端口
9422  : MFS chunck  和MFS Client端通信端口
9425  : MFS master  web界面监听端口,查看整体运行状态

GUI界面:

[root@master ~]# systemctl start moosefs-cgiserv
[root@master ~]# systemctl enable moosefs-cgiserv
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-cgiserv.service to /usr/lib/systemd/system/moosefs-cgiserv.service.
[root@master ~]# systemctl status moosefs-cgiserv
● moosefs-cgiserv.service - MooseFS CGI server
   Loaded: loaded (/usr/lib/systemd/system/moosefs-cgiserv.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2021-12-14 21:47:51 CST; 19s ago
 Main PID: 25386 (python2)
   CGroup: /system.slice/moosefs-cgiserv.service
           └─25386 python2 /usr/sbin/mfscgiserv start

12月 14 21:47:51 master systemd[1]: Starting MooseFS CGI server...
12月 14 21:47:51 master systemd[1]: Started MooseFS CGI server.
[root@master ~]# 

2.3 浏览器访问master

http://ip:9425

image-20211214222158388

3、Metalogger节点安装配置
[root@logger ~]# yum install moosefs-metalogger -y

3.1 配置文件在/etc/mfs目录下,为mfsmetalogger.cfg,需要修改Master服务器的IP地址

image-20211214215316176

3.2 启动和查看Metalogger服务

[root@logger ~]# systemctl start moosefs-metalogger
[root@logger ~]# systemctl enable moosefs-metalogger
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-metalogger.service to /usr/lib/systemd/system/moosefs-metalogger.service.
[root@logger ~]# systemctl status moosefs-metalogger
● moosefs-metalogger.service - MooseFS Metalogger server
   Loaded: loaded (/usr/lib/systemd/system/moosefs-metalogger.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2021-12-14 21:53:50 CST; 13s ago
 Main PID: 28019 (mfsmetalogger)
   CGroup: /system.slice/moosefs-metalogger.service
           └─28019 /usr/sbin/mfsmetalogger start

12月 14 21:53:50 logger mfsmetalogger[28019]: monotonic clock function: clock_gettime
12月 14 21:53:50 logger mfsmetalogger[28019]: monotonic clock speed: 1593 ops / 10 mili seconds
12月 14 21:53:50 logger mfsmetalogger[28017]: initializing mfsmetalogger modules ...
12月 14 21:53:50 logger mfsmetalogger[28019]: connecting ...
12月 14 21:53:50 logger mfsmetalogger[28017]: mfsmetalogger daemon initialized properly
12月 14 21:53:50 logger mfsmetalogger[28019]: connected to Master
12月 14 21:53:50 logger mfsmetalogger[28019]: metadata downloaded 8B/0.002086s (0.004 MB/s)
12月 14 21:53:50 logger mfsmetalogger[28019]: changelog_0 downloaded 45B/0.001930s (0.023 MB/s)
12月 14 21:53:50 logger mfsmetalogger[28019]: changelog_1 downloaded 0B/0.000103s (0.000 MB/s)
12月 14 21:53:50 logger systemd[1]: Started MooseFS Metalogger server.
[root@logger ~]# 

3.3 查看元数据是否已经同步到了logger

[root@logger mfs]# pwd
/var/lib/mfs
[root@logger mfs]# ll
总用量 8
-rw-r-----. 1 mfs mfs 45 12月 14 21:53 changelog_ml_back.0.mfs
-rw-r-----. 1 mfs mfs  0 12月 14 21:53 changelog_ml_back.1.mfs
-rw-r-----. 1 mfs mfs  8 12月 14 21:53 metadata_ml.tmp
[root@logger mfs]# 

说明已经同步过来了!
4、Chunkservers节点安装配置

(在192.168.1.102/192.168.1.103)

[root@dataserver-1 ~]# yum install moosefs-chunkserver -y
[root@dataserver-2 ~]# yum install moosefs-chunkserver -y

4.1 配置Chunkservers

[root@dataserver-1 ~]# mkdir -p /mnt/mfschunks1
[root@dataserver-2 ~]# mkdir -p /mnt/mfschunks2

4.2 分别给2个Chunkservers添加一个磁盘,用于数据存储

image-20211214220639821

这里,我们每个Chunkservers服务器都添加一个20GB的新硬盘,用于数据存储

4.3 分别进行创建分区

image-20211214221036586

image-20211214221134953

4.4 进行格式化挂载

dataserver-1

[root@dataserver-1 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1310656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@dataserver-1 ~]# mount /dev/sdb1 /mnt/mfschunks1
[root@dataserver-1 ~]# chown -R mfs:mfs /mnt/mfschunks1

dataserver-2

[root@dataserver-2 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1310656 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@dataserver-2 ~]#  mount /dev/sdb1 /mnt/mfschunks2
[root@dataserver-2 ~]# chown -R mfs:mfs /mnt/mfschunks2

4.5 配置文件在/etc/mfs目录下,mfschunkserver.cfg 和 mfshdd.cfg

dataserver-1:
vim /etc/mfs/mfschunkserver.cfg
添加:
MASTER_HOST = 192.168.1.100

vim /etc/mfs/mfshdd.cfg
添加:
/mnt/mfschunks1

dataserver-2
vim /etc/mfs/mfschunkserver.cfg
添加:
MASTER_HOST = 192.168.1.100

vim /etc/mfs/mfshdd.cfg
添加:
/mnt/mfschunks2

4.6 启动服务

dataserver-1:
[root@dataserver-1 ~]# systemctl start moosefs-chunkserver
[root@dataserver-1 ~]# systemctl enable moosefs-chunkserver
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-chunkserver.service to /usr/lib/systemd/system/moosefs-chunkserver.service.
[root@dataserver-1 ~]# systemctl status moosefs-chunkserver
● moosefs-chunkserver.service - MooseFS Chunkserver
   Loaded: loaded (/usr/lib/systemd/system/moosefs-chunkserver.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2021-12-15 22:22:17 CST; 23s ago
 Main PID: 16198 (mfschunkserver)
   CGroup: /system.slice/moosefs-chunkserver.service
           └─16198 /usr/sbin/mfschunkserver start

12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: hdd space manager: setting open chunks limit to: 10922
12月 15 22:22:17 dataserver-1 mfschunkserver[16196]: main server module: listen on *:9422
12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: main server module: listen on *:9422
12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: connecting ...
12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: no charts data file - initializing empty charts
12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: connected to Master
12月 15 22:22:17 dataserver-1 mfschunkserver[16196]: no charts data file - initializing empty charts
12月 15 22:22:17 dataserver-1 mfschunkserver[16196]: mfschunkserver daemon initialized properly
12月 15 22:22:17 dataserver-1 systemd[1]: Started MooseFS Chunkserver.
12月 15 22:22:17 dataserver-1 mfschunkserver[16198]: scanning folder /mnt/mfschunks1/: complete (0s)
[root@dataserver-1 ~]# 
============================================================================================


dataserver-2:
[root@dataserver-2 ~]# systemctl start moosefs-chunkserver
[root@dataserver-2 ~]# systemctl enable moosefs-chunkserver
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-chunkserver.service to /usr/lib/systemd/system/moosefs-chunkserver.service.
[root@dataserver-2 ~]# systemctl status moosefs-chunkserver
● moosefs-chunkserver.service - MooseFS Chunkserver
   Loaded: loaded (/usr/lib/systemd/system/moosefs-chunkserver.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2021-12-14 22:22:22 CST; 36s ago
 Main PID: 16442 (mfschunkserver)
   CGroup: /system.slice/moosefs-chunkserver.service
           └─16442 /usr/sbin/mfschunkserver start

12月 14 22:22:22 dataserver-2 mfschunkserver[16440]: hdd space manager: start background hdd scanning (searching for av...unks)
12月 14 22:22:22 dataserver-2 mfschunkserver[16440]: main server module: listen on *:9422
12月 14 22:22:22 dataserver-2 mfschunkserver[16442]: main server module: listen on *:9422
12月 14 22:22:22 dataserver-2 mfschunkserver[16442]: connecting ...
12月 14 22:22:22 dataserver-2 mfschunkserver[16442]: no charts data file - initializing empty charts
12月 14 22:22:22 dataserver-2 mfschunkserver[16440]: no charts data file - initializing empty charts
12月 14 22:22:22 dataserver-2 mfschunkserver[16440]: mfschunkserver daemon initialized properly
12月 14 22:22:22 dataserver-2 systemd[1]: Started MooseFS Chunkserver.
12月 14 22:22:22 dataserver-2 mfschunkserver[16442]: connected to Master
12月 14 22:22:22 dataserver-2 mfschunkserver[16442]: scanning folder /mnt/mfschunks2/: complete (0s)
Hint: Some lines were ellipsized, use -l to show in full.

注意:同理,其他的Chunkservers节点也执行同样的操作。
5、Clients端配置
[root@client ~]# yum install -y moosefs-client
[root@client ~]# yum install -y fuse libfuse2  ##linux 2.6以后的内核都默认安装

5.1 开始配置client

[root@client ~]# mkdir -p /mnt/mfs
配置文件在/etc/mfs目录下

 vim mfsmount.cfg文件

添加如下内容:

/mnt/mfs

5.2 挂载mfs

[root@client mfs]# mfsmount -H 192.168.1.100
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@client mfs]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 475M     0  475M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  7.7M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   37G  1.5G   36G    4% /
/dev/sda1               1014M  151M  864M   15% /boot
tmpfs                     98M     0   98M    0% /run/user/0
192.168.1.100:9421        40G  577M   40G    2% /mnt/mfs
[root@client mfs]# 
6、查看mfs_gui控制台

image-20211214223037029

数据存储节点

image-20211214223101363

image-20211214223119501

客户端挂载

image-20211214223144943

7、测试写数据
[root@client mfs]# dd if=/dev/zero of=/mnt/mfs/test.txt bs=1M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,33.715 秒,31.1 MB/秒
[root@client mfs]# 
8、设置副本数
[root@client mfs]# mfssetgoal -r 2 /mnt/mfs  ##设置2个副本
/mnt/mfs:
 inodes with goal changed:                       4
 inodes with goal not changed:                   0
 inodes with permission denied:                  0
[root@client mfs]# mfsgetgoal /mnt/mfs    ##查看设置的副本数
/mnt/mfs: 2
[root@client mfs]# cp /etc/passwd /mnt/mfs/
[root@client mfs]# mfsfileinfo /mnt/mfs/passwd    ##查看复制详情
/mnt/mfs/passwd:
        chunk 0: 0000000000000014_00000001 / (id:20 ver:1)
                copy 1: 192.168.1.102:9422 (status:VALID)
                copy 2: 192.168.1.103:9422 (status:VALID)
9、回收站清空时间
mfsrsettrashtime 600 /mnt/mfs/		

##回收站清空时间,s计算,设置文件或目录的删除时间。一个删除的文件能够存放在“ 垃圾箱”中的时间称为隔离时间, 这个时间可以用mfsgettrashtime 命令来查看,用mfssettrashtime 命令来设置。单位为秒。

单独安装或挂载MFSMETA 文件系统,它包含目录/ trash (包含仍然可以被还原的删除文件的信息)和/ trash/undel (用于获取文件)。

把删除的文件,移到/ trash/undel下,就可以恢复此文件。

在MFSMETA 的目录里,除了trash 和trash/undel 两个目录,还有第三个目录reserved,该目录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后,reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作

10、数据恢复

10.1 在客户端创建目录并且赋权

[root@client metadata]# mkdir /mfs/metadata -p
[root@client metadata]# chown -R mfs.mfs /mfs/metadata/

10.2 挂载辅助文件系统目录(可以理解成回收站)

[root@client ~]# mfsmount -m /mfs/metadata/ -H 192.168.1.100
mfsmaster accepted connection with parameters: read-write,restricted_ip

-m代表是辅助文件目录

10.3 查看挂载后的目录结构

[root@client metadata]# tree /mfs/metadata/ |less

image-20220328195920062

10.4、开始往挂载目录下复制文件,并删除测试

[root@client ~]# cp /etc/hostname /mnt/mfs/
[root@client ~]# cd /mnt/mfs
[root@client mfs]# rm -rf hostname 

10.5、查看回收站是否有删除的文件

image-20211215174528149

10.6、恢复

[root@client mfs]# mv /mfs/metadata/trash/00000007\|hostname /mfs/metadata/trash/undel/
[root@client mfs]# ls
hostname  passwd    ##hostname已经恢复
[root@client mfs]# pwd
/mnt/mfs

扩展:

1、mfsmaster配置文件
# WORKING_USER = mfs               #运行master server 用户
# WORKING_GROUP = mfs             #运行master server 组
# SYSLOG_IDENT = mfsmaster        #master server 在syslog中的标识,说明是由master产生的
# LOCK_MEMORY = 0                 #是否执行mlockall()避免mfsmaster 进程溢出(默认为0)
# NICE_LEVEL = -19                #运行的优先级(如果可以默认-19;注意:进程必须是用root启动)
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg #被挂接的目录及其权限控制文件的存放位置
# DATA_PATH = /usr/local/mfs/var/mfs 		 #数据存放路径,此目录分三类文件,changelog ,sessions 和stats
# BACK_LOGS = 50                        #metadata的改变log文件数目(默认是50)
# REPLICATIONS_DELAY_INIT = 300         #延迟复制的时间(默认是300s)
# REPLICATIONS_DELAY_DISCONNECT = 3600  #chunkserver 断开的复制延迟(默认是3600)
# MATOCS_LISTEN_HOST = *                #metalogger 监听的ip地址(默认是*,代表任何ip)
# MATOCS_LISTEN_PORT = 9419             #metalogger 监听的端口地址(默认是9419)
# MATOCS_LISTEN_HOST = *                #用于chunkserver 连接的ip地址(默认是*,代表任何ip)
# MATOCS_LISTEN_PORT = 9420             #用于chunkserver 连接的端口地址(默认是9420)
# MATOCU_LISTEN_HOST = *                #用于客户端挂接的ip地址(默认*,代表任何ip)
# MATOCU_LISTEN_PORT = 9421             #用于客户端挂接连接的端口地址(默认9421)
# CHUNKS_LOOP_TIME = 300                #chunksde 回环频率(默认是:300秒)
# CHUNKS_WRITE_REP_LIMIT = 1            #在一个循环里复制到一个chunkserver的最大chunk数目
# CHUNKS_READ_REP_LIMIT = 5             #在一个循环里从一个chunkserver复制的最大chunk数目
#CHUNKS_READ_REP_LIMIT = 0      弹出低于1.6.0的客户端挂接(0或1,默认是0
集群启动和关闭循序 
MFS集群启动:
        1  启动master server
        2  启动chunk server
        3  启动metalogger
        4  启动客户端,使用mfsmount挂载相关目录
 MFS集群停止:
         1 所有客户端卸载MooseFS文件系统
         2 停止chunkserver
         3 停止metalogger
         4 停止master server