MFS(文件系统)
MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源
MooseFS旨在为数据中心提供容错,高可用,高性能,可扩展的通用网络分布式文件系统。最初是专有软件
MooseFS 特点
- 高可靠性:每份数据可以设置多个副本(多份数据),并可以存储在不同的主机上
- 可扩展性:可以很轻松的通过增加主机磁盘容量或增加主机数量来动态扩展整个文件系统的存储量
- 可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后一段时间内,依然存放在主机的回收站中,以备误删恢复数据
- 数据一致性:即使文件被写入/访问时,我们依然可以轻松完成对文件一致性的快照
- 1.轻量 易配置 易维护
2.开发活跃 社区也比较活跃 资料丰富
3.括容成本低 支持在线扩容 不影响业务
4.以文件系统的方式展示
5.磁盘利用率较高
6.可设置删除文件的空间回收时间,避免误删文件丢失及恢复不及时影响业务
7.系统负载,即数据读写分配到所有的服务器上
8.可以设置文件备份的副本数量
MooseFS组成
文件系统包括三个组件:
1 元数据服务器(Master)
- 维护和管理文件的位置(布局),文件访问和命名空间层次结构。当前版本的MooseFS支持多个元数据服务器和自动故障转移。客户端只与MDS通信以检索/更新文件的布局和属性; 数据本身直接在客户端和块服务器之间传输。元数据服务器是用户空间守护程序 ; 元数据保存在内存中,并且懒惰地存储在本地磁盘上。
2 元数据日志服务器(Metalogger)
- 纪录数据的改动情况,定期从MDS中提取元数据以存储它以进行备份
3 块服务器(Chunk Server)
- 存储数据并可选地在它们之间进行复制。虽然可扩展性限制尚未发布,但可能有很多。迄今为止报告的最大集群包括160台服务器。[7] Chunk服务器也是一个用户空间守护程序,它依赖于底层本地文件系统来管理实际存储
客户端
- 与Master和ChunkServer交谈。MooseFS客户端通过FUSE将文件系统挂载到用户空间
MFS读过程
- 客户端向Master发送读请求
- Master去缓存的数据库(非MySQL)中搜索客户端所需数据的位置,并告知客户
- 客户端去指定Chunk Server的对应Chunk编号读取数据
- 客户端通知Master读取完毕
MFS写过程
-
客户端向Master发送写请求
-
Master通知Chunk Server(谁空闲,如空闲新建Chunk编号),找到后将知道的Chunk Server IP和编号告知客户端
-
客户端向指定IP和编号存储数据
-
客户端告知Master写入完毕
-
Master通知Metalogger有新数据写入(Matelogger纪录新增加文件位置和对应Chunk Server),日志记录完毕后,连接关闭
数据存储方式
- 文件以chunk大小存储,每chunk最大为64M。小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被均分,每一份(chunk)的大小以不超过64M为原则;
- 文件可以有多份copy,即除原始文件以外,该文件还存储的份数。当goal为1时,表示只有一份copy,这份copy会被随机存到一台chunkserver上。当goal的数大于1时,每一份copy会被分别保存到其它chunkserver上。
- goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存,goal设置再多实际上也就没有意义的。
- copy的份数,一般设为大于1份,这样如果有一台chunkserver坏掉后,至少还有一份copy,当这台又被加进来后,会将失去的那份copy补回来,始终保持原有的copy数。
- 而如果goal设为1,那么当存储该copy的chunkserver坏掉,之后又重新加入回来,copy数将始终是0,不会恢复到之前的1个copy
- chunkserver上的剩余存储空间要大于1GB,新的数据才会被允许写入,否则,你会看到No space left的提示
- 多个chunker并不影响写的速度,但是能加快读的速度,在原来的基础上增加一个chunker时,数据会自动同步到新增的chunker上以达到数据的平衡和均衡
mfs分布式文件系统
准备四台主机进行实验:
172.25.13.110 :管理机master
172.25.13.120:后端存储1
172.25.13.130:都端存储2
172.25.13.140 :测试物理主机
管理机master设置:
获取mfs安装包,并安装;可在官网下载:
moosefs-master-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cli-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cgi-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cgiserv-3.0.105-1.rhsystemd.x86_64.rpm
安装完成后会生成mfs用户
[root@toto1 3.0.105]# id mfs
uid=997(mfs) gid=995(mfs) groups=995(mfs)
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
启动master
systemctl start moosefs-master
服务配置文件:/etc/mfs/mfsmaster.cfg
查看端口发现9419 9420 9421三个端口打开:
9419:metalogger监听的端口,默认的,和源数据日志结合。定期和master主机同步数据
9420:用于chunkserver连接的默认端口地址
9421:用于clientserver连接的默认端口
[root@toto1 3.0.105]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 657/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
启动图形
systemctl start moosefs-cgiserv
查看9425端口是否打开
[root@toto1 3.0.105]# systemctl start moosefs-cgiserv
[root@toto1 3.0.105]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 2178/python
测试master是否配置正常:
使用物理主机访问:172.25.13.110:9425
部署chunkserver
注意:两个后端服务器的设置是一致的
安装服务:
rpm -ivh moosefs-chunkserver-3.0.105-1.rhsystemd.x86_64.rpm
安装包可以从官网进行下载:
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
添加一块磁盘存放数据:
添加磁盘、分区、格式化、创建挂载目录/mnt/toto2、挂载
修改目录权限
chown mfs.mfs /mnt/toto2
:不修改服务无法启动
由于该服务时由mfs用户的身份进行运行操作,所有将该共享挂载目录的权限修改位mfs
修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/toto2 # 指定共享的目录是哪一个
启动服务
systemctl start moosefs-chunkserver.service
查看9422端口已经开启:
[root@toto2 3.0.105]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 2492/mfschunkserver
测试:图形化可以看到两个后端服务器也加入了server选项:
配置客户端(物理机做客户端)
安装客户端
moosefs-client-3.0.105-1.rhsystemd.x86_64.rpm
安装包可以从官网进行下载:
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
编辑配置文件
vim /etc/mfs/mfsmount.cfg
最后一行加上:
/mnt/mfs # 指定挂载点
创建挂载点
mkdir /mnt/mfs
挂载
[root@toto4 3.0.105]# mfsmount
查看挂载情况:挂载成功
[root@toto4 3.0.105]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 10384300 7427156 59% /
devtmpfs 930892 0 930892 0% /dev
tmpfs 941864 0 941864 0% /dev/shm
tmpfs 941864 16748 925116 2% /run
tmpfs 941864 0 941864 0% /sys/fs/cgroup
/dev/sda1 1038336 141512 896824 14% /boot
tmpfs 188376 0 188376 0% /run/user/0
mfsmaster:9421 41920512 590464 41330048 2% /mnt/mfs
使用客户端进行测试
建立目录测试
mkdir /mnt/mfs/dir1
mkdir /mnt/mfs/dir2
查看信息
mfsgetgoal 测试目录:显示目录的备份次数
[root@toto4 3.0.105]# mfsgetgoal /mnt/mfs/dir1
/mnt/mfs/dir1: 2
[root@toto4 3.0.105]# mfsgetgoal /mnt/mfs/dir2
/mnt/mfs/dir2: 2
显示两个目录都进行备份两次:由于只有两个都端存储服务器。
改变备份份数
改变其中一个目录的备份次数,用来作对比
mfssetgoal -r 1 /mnt/mfs/dir1
[root@toto4 dir1]# mfssetgoal -r 1 /mnt/mfs/dir1
/mnt/mfs/dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
拷贝文件测试
/mnt/mfs/dir1 :只进行一次备份
[root@toto4 dir1]# cp /etc/passwd .
[root@toto4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID) # 数据存储在130主机上
/mnt/mfs/dir2 :进行两次备份
[root@toto4 dir2]# cp /etc/group .
[root@toto4 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID) # 备份两次,分别在不同的主机上
文件的查看:
在客户端上可以查看文件的具体内容;但是在存储服务器上只能看到文件碎片。
关闭130主机进行测试
由于dir1中的数据存储在130主机上,
dir2中的数据在120以及130主机上各自存储了一份,这时候关闭130主机,测试不同:
130主机进行操作:
[root@toto3 mnt]# systemctl stop moosefs-chunkserver
查看dir2中的文件内容:
[root@toto4 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID) # 显示存储在120主机,由于130主机关闭
文件能够正常查看
[root@toto4 dir2]# cat group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
查看dir1中的文件内容:
[root@toto4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!! # 显示没有数据存储
[root@toto4 dir1]# cat passwd # 由于没有数据,无法查看,一直卡在这个页面
只需要重新开启130主机即可。
测试较大的数据存储,是进行分块交叉存储
文件以chunk大小存储,每chunk最大为64M。小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被均分,每一份(chunk)的大小以不超过64M为原则
在dir1目录:
放入一个大小位200M的数据文件:
[root@toto4 dir1]# dd if=/dev/zero of=bigfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 8.2296 s, 25.5 MB/s
[root@toto4 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID)
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID)
文件被分成四个部分,交叉存储在120以及130主机,没有进行备份,相当于每一个值机里面只是这个文件的一部分
在dir2目录:
文件被分成四个部分,交叉存储在120以及130主机,进行备份,相当于每一个主机里面都由一个完整的文件
[root@toto4 dir2]# dd if=/dev/zero of=bigfile1 bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 12.7836 s, 16.4 MB/s
[root@toto4 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
在上述情况中,若是存在一台后端存储服务器宕机,则dir1中的文件不完整,客户端就会无法进行查看,但是dir2中的文件在每一个主机上都存在一个完成的备份,人就可以保证客户端可以正常的查看。
异常问题解决
1 master主机异常关闭后无法启动
正常情况下:
master开启时,默认会在/var/lib/mfs目录中生成metadata.mfs.back文件
master关闭时,metadata.mfs.back文件会变为metadata.mfs
目前master是开启的,看一下这个文件:果然存在
[root@toto1 3.0.105]# ls /var/lib/mfs/metadata.mfs.back
/var/lib/mfs/metadata.mfs.back
异常关闭master
使用kill 发送信号直接强行结束进程
[root@toto1 3.0.105]# ps aux |grep mfsmaster
mfs 2520 1.0 59.3 691344 603420 ? S< 22:32 0:11 /usr/sbin/mfsmaster start
mfs 2521 0.0 0.0 23432 288 ? S< 22:32 0:00 mfsmaster (data writer)
root 2534 0.0 0.0 112648 956 pts/0 R+ 22:49 0:00 grep --color=auto mfsmaster
[root@toto1 3.0.105]# kill -9 2520
[root@toto1 3.0.105]# ps aux |grep mfsmaster
root 2539 0.0 0.0 112648 960 pts/0 S+ 22:49 0:00 grep --color=auto mfsmaster
再次查看/var/lib/mfs目录中文件情况:
[root@toto1 3.0.105]# ls /var/lib/mfs
changelog.0.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs metadata.mfs.back metadata.mfs.empty
metadata.mfs.back 文件依然存在,并没由变成metadata.mfs文件
无法启动
[root@toto1 3.0.105]# 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.
解决办法
1 加上-a参数
mfsmaster start -a
2 要使用systemd方式,可以对启动脚本做修改
vim /usr/lib/systemd/system/moosefs-master.service # 修改启动脚本
ExecStart=/usr/sbin/mfsmaster start -a # 在该行后面添加 -a
mfs数据恢复
当数据被删除之后,在一定时间内可以进行恢复。该时间可以查看:
mfsgettrashtime /mnt/mfs/dir1/ 查看文件在垃圾箱中存在的时间:
[root@toto4 dir1]# mfsgettrashtime /mnt/mfs/dir1/
/mnt/mfs/dir1/: 86400 # 显示86400秒 时间是1天
删除该目录中的文件:
[root@toto4 dir1]# ls
bigfile passwd
[root@toto4 dir1]# rm -fr passwd
[root@toto4 dir1]# ls
bigfile
创建数据恢复的目录
[root@toto4 dir1]# mkdir /mnt/mfsmeta
挂载数据恢复的目录
mfsmount -m /mnt/mfsmeta/
这个挂载后df命令看不到,mount命令可以看到’ mount -l
目录里会有两个子目录,删除的数据在trash目录里
[root@toto4 mfsmeta]# pwd
/mnt/mfsmeta
[root@toto4 mfsmeta]# ls
sustained trash
查找passwd文件
find -name *passwd*
[root@toto4 trash]# find -name *passwd*
./004/00000004|dir1|passwd
恢复文件
[root@toto4 trash]# cd 004
[root@toto4 004]# ls
00000004|dir1|passwd undel
[root@toto4 004]# mv 00000004\|dir1\|passwd undel/
查看文件是否已经恢复
[root@toto4 004]# cd /mnt/mfs/dir1
[root@toto4 dir1]# ls
bigfile passwd
成功恢复