MFS
- 什么是MFS文件系统:
- MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
- MooseFS文件系统结构包括一下四种角色:
- 管理服务器master
管理服务器:负责各个数据存储服务的管理文件读写调度,文件空间回收以及恢复,多节点拷贝 - 元数据日志服务器:
负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出现问题的时候解体器 进行工作 - 数据存储服务器data server(chunk servers)
真正存储用户数据的服务器存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间赋值(复制份数可以手工指定,建议设置副本数为数据服务器可以为多个,并且数据越多,可使用的“磁盘空间越大,”可靠性也越高 - 客户端挂载使用client computers
使用MFS文件系统来存储和访问的主机名称为MFS的客户端,成功挂载MFS系统以后,就可以像以前NFS一样共享这个虚拟性的存储了。
- MFS特性:
Free(GPL)
通用文件系统,不需要修改上层应用就可以使用
可以在线扩容,体系架构可伸缩性极强。
部署简单。
高可用,可设置任意的文件冗余程度
可回收在指定时间内删除的文件
提供netapp,emc,ibm等商业存储的snapshot特性
google filesystem的一个c实现。
提供web gui监控接口。
提高随机读或写的效率
提高海量小文件的读写效率
MFS的读数据过程:
client当需要一个数据时,首先向master server发起查询请求;
管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid;
管理服务器将数据服务器的地址发送给客户端;
客户端向具体的数据服务器发起数据获取请求;
数据服务器将数据发送给客户端;
MFS的写数据过程:
当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等);
管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;
数据服务器返回创建成功的消息;
管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid);
客户端向数据服务器写数据;
数据服务器返回给客户端写成功的消息;
客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间
MFS的删除文件过程:
客户端有删除操作时,首先向Master发送删除信息;
Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;
响应客户端删除成功的信号
MFS修改文件内容的过程:
客户端有修改文件内容时,首先向Master发送操作信息;
Master申请新的块给.swp文件,
客户端关闭文件后,会向Master发送关闭信息;
Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;
若无,则直接删除.swp文件块。
MFS重命名文件的过程:
客户端重命名文件时,会向Master发送操作信息;
Master直接修改元数据信息中的文件名;返回重命名完成信息;
MFS文件系统的配置:
配置主节点
- 在server1安装master和web图形界面
[root@server1 3.0.103]# yum install -y moosefs-cgi-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cgiserv-3.0.103-1.rhsystemd.x86_64.rpm moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm
- .做主节点解析
[root@server1 3.0.103]# vim /etc/hosts
172.25.14.1 server1 mfsmaster
- 打开服务并查看端口
[root@server1 ~]# systemctl start moosefs-master
[root@server1 mfs]# netstat -antlp
- 9419 metalogger 监听的端口地址(默认是9419),和源数据日志结合。定期和master端同步数据
- 9420 用于chunkserver 连接的端口地址(默认是9420),通信节点
- 9421 用于客户端对外连接的端口地址(默认是9421)
5. 打开图形处理工具
[root@server1 ~]# systemctl start moosefs-cgiserv
[root@server1 ~]# netstat -antlp
6. 浏览器访问 http://172.25.14.1:9425
配置从节点,在sevrer2和server3中
- 安装MFS的客户端软件
[root@server2 3.0.103]# rpm -ivh moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm
[root@server3 3.0.103]# rpm -ivh moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm
- 添加解析
[root@server3 3.0.103]# vim /etc/hosts
172.25.14.1 server1 mfsmaster
[root@server2 3.0.103]# vim /etc/hosts
172.25.14.1 server1 mfsmaster
[root@server2 mfs]# mkdir /mnt/chunk1
- 编辑客户端的配置文件
[root@server2 ~]# vim /etc/mfs/mfshdd.cfg
最后一行添加: /mnt/chunk1 #存储位置
[root@server3 ~]# vim /etc/mfs/mfshdd.cfg
/mnt/chunk2
- 建立该目录,修改该挂载目录的所有人和所有组,这样才可以在目录中进行读写操作
[root@server2 ~]# mkdir /mnt/chunk1
[root@server2 ~]# chown mfs.mfs /mnt/chunk1/
[root@server3 ~]# mkdir /mnt/chunk2
[root@server3 ~]# chown mfs.mfs /mnt/chunk2/
- 开启服务
[root@server2 mfs]# systemctl start moosefs-chunkserver
[root@server3 mfs]# systemctl start moosefs-chunkserver
搭建客户端(真机)
- 安装客户端软件
[root@foundation14 3.0.103]# yum install -y moosefs-client-3.0.103-1.rhsystemd.x86_64.rpm
- 编辑解析文件
- 这个解析特别重要,是确定server1的master位置,而且客户端在访问其中的数据时候,是先来master端取得存储数据得元数据,再去server2或server3上取数据
[root@foundation79 ~]# vim /etc/hosts
172.25.79.1 server1 mfsmaster
- 创建在真机挂载数据的目录并编辑配置文件
[root@foundation14 ~]# mkdir /mnt/mfs
[root@foundation14 3.0.103]# vim /etc/mfs/mfsmount.cfg
/mnt/mfs
[root@foundation14 3.0.103]# mfsmount ##客户端挂载文件系统
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@foundation14 3.0.103]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel_foundation14-root 229460512 45379428 184081084 20% /
devtmpfs 3932872 0 3932872 0% /dev
tmpfs 3946212 488 3945724 1% /dev/shm
tmpfs 3946212 9088 3937124 1% /run
tmpfs 3946212 0 3946212 0% /sys/fs/cgroup
/dev/sda1 1038336 143396 894940 14% /boot
tmpfs 789244 16 789228 1% /run/user/1000
mfsmaster:9421 35622912 2672640 32950272 8% /mnt/mfs ##查看已经挂载上
- 在挂载的目录下新建两个目录,并查看数据存储服务器
[root@foundation14 ~]# cd /mnt/mfs
[root@foundation14 mfs]# mkdir dir1
[root@foundation14 mfs]# mkdir dir2
[root@foundation14 mfs]# mfsgetgoal dir1/
dir1/: 2
[root@foundation14 mfs]# mfsgetgoal dir2/
dir2/: 2
- 修改dir1的文件备份份数为1(为了做实验对比)
[root@foundation14 mfs]# mfssetgoal -r 1 dir1/
dir1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@foundation14 mfs]# mfsgetgoal dir1/
dir1/: 1
6.测试:
- 将文件存储到/mnt/mfs/dir中,并查看文件信息
[root@foundation14 mfs]# cp /etc/passwd dir1/
[root@foundation14 mfs]# cp /etc/fstab dir2/
[root@foundation14 mfs]# cd dir1/
[root@foundation14 dir1]# mfsfileinfo passwd ##数据存储默认为1份
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.14.3:9422 (status:VALID) ##存储passwd的chunkserver为server3
[root@foundation14 dir1]# cd ..
[root@foundation14 mfs]# cd dir2
[root@foundation14 dir2]# mfsfileinfo fstab
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1) ##数据存储默认为两份
copy 1: 172.25.14.2:9422 (status:VALID)
copy 2: 172.25.14.3:9422 (status:VALID)
- 存储passwd的chunkserver(server3)关掉
[root@server3 3.0.103]# systemctl stop moosefs-chunkserver
[root@foundation14 dir2]# cd ..
[root@foundation14 mfs]# cd dir1/
[root@foundation14 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!! ##
##此时已经查看不到passwd的数据,如果此时要打开passwd文件电脑会卡住因为数据已经不在这个主机上存储
[root@foundation14 dir2]# mfsfileinfo fstab ##对于fatab文件来说不影响,因为备份了两份
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.14.2:9422 (status:VALID) ####数据存储默认变为1份
[root@server3 3.0.103]# systemctl start moosefs-chunkserver
离散存储
[root@foundation14 dir1]# dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.532317 s, 197 MB/s
[root@foundation14 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.14.2:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.14.3:9422 (status:VALID)
[root@foundation14 dir1]# cd ../dir2/
[root@foundation14 dir2]# dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.568865 s, 184 MB/s
[root@foundation14 dir2]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.14.2:9422 (status:VALID)
copy 2: 172.25.14.3:9422 (status:VALID)
chunk 1: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.14.2:9422 (status:VALID)
copy 2: 172.25.14.3:9422 (status:VALID)
数据恢复
- 删除passwd
[root@foundation14 dir1]# ls
bigfile passwd
[root@foundation14 dir1]# rm -fr passwd
文件删除后存放在 “ 垃圾箱 ” 中的时间称为隔离时间, 这个时间可以用 mfsgettrashtime 命令来查看,用 mfssettrashtime 命令来设置,单位为秒,默认为 86400 秒
[root@foundation14 dir1]# mfsgettrashtime .
.: 86400
- 恢复
[root@foundation14 ~]# mkdir /mnt/mfsmeta
[root@foundation14 ~]# mfsmount -m /mnt/mfsmeta
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@foundation14 ~]# cd /mnt/mfsmeta/
[root@foundation14 mfsmeta]# ls
sustained trash
[root@foundation14 mfsmeta]# cd trash/ #进入trash,该目录下有很多文件
[root@foundation14 trash]# find -name *passwd* #查找要恢复的文件
./004/00000004|dir1|passwd
[root@foundation79 trash]# mv ./004/00000004\|dir1\|passwd undel/ ##注意要加反斜线
[root@foundation79 trash]# cd /mnt/mfs/dir1
[root@foundation79 dir1]# ls
file1 passwd #查看删除的文件被找回来了
mfs服务的开启与关闭
- 正常开启与关闭
[root@server1 ~]# systemctl stop moosefs-master
[root@server1 ~]# systemctl start moosefs-master
- kill进程后开启mfs的方法
[root@server1 ~]# ps ax
11838 ? S< 0:00 /usr/sbin/mfsmaster start
[root@server1 ~]# kill -9 11838
此时用systemctl开启进程失败
[root@server1 ~]# systemctl start moosefs-master
Job for moosefs-master.service failed because the control process exited with error code. See "systemctl status moosefs-master.service" and "journalctl -xe" for details.
- 查看状态,使用moosefs-master -a 可以成功开启
[root@server1 ~]# systemctl status moosefs-master
Apr 05 12:00:00 server1 mfsmaster[11849]: can't find metadata.mfs - try using option '-a'
[root@server1 ~]# moosefs-master -a ##开启成功
- 若还想用原来的systemctl的方式,则需要修改配置文件
[root@server1 ~]# vim /usr/lib/systemd/system/moosefs-master.service
8 ExecStart=/usr/sbin/mfsmaster -a
[root@server1 ~]# ps ax
11869 ? S< 0:30 mfsmaster -a
[root@server1 ~]# kill -9 11869
[root@server1 ~]# systemctl start moosefs-master ##测试开启成功