MFS简介
分布式文件系统是指文件系统管理的物理存储资源通过计算机网络与各节点相连。简单讲,就是把一些分散的共享文件夹,集合到一个文件夹内。对于用户来说,只需要打开该虚拟文件夹,就可以使用这些分散的文件夹进行数据读写。分布式文件系统的好处在于集中访问、简化操作、冗余防灾、读写迅速。
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。由元数据服务器master、元数据日志服务器metalogger、数据存储服务器chunk server和客户端client四个组件组成。如图,chunk seerver可以存在多个,可以及时添加,为MFS扩展容量。
MFS文件系统的特性:
(1)通用文件系统,不需要修改上层应用就可以使用(那些需要专门api的dfs很麻烦!)。
(2)可以在线扩容,体系架构可伸缩性极强。(官方的case可以扩到70台了!)
(3)部署简单。
(4)高可用,可设置任意的文件冗余程度(提供比raid1+0更高的冗余级别,而绝对不会影响读或者写的性能,只会加速!)
(5)可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类似oralce 的闪回等高级dbms的即时回滚特性!)
(6)提供netapp,emc,ibm等商业存储的snapshot特性。(可以对整个文件甚至在正在写入的文件创建文件的快照)
(7)google filesystem的一个实现。
(8)提供web gui监控接口。
MFS文件系统的组成
元数据服务器(master):负责各个数据存储服务的管理文件读写调度,文件空间回收以及恢复,多节点拷贝。
元数据日志服务器(MetaLogger):负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master
server出现问题的时候解体器 进行工作。
数据存储服务器(Chunk Server):真正存储用户数据的服务器存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间赋值(复制份数可以手工指定,建议设置副本数为数据服务器可以为多个,并且数据越多,可使用的“磁盘空间越大,”可靠性也越高。
客户端(client):使用MFS文件系统来存储和访问的主机名称为MFS的客户端,成功挂载MFS系统以后,就可以像以前NFS一样共享这个虚拟性的存储了。
MFS读取数据的处理过程
MFS读取数据的过程:
1.首先客户端向master发送请求 2.master把所需的数据存放位置告诉给客户端(chunk server的ip地址和chunk编号) 3.客户端向chunk server发送请求数据 4.chunk server给客户端发送所需的数据
MFS写入数据的处理过程
MFS写数据的过程:
1.客户端向master发送请求 2. master与chunk server进行交互,但是master只对某些chunk server创建新的分块chunks,创建成功后chunk server会给master反馈 3.master告诉客户端,在上一过程指定的chunk server写入数据 4.客户端开始写入数据 5.写入数据的chunk server将这些数据与其他的chunk server进行同步,同步完成反馈结果给客户端。客户端再反馈给master,这时,整个过程结束。
前提:
主机 | 服务 |
---|---|
server1 | mfsmaster |
server2 | mfschunkserever1 |
server3 | mfschunkserever1 |
物理机 | client |
我们将每个虚拟机的内存都给到了2048,当然给的多点也不介意~(我server1给了4096)
实验过程如下所示:
第一步:配置server1
在网上下载mfsmaster的rpm包以及所需的依赖安装包并 安装
安装这些包:
[root@server1 ~]# yum install moosefs-cgi-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cgiserv-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cli-3.0.103-1.rhsystemd.x86_64.rpm moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm -y
如下:
[root@server1 ~]# vim /etc/hosts
172.25.24.1 server1 mfsmaster
为了方便,我选择将本地解析文件发送给server2/3和物理机。
其中域名解析必须写为mfsmaster的原因是由配置文件(/etc/mfs/mfschunkserver.cfg里面搜寻MASTER_HOST可以看到)决定的。
继续配置server1:
[root@server1 ~]# systemctl start moosefs-master #也可以利用mfsmaster命令开启服务,只是使用命令"systemctl status moosefs-master"查看到的状态是该服务并未开启,但是端口是开着的
[root@server1 ~]# systemctl start moosefs-cgiserv #也可以利用mfscgiserv命令开启服务,"systemctl status moosefs-cgiserv"查看到的状态是该服务并未开启,但是端口是开着的
[root@server1 ~]# netstat -antulp
此时可以在客户端的浏览器中访问:172.25.27.1:9425
第二步:配置mfschunkserever——server2和server3
配置server2
[root@server2 ~]# ls
moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm
[root@server2 ~]# yum install-y moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm
因为我们没有建立磁盘,所以这里使用的是根空间,实际生产环境下应该创建磁盘后,将磁盘挂载在chunkserver的目录下
[root@server2 ~]# mkdir /mnt/chunk1 #
[root@server2 ~]# chown mfs.mfs /mnt/chunk1/ -R #其中mfs用户和组是安装完软件之后,自动创建的,不需要我们手动建立。
注意:这里的mfs用户应该和server3的mfs用户uid和gid相同
在配置文件中注明/mnt/chunk1作为chunkserver的目录
[root@server2 ~]# vim /etc/mfs/mfshdd.cfg #在文件的最后一行,添加如下的内容
36 /mnt/chunk1
开启moosefs-chunkserver服务之后,查看端口,server2端会在/mnt/chunk1下生成256个目录,用来存放客户端的数据(server3端同理)
此时去浏览器查看:
我们在server1里面使用lsof工具查看:
第三步:配置物理机(client)
安装moosefs-client对应的rpm
做域名解析,并在配置文件中指明挂载点
[root@foundation27 ~]# cd /etc/mfs/
[root@foundation27 mfs]# vim mfsmount.cfg
17 /mnt/mfs
root@foundation27 ~]# mkdir /mnt/mfs #建立挂载目录
[root@foundation27 ~]# mfsmount #执行mfsmount命令,可以直接挂载
在 MFS 挂载点下创建两个目录,并设置其文件存储份数
[root@foundation27 ~]# cd /mnt/mfs/
[root@foundation27 mfs]# ls
[root@foundation27 mfs]# mkdir dir1 #必须在挂载目录中(这里是/mnt/mfs)建立
[root@foundation27 mfs]# mkdir dir2 #必须在挂载目录中(这里是/mnt/mfs)建立
[root@foundation27 mfs]# mfs #利用两次tab键补全查看mfs的命令
[root@foundation27 mfs]# mfsgetgoal dir1 #获取dir1目录中文件存储份数
[root@foundation27 mfs]# mfsgetgoal dir2 #获取dir2目录中文件存储份数
[root@foundation27 mfs]# mfssetgoal -r 1 dir1 #设置在dir1目录中文件存储份数为一个(以示区分)
错误示范:
正确的做法:
注意:对一个目录设定 “goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的 copy 份数。但使用-r 选项可以更改已经存在的 copy 份数。(这就是mfsgetgobal dir1与mfsgetgobal -r dir1的区别)
[root@foundation83 mfs]# cp /etc/passwd dir1/
[root@foundation83 mfs]# cp /etc/passwd dir2/
[root@foundation83 mfs]# mfsfileinfo dir1/passwd
[root@foundation83 mfs]# mfsfileinfo dir2/passwd
从图上我们可以看出来,dir1里的文件只有在server3上面有存储,而dir2里的文件在server2/3都有。
第四步测试:验证mfs分布式文件系统中一个block的大小为64M
[root@foundation83 mfs]# dd if=/dev/zero of=dir1/bigfile bs=1M count=65
[root@foundation83 mfs]# mfsfileinfo dir1/bigfile
[root@foundation83 mfs]# dd if=/dev/zero of=dir1/bigfile2 bs=1M count=64
[root@foundation83 mfs]# mfsfileinfo dir1/bigfile2
第五步测试:演示一个chunkserver挂掉的情况
我们从前面的实验知道,dir1的存储份数只有一份,并且存储在server3上面,dir2有两份server2和server3都有
[root@server3 ~]# mfschunkserver stop #停掉server3端的mfschunkserver服务。此时在server2端查看端口,已经看不到9422端口。
[root@foundation83 mfs]# mfsfileinfo dir1/passwd #我们可以看到dir1/passwd文件的存储收到了影响,而dir2/passwd文件的存储并没有收到任何影响
[root@server2 ~]# mfschunkserver #恢复mfschunkserver服务,在去查看
第六步演示:恢复垃圾箱的文件
[root@foundation83 mfs]# rm -rf dir1/passwd
[root@foundation83 mfs]# mfsgettrashtime dir1 #文件删除后存放在"垃圾箱"中的时间称为隔离时间,这个时间可以用"mfsgettrashtime"命令来查看,用"mfssettrashtime"命令来设置,单位为秒,默认为 86400秒。
#86400s这个时间是由mfsmaster的配置文件决定的
[root@foundation83 mfs]# mkdir /mnt/mfsmeta
[root@foundation83 mfs]# mfsmount -m /mnt/mfsmeta #挂载MFSMETA文件系统,它包含目录trash (包含仍然可以被还原的删除文件的信息)和trash/undel(用于获取文件)。把删除的文件,移到trash/undel 下,就可以恢复此文件。
[root@foundation83 mfs]# mount #该挂载信息,通过df命令是看不到的,只能通过mount命令查看
![\[root@foundation83 mfs\]# cd /mnt/mfsmeta/
\[root@foundation83 mfsmeta\]# ls
\[root@foundation83 mfsmeta\]# cd trash/ #进入trash目录,该目录下有很多文件
\[root@foundation83 trash\]# find -name *passwd* #查看要查找的文件passwd所在的位置
\[root@foundation83 trash\]# cd 004
\[root@foundation83 006\]# ls
\[root@foundation83 006\]# mv 00000004\|dir1\|passwd undel/ #将需要恢复的文件移动到undel目录下,注意书写格式
此时在去查看,文件已经成功恢复: