软件下载地址:
https://moosefs.com/support/#documentation
mooseFS(moose 驼鹿)是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
MooseFS[MFS]是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
SAN和MFS比较
当我们存储服务器的容量达到瓶颈之后,那我们就需要采用分布式的文件系统来扩大存储容量,类似与百度云的存储,也是采用分布式存储!
MFS的特征
1:层析结构(目录树)
2:存储文件属性(权限,访问和修改时间)
3:支持特殊文件(块设备,字符设备,管道)
4:符号链接,软硬链接
5:对文件系统访问可以通过IP地址或者密码进行访问限制
6:高可靠(数据的多个拷贝存储在不同的计算机上)
7:通过附加新的计算机或者硬盘可以实现容量的动态拓展
8:删除文件可以根据一个可配置的时间周期进行保留
9:不受访问和写入影响的文件连贯快照
应用场景
谈及MooseFS的应用场景,其实就是去谈分布式文件系统的应用场景。
1)大规模高并发的数据存储及访问(小文件、大文件),
2)大规模的数据处理,如日志分析
MFS 工作原理和设计架构
角色 | 角色作用 |
管理服务器 | 负责各个数据存储服务器的管理,文件读写调 |
元数据日志服务器 | 负责备份master 服务器的变化日志文件,文 |
数据存储服务器 | 负责连接管理服务器,听从管理服务器调度, |
客户机挂载使用 | 通过fuse 内核接口挂接远程管理服务器上所 |
内部运行机制
1:客户端请求访问存储,请求发送到了MFS Master
2:MFS Master根据我们的请求,查询所需要的文件分布在那些服务器上
3:客户端直接和存储服务器进行数据存储和读写
端口号简述:(基础理论知识了解一下)
9420 : MFS master和MFS chunck通信端口
9421 : MFS master和MFS Client端通信端口
9419 : MFS master和MFSmetalogger端通信端口
9422 : MFS chunck 和MFS Client端通信端口
9425 : MFS master web界面监听端口,查看整体运行状态
实验环境
主机IP | 作用 |
172.25.81.1 | mfsmaster server |
172.25.81.2 | metalogger server |
172.25.81.3 | mfschunk server |
172.25.81.4 | mfschunk server |
172.25.81.250 | mfs client |
安装环境准备:
所有服务器端和客户端都要支持fuse内核模块。
由于mfs的客户端程序也就是加载mfs磁盘系统的命令是使用了fuse,因此只要是想挂载mfs的服务器,必要的前提条件就是先安装fuse,这样编译mfs的时候才能顺利通过。
fuse概述:
用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如NTFS-3G(作用:让Linux中对NTFS文件系统提供支持) 使用FUSE实现。
注:2.6以上内核,都自带fuse
master server端配置:
[root@server1 ~]# curl "https://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
[root@server1 rpm-gpg]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
[root@server1 yum.repos.d]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
首次安装master 时,会自动生成一个名为metadata.mfs.empty 的元数据文件 metadata,该文件是空的。MooseFSmaster 运行时必须有文件metadata.mfs
该方式安装默认存在metadata.mfs文件,不需要进行复制
[root@server1 ~]# vim /etc/mfs/mfsmaster.cfg
配置文件都按默认值的话可以不用改动,如果需要进行修改则需要去掉注释并对相应的参数进行修改,这里把主要的参数列举出来
6 WORKING_USER = mfs //运行masterserver的用户
9 WORKING_GROUP = mfs //运行masterserver的组
30 DATA_PATH = /var/lib/mfs //数据存放路径
67 MATOML_LISTEN_HOST = * //用于chunkserver连接的ip地址(默认*代表所有ip)
70 _LISTEN_PORT = 9419 //用于客户端挂载的监听端口
[root@server1 ~]# vim /etc/hosts ##添加dns解析
172.25.81.1 mfsmaster server1
[root@server1 ~]# systemctl start moosefs-master ##开启服务
metalogger server端配置:
[root@server2 ~]# curl "https://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
[root@server2 ~]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
[root@server2 ~]# yum install moosefs-metalogger -y
[root@server2 ~]# vim /etc/mfs/mfsmetalogger.cfg
MASTER_HOST = 172.25.81.1 ##MASTER SERVER 的 IP 地址
[root@server2 mfs]# systemctl start moosefs-metalogger
除了修改该配置文件的方法之外,也可以配置dns解析来指定MASTER_HOST,这样就不需要对配置文件进行修改
[root@server2 ~]# vim /etc/hosts
172.25.81.1 mfsmaster server1
查看服务开启状况:
可以看出mfsmaster的9419端口与metalogger 监听的端口地址相连接
[root@server2 mfs]# netstat -anput | grep 9419
[root@server2 mfs]# ps ax | grep mfs
[root@server2 mfs]# lsof -i :9419
查看日志服务器的工作目录:
chunk server(数据存储服务器)端配置(server3 server4)
[root@server3 ~]# curl "https://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
[root@server3 ~]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
[root@server3 ~]# yum install moosefs-chunkserver -y
配置文件位于安装目录/etc/mfs,需要的配置文件有两个:mfschunkserver.cfg和 mfshdd.cfg,
mfschunkserver.cf是主配置文件,mfshdd.cfg是服务器用来分配给 MFS使用的空间,最好是一个单独的硬盘或者一个raid卷,最低要求是一个分区。
mfschunkserver.cfg的配置
[root@server3 ~]# vim /etc/mfs/mfschunkserver.cfg
MASTER_HOST = 172.25.81.1
同样,此处依然可以不作修改,通过dns解析来指定MASTER_HOST
mfshdd.cfg的配置
[root@server3 ~]# vim /etc/mfs/mfshdd.cfg
/mnt/chunk1 ##在最后一行插入
在这里/mnt/chunk1是一个给mfs的分区,但在本机上是一个独立的磁盘的挂载目录,用 chown mfs.mfs /mnt/chunk1 把属主改变为mfs。
[root@server3 ~]# mkdir /mnt/chunk1
[root@server3 ~]# chown mfs.mfs /mnt/chunk1/
[root@server3 ~]# systemctl start moosefs-chunkserver
server4同server3配置
[root@server4 ~]# vim /etc/mfs/mfshdd.cfg
/mnt/chunk2
[root@server4 ~]# mkdir /mnt/chunk2
[root@server4 ~]# chown mfs.mfs /mnt/chunk2
[root@server4 ~]# systemctl start moosefs-chunkserver
查看mfsmaster节点上的端口可以看出9420端口是用于chunkserver 连接的端口地址
对mfscgiserv的使用(master server端)
Mfscgiserv是用python编写的一个web服务器,它的监听端口是9425,启动之后,用户利用浏览器就可全面监控所有客户挂接,chunkserver及master server,客户端的各种操作等等,绝对是个好工具。
在任何一台装有浏览器的机器上都可以查看:http://172.25.81.1:9425
[root@server1 ~]# systemctl start moosefs-cgiserv
浏览器访问http://172.25.81.1:9425 注意master server的主机名
mfs client端配置:
[root@foundation81 ~]# curl "https://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
[root@foundation81 ~]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
[root@foundation81 ~]# yum install -y moosefs-client
添加dns解析
注意:所有的MFS都是挂接同一个元数据服务器master的IP,而不是其他数据存储服务器chunkserver的IP。
挂接MFS文件系统
[root@foundation81 ~]# mkdir /mnt/mfs ##创建挂接点
[root@foundation81 ~]# vim /etc/mfs/mfsmount.cfg
/mnt/mfs
[root@foundation81 ~]# mfsmount ##自动读取后端文件进行挂载
任意数量的客户端主机,可以通过mfsmount进程与管理服务器(接收和更改元数据)和数据服务器(改变实际文件数据)进行交流。
通过df命令查看磁盘使用情况来检查是否被挂接成功,可以看出mfsmaster的9421端口用于客户端连接
mount 命令进行查看
mfsmount的工作过程
▲mfsmount启动后,首先会读取命令行的参数和配置。
▲然后使用fuse定义好挂载点,并对应上mfsmount实现的文件操作函数。
▲设置好到masterserver的连接参数。
▲启动线程fs_nop_thread(keep alive)用于保持与masterserver的连接状态。fs_receive_thread,连接到masterserver并进行通讯,在masterserver上注册,并做一些初始化工作。(挂接客户端,就直接开始尝试连接masterserver)
▲开始响应客户端的输入(由fuse中转)。
重点解释下响应用户输入的过程,输入就是我们所做的创建、修改文件的操作,这些操作会被移交到在fuse_lowlevel_ops中定义好的各个具体的函数,在这些具体的函数中去和masterserver进行通信。
每次用户所做一个文件操作,就会生成一个threc类型的数据:threc// 这个数据类型确实太重要了///===fs_createpacket(rec,CUTOMA_FUSE_READ_CHUNK,8); 一般由这个fs_createpacket来创建
[root@foundation81 ~]# cd /mnt/mfs/
[root@foundation81 mfs]# mkdir dir1
[root@foundation81 mfs]# mkdir dir2
[root@foundation81 mfs]# mfsgetgoal dir1/
dir1/: 2 ##默认的文件副本是两份
[root@foundation81 mfs]# mfsgetgoal dir2/
dir2/: 2 ##默认的文件副本是两份
[root@foundation81 mfs]# mfssetgoal -r 1 dir1/ ##修改dir1的文件备份数为1
[root@foundation81 mfs]# cp /etc/passwd dir1/
[root@foundation81 mfs]# mfsfileinfo dir1/passwd ##查看文件具体信息,数据存储在chunk2上,因为我们设置了数据复制一份
对于大文件,实行分散存储,在后端的chunk server 上各存储部分数据 ,但实质只是一份数据
[root@foundation81 mfs]# cd dir1/
[root@foundation81 dir1]# dd if=/dev/zero of=bigfile bs=1M count=100
[root@foundation81 mfs]# cd /mnt/mfs/
[root@foundation81 mfs]# cp /etc/fstab dir2/
[root@foundation81 mfs]# mfsfileinfo dir2/fstab
[root@foundation81 mfs]# mfsfileinfo dir2/fstab ##该目录下数据默认复制两份,分别放在后端的chunk server上
down掉server3的chunk server服务,再次查看两个文件夹下的文件的状态:
可以看出设置复制数为2的文件夹下的文件存储在另一个chunk server节点上
可以看出设置复制数为1的文件夹下的正常文件已经不被任何一个chunk server节点存储
设置复制数为1的文件夹下的大文件分布存储在该chunk server节点上的部分已经不存在,存储在另一chunk server节点上的数据依然存在
不小心删除了元数据,恢复的方法:
[root@foundation81 mfs]# rm -fr dir1/passwd
[root@foundation81 mfs]# mfsgettrashtime dir1/
dir1/: 86400 ##查看当前文件的缓存时间,在86400 秒内的数据都可以恢复
[root@foundation81 mfs]# mkdir /mnt/mfsmeta
[root@foundation81 mfs]# mfsmount -m /mnt/mfsmeta/
[root@foundation81 mfs]# cd /mnt/mfsmeta/
[root@foundation81 mfsmeta]# ls
sustained trash[root@foundation81 mfsmeta]# cd trash/
[root@foundation81 trash]# find -name *passwd*
./004/00000004|dir1|passwd[root@foundation81 trash]# cd 004/
[root@foundation81 004]# ls
00000004|dir1|passwd undel[root@foundation81 004]# mv 00000004\|dir1\|passwd undel/ ##恢复文件,注意特殊字符要进行转译
查看文件是否恢复成功:
master有时候会处于非正常服务状态,导致客户端无法获取数据
(1)正常关闭master
[root@server1 ~]# systemctl stop moosefs-master
当服务端正常关闭时,客户端就会卡顿
当服务端重新开启时,客户端就会恢复正常
[root@server1 ~]# systemctl start moosefs-master
(2)非正常关闭master
[root@server1 ~]# kill -9 1092
查看/var/lib/mfs目录下的文件,发现没有metadata.mfs文件--主要元数据文件(启动moosefs-master时需要该文件)
此时启动moosefs-master会报错
[root@server1 mfs]# mfsmaster -a ##利用mfsmaster -a来合并元数据日志,自动恢复模式
查看进程,服务启动成功
为了在每次master非正常关闭之后,都可以保证服务成功开启,这里直接将此命令写入的moosefs-master启动脚本中,这样不管是否正常关闭,都可以保证服务成功开启
[root@server1 mfs]# vim /usr/lib/systemd/system/moosefs-master.service
[Unit]
Description=MooseFS Master server
Wants=network-online.target
After=network.target network-online.target[Service]
Type=forking
ExecStart=/usr/sbin/mfsmaster -a
ExecStop=/usr/sbin/mfsmaster stop
ExecReload=/usr/sbin/mfsmaster reload
PIDFile=/var/lib/mfs/.mfsmaster.lock
TimeoutStopSec=1800
TimeoutStartSec=1800
Restart=no[Install]
WantedBy=multi-user.target[root@server1 mfs]# systemctl daemon-reload
[root@server1 mfs]# kill -9 1110 ##停掉刚刚用命令恢复的服务
[root@server1 mfs]# systemctl start moosefs-master ##用脚本启动,不报错
[root@server1 mfs]# systemctl status moosefs-master