Linux运维之MFS文件系统
- 什么是MFS
MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
对标准的文件操作来说,mfs用起来跟其它的类unix系统类似:
1、分层次的结构(目录树)
2、存储POSIX文件属性(权限、最后访问和修改时间)
3、支持特殊文件(块和字符设备、管道以及套接字)
4、符号连接和硬连接
5、对文件系统的访问可以通过IP地址和(或者)密码进行限制
独有特征:
1、高可靠(数据的多个拷贝被存储在不同的计算机上)
2、通过附加新的计算机或者硬盘可以实现容量的动态扩展
3、删除的文件可以根据一个可配置的时间周期进行保留(一个文件系统级别的回收站)
4、不受访问和写入影响的文件连贯快照
MFS读过程:
客户端向Master发送读请求
Master去缓存的数据库(非MySQL)中搜索客户端所需数据的位置,并告知客户端(Chunk Server IP、Chunk编号)
客户端去指定Chunk Server的对应Chunk编号读取数据
客户端通知Master读取完毕
MFS写过程:
客户端向Master发送写请求
Master通知Chunk Server(谁空闲,如空闲新建Chunk编号),找到后将知道的Chunk Server IP和编号告知客户端
客户端向指定IP和编号存储数据
客户端告知Master写入完毕
Master通知Metalogger有新数据写入(Matelogger纪录新增加文件位置和对应Chunk Server),日志记录完毕后,连接关闭
MooseFS系统特点:
1.轻量 易配置 易维护
2.开发活跃 社区也比较活跃 资料丰富
3.括容成本低 支持在线扩容 不影响业务
4.以文件系统的方式展示
5.磁盘利用率较高
6.可设置删除文件的空间回收时间,避免误删文件丢失及恢复不及时影响业务
7.系统负载,即数据读写分配到所有的服务器上
8.可以设置文件备份的副本数量
数据存储方式:
文件以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分布式文件系统的部署安装
实验环境准备:
3台虚拟机实验
##获取mfs安装包,可在官网下载
##server1上做:
##安装mfs所需包
yum install -y 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用户
##做本地解析(后面所有节点都要做)
vim /etc/hosts
172.25.0.1 server1 mfsmaster
#这里叫mfsmaster是因为配置文件/etc/mfs/mfsmaster.cfg里面是mfsmaster
##启动master
systemctl start moosefs-master
查看端口发现9419 9420 9421三个端口打开
9419:metalogger监听的端口,默认的,和源数据日志结合。定期和master主机同步数据
9420:用于chunkserver连接的默认端口地址
9421:用于clientserver连接的默认端口
##启动图形
systemctl start moosefs-cgiserv
打开了9425端口
点击server的+号,info的-号,可以看到当前没有chunkserver加入,因为还没配置
- 部署chunkserver
##server2上做:
##安装:
rpm -ivh moosefs-chunkserver-3.0.105-1.rhsystemd.x86_64.rpm
##做解析:
vim /etc/hosts
172.25.0.1 server1 mfsmaster
##添加一块磁盘存放数据: /dev/vdb
##分一个区,并格式化为xfs ##分一个区是因为分区表就算破坏了,也容易恢复
mkfs.xfs /dev/vdb1
##创建挂载点
mkdir /mnt/chunk1
##挂载
mount /dev/vdb1 /mnt/chunk1
##拷贝文件测试
cp /etc/passwd /mnt/chunk1/
##修改目录权限
chown mfs.mfs /mnt/chunk1
##修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/chunk1
##做解析
vim /etc/hosts
172.25.0.1 server1 mfsmaster
##开启服务
systemctl start moosefs-chunkserver
可以看到开启了9422端口
图形化也可以看到server2加入了server选项
##部署server3,同server2的部署
##安装软件
##做解析
##server3不添加磁盘
#建立目录
mkdir /mnt/chunk2
#修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/chunk2
##做解析
vim /etc/hosts
172.25.0.1 server1 mfsmaster
##开启服务
systemctl start moosefs-chunkserver
#此处有报错
Jun 12 22:50:09 server3 mfschunkserver: hdd space manager: can't create lock file '/mnt/chunk2/.lock': EACCES (Permission denied)
#解决办法
chown mfs.mfs /mnt/chunk2
图形化也可以看到server3也加入了server选项
- 配置客户端(物理机做客户端)
##安装客户端
rpm -ivh moosefs-client-3.0.105-1.rhsystemd.x86_64.rpm
##解析
172.25.0.1 server1 server1.example.org bbs.westos.org mfsmaster
##创建挂载点
mkdir /mnt/mfs
##编辑配置文件
vim /etc/mfs/mfsmount.cfg
最后一行加上:
/mnt/mfs
##挂载
[root@foundation0 ~]# mfsmount
##查看
[root@foundation0 ~]# df
mfsmaster:9421 38771712 1665280 37106432 5% /mnt/mfs
##建立目录测试
mkdir /mnt/mfs/dir1
mkdir /mnt/mfs/dir2
##查看信息
[root@foundation0 mfs]# mfsgetgoal dir1/
dir1/: 2
[root@foundation0 mfs]# mfsgetgoal dir2/
dir2/: 2 ##可以看到两个目录都备份了2份
##改变备份份数
[root@foundation0 mfs]# mfssetgoal -r 1 dir1
dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
##拷贝文件测试
cp /etc/passwd /mnt/mfs/dir1
cp /etc/group /mnt/mfs/dir2
##查看
[root@foundation0 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
[root@foundation0 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
可以看到passwd备份了一份,在server3上
表示dir1目录中备份一份,dir2两份
###########################################################
tree /mnt/chunk2/
发现客户端上能正常查看到数据。而存储服务器上只能看到文件碎片
###########################################################
##关闭server2测试
[root@server2 ~]# systemctl stop moosefs-chunkserver
[root@foundation0 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
[root@foundation0 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
dir2目录中还有一份,dir1中没有,这时打开passwd文件虚拟机就会卡住,因为数据不在本机了
- 客户端离散存储测试
##默认情况下,chunkserver对数据的备份是按块备份的,每块50MB
##在dir1目录
[root@foundation0 dir1]# dd if=/dev/zero of=bigfile bs=1M count=200
##查看
[root@foundation0 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
看到文件分为4份,在server2和server3上交叉存储
##在dir2目录
[root@foundation0 dir2]# dd if=/dev/zero of=bigfile1 bs=1M count=200
##查看
[root@foundation0 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
可以看到在每个节点都备份了2份
##关闭server2,dir1中的文件都不可用
[root@server2 ~]# systemctl stop moosefs-chunkserver.service
##查看
[r
oot@foundation0 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
no valid copies !!!
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
no valid copies !!!
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
no valid copies !!!
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
no valid copies !!!
[root@foundation0 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
只有server3上的可用
- moose-master的开启和关闭
##开启
master开启时,默认会在/var/lib/mfs目录中生成metadata.mfs.back文件
##关闭
master关闭时,metadata.mfs.back文件会变为metadata.mfs
做下面实验前,最好先卸载物理机的挂载,关闭chunkserver
##但是如果master异常关闭,就不能通过systemctl start moosefs-master
命令来启动
[root@server1 ~]# ps ax | grep mfsmaster
1831 ? S< 0:00 /usr/sbin/mfsmaster start
1832 ? S< 0:00 mfsmaster (data writer)
1860 pts/0 S+ 0:00 grep --color=auto mfsmaster
[root@server1 ~]# kill -9 1831
[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.
查看日志发现找不到metadata.mfs
Jun 8 15:09:41 server1 mfsmaster: can't find metadata.mfs - try using option '-a'
##使用命令行也不能开启
[root@server1 ~]# mfsmaster start
open files limit has been set to: 16384
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
can't find metadata.mfs - try using option '-a'
init: metadata manager failed !!!
error occurred during initialization - exiting
##加上-a参数
[root@server1 ~]# mfsmaster start -a
成功
##要使用systemd方式,可以对启动脚本做修改
[root@server1 ~]# vim /usr/lib/systemd/system/moosefs-master.service
ExecStart=/usr/sbin/mfsmaster start -a
##再次尝试
[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl start moosefs-master #注意:此启动方式不要和前一个 mfsmaster start -a混淆
正常
- mfs数据恢复
##删除一个文件
[root@foundation0 dir1]# rm -fr passwd
##查看文件在垃圾箱存在时间
[root@foundation0 dir1]# mfsgettrashtime /mnt/mfs/dir1/
/mnt/mfs/dir1/: 86400 ##86400s,也就是1天
##创建数据恢复的目录
[root@foundation0 ~]# mkdir /mnt/mfsmeta
##挂载目录
[root@foundation0 ~]# mfsmount -m /mnt/mfsmeta/
mfsmaster accepted connection with parameters: read-write,restricted_ip
‘这个挂载后df命令看不到,mount命令可以看到’ mount -l
##目录里会有两个子目录
[root@foundation0 mfsmeta]# ls
sustained trash
删除的数据在trash目录里
##查找passwd文件
[root@foundation0 trash]# find -name *passwd*
./004/00000004|dir1|passwd
##恢复文件
[root@foundation0 trash]# cd 004/
[root@foundation0 004]# ls
00000004|dir1|passwd undel
[root@foundation0 004]#
[root@foundation0 004]# mv 00000004\|dir1\|passwd undel/
##查看
[root@foundation0 dir1]# ls
bigfile passwd
[root@foundation0 dir1]# pwd
/mnt/mfs/dir1
成功恢复
END