MFS分布式文件部署
1.环境
VMware Workstation
centos7(master server),IP地址:192.168.73.100,安装软件:moosefs-3.0
centos7(metalogger server),IP地址:192.168.73.101,安装软件:moosefs-3.0
centos7(chunk server1),IP地址:192.168.73.102,安装软件:moosefs-3.0
centos7(chunk server2),IP地址:192.168.73.103,安装软件:moosefs-3.0
centos7(chunk server3),IP地址:192.168.73.104,安装软件:moosefs-3.0
centos7(client),IP地址:192.168.73.105,安装软件:moosefs-3.0
2.遇到的问题和解决办法
- 问题:
- 1.业务功能上能够满足要求
- 2.在性能和容量上无法满足更高的要求
- 3.NFS服务器不堪重负,出现超时的问题
- 4.NFS存在着单点故障的问题
- 采用MFS解决上述问题
- 1.采用分布式文件系统
- 2.服务器之间的数据访问不再是一对多的关系,而是多对多的关系
- 3.可以使性能得到大幅提升
3.拓扑图
4.实验过程
- 6台服务器上关闭防火墙、安全防护、主机名、host文件配置
[root@localhost ~]# hostnamectl set-hostname client '//修改主机名'
[root@localhost ~]# su
[root@client ~]# systemctl stop firewalld '//关闭防火墙'
[root@client ~]# systemctl disable firewalld '//取消开机自启动'
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@client ~]# setenforce 0 '//关闭核心防护'
[root@client ~]# vi /etc/sysconfig/selinux
SELINUX=disabled '//取消开启自启动'
[root@client ~]# vi /etc/hosts '//修改本地主机映射文件'
192.168.73.100 master
192.168.73.101 metalogger
192.168.73.102 chunk01
192.168.73.103 chunk02
192.168.73.104 chunk03
192.168.73.105 client
[root@client ~]# yum -y install gcc gcc-c++ zlib-devel '//安装编译器'
- 搭建MFSmaster
- 创建用户并编译安装源码包
[root@master ~]# useradd -s /sbin/nologin -M mfs '//创建用户'
[root@master ~]# mount.cifs //192.168.11.1/ccc /mnt '//挂载宿主机目录'
Password for root@//192.168.11.1/ccc:
[root@master ~]# cd /mnt/mfs
[root@master mfs]# tar zxvf moosefs-3.0.100-1.tar.gz -C /opt '//解压源码包到/opt目录下'
[root@master mfs]# cd /opt/moosefs-3.0.100/
[root@master moosefs-3.0.100]# ./configure \ '//进行配置'
> --prefix=/usr/local/mfs \ '//指定安装目录'
> --with-default-user=mfs \ '//指定运行用户'
> --with-default-group=mfs \ '//指定运行组'
> --disable-mfschunkserver \ '//禁用chunk功能'
> --disable-mfsmount '//禁用mfsmount功能'
[root@master moosefs-3.0.100]# make && make install '//编译安装'
- 复制master配置文件
[root@master opt]# cd /usr/local/mfs/etc/mfs/ '//进入mfs目录'
[root@master mfs]# ls
mfsexports.cfg.sample mfsmaster.cfg.sample mfsmetalogger.cfg.sample mfstopology.cfg.sample
'//将几个配置文件的模板复制一下'
[root@master mfs]# cp mfsmaster.cfg.sample mfsmaster.cfg
[root@master mfs]# cp mfsexports.cfg.sample mfsexports.cfg
[root@master mfs]# cp mfstopology.cfg.sample mfstopology.cfg
[root@master mfs]# cd /usr/local/mfs/var/mfs/
[root@master mfs]# cp metadata.mfs.empty metadata.mfs
[root@master mfs]# chown mfs:mfs /usr/local/mfs/var/mfs '//设置目录的属主属组'
[root@master mfs]# /usr/local/mfs/sbin/mfsmaster start '//开启master server'
[root@master mfs]# netstat -anpt | grep mfs '//检测mfs是否开启'
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 41396/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 41396/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 41396/mfsmaster
'//停止 Master Server 的命令是/usr/local/mfs/sbin/mfsmaster stop'
- 搭建MFS日志服务器
- 相同的方法编译安装源码包,创建用户
- 复制metalogger主配置文件并编辑
[root@metalogger moosefs-3.0.100]# cd /usr/local/mfs/etc/mfs
[root@metalogger mfs]# ls
mfsexports.cfg.sample mfsmaster.cfg.sample mfsmetalogger.cfg.sample mfstopology.cfg.sample
[root@metalogger mfs]# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
[root@metalogger mfs]# vim mfsmetalogger.cfg '//编辑日志配置文件'
MASTER_HOST = 192.168.73.100 '//取消注释,指定master服务器地址'
- 启动mfs服务
[root@metalogger mfs]# /usr/local/mfs/sbin/mfsmetalogger start
open files limit has been set to: 4096
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
[root@metalogger mfs]# netstat -anpt | grep mfs
tcp 0 0 192.168.73.101:37252 192.168.73.100:9419 ESTABLISHED 51991/mfsmetalogger
- 搭建chunk存储端
- 相同方法编译安装源码包,并创建用户
- 三台节点的操作都一样
- 复制mfschunk主配置文件并编辑
[root@chunk01 moosefs-3.0.100]# cd /usr/local/mfs/etc/mfs/
[root@chunk01 mfs]# ls
mfschunkserver.cfg.sample mfshdd.cfg.sample mfsmetalogger.cfg.sample
[root@chunk01 mfs]# cp mfschunkserver.cfg.sample mfschunkserver.cfg
[root@chunk01 mfs]# cp mfshdd.cfg.sample mfshdd.cfg
[root@chunk01 mfs]# vi mfschunkserver.cfg '//编辑存储节点配置文件'
MASTER_HOST = 192.168.73.100 '//指向master服务器地址'
[root@chunk01 mfs]# vim mfshdd.cfg
/data '//添加一个挂载点目录'
[root@chunk01 mfs]# mkdir /data '//创建挂载点'
[root@chunk01 mfs]# chown -R mfs:mfs /data '//给挂载点属主属组'
- 启动mfs服务
[root@chunk01 mfs]# /usr/local/mfs/sbin/mfschunkserver start
[root@chunk01 mfs]# netstat -anpt | grep mfs
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 103672/mfschunkserv
tcp 0 0 192.168.73.102:49394 192.168.73.100:9420 ESTABLISHED 103672/mfschunkserv
- 安装mfs挂到客户端
- 安装fuse
[root@master ~]# useradd -s /sbin/nologin -M mfs
[root@master ~]# mount.cifs //192.168.11.1/ccc /mnt
Password for root@//192.168.11.1/ccc:
[root@master ~]# cd /mnt/mfs
[root@master mfs]# tar zxvf moosefs-3.0.100-1.tar.gz -C /opt
[root@master mfs]# tar xzvf fuse-2.9.2.tar.gz -C /opt
[root@master mfs]# cd /opt/fuse-2.9.2
[root@client fuse-2.9.2]# ./configure
[root@client fuse-2.9.2]# make && make install
'//设置环境变量'
[root@client fuse-2.9.2]# echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> /etc/profile
[root@client fuse-2.9.2]# source /etc/profile '//使之不重启即可生效'
- 安装mfs客户端
[root@client fuse-2.9.2]# cd ../moosefs-3.0.100/
[root@client moosefs-3.0.100]# ./configure \
> --prefix=/usr/local/mfs \
> --with-default-user=mfs \
> --with-default-group=mfs \
> --disable-mfsmaster \
> --disable-mfschunkserver \
> --enable-mfsmount
[root@client moosefs-3.0.100]# make && make install
- 挂载mfs文件系统
[root@client moosefs-3.0.100]# cd
[root@client ~]# mkdir /opt/mfs '//创建挂载点'
[root@client ~]# modprobe fuse '//加载fuse模块到内核'
[root@client ~]# /usr/local/mfs/bin/mfsmount /opt/mfs -H 192.168.73.100 '//指向master服务器地址'
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@client ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
。。。省略内容
192.168.73.100:9421 fuse.mfs 60G 13G 48G 21% /opt/mfs '//挂载成功'
- mfs优化操作
'//MFS 在客户端安装完毕后, 会生成/usr/local/mfs/bin/目录, 在这个目录下有很多命令是用户所需要的。 为了方便使用这些命令,将/usr/local/mfs/bin 加入到环境变量中'
[root@client ~]# echo "export PATH=/usr/local/mfs/bin:$PATH" >> /etc/profile
[root@client ~]# source /etc/profile
'//mfsgetgoal 命令用来查询文件被复制的份数, 利用-r 命令可以对整个目录进行递归,goal 是指文件被复制的份数'
[root@client ~]# mfsgetgoal -r /opt/mfs
/opt/mfs:
directories with goal 2 : 1
'//命令 mfsgetgoal 用来设置文件被复制的份数, 生产环境 Chunk Server 节点数量应至少大于 2, 文件副本数小于等于 Chunk Server 服务器的数量'
[root@client ~]# mfssetgoal -r 3 /opt/mfs/
/opt/mfs/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
'//创建文件测试一下'
[root@client ~]# cd /opt/mfs
[root@client mfs]# touch aaa.txt
[root@client mfs]# mfsgetgoal aaa.txt
aaa.txt: 3
- 创建MFS监控
- master服务器启动监控程序
[root@master ~]# /usr/local/mfs/sbin/mfscgiserv
mfscgiserv是用python编写的一个web服务器,其监听端口是9425,可以在masster server 上通过 /usr/local/mfs/sbin/mfscgiserv来启动,用户利用浏览器就可以完全监控所有客户挂接、Chunk server、Master server等。
- 访问测试
- 在宿主机浏览器中打开http:192.168.73.100:9425
- 宿主机浏览器打开http://192.168.73.100:9425/mfs.cgi?masterhost=master
- 其中各部分含义如下:
- Info 部分: 显示了 MFS 的基本信息。
- Servers 部分: 列出现有 Chunk Server。
- Disks 部分: 列出现有 Chunk Server 硬盘信息。
- Exports 部分: 列出可被挂载的目录。
- Mounts 部分: 列出被挂载的目录。
- Operations 部分: 显示正在执行的操作。
- Resources 部分: 列出当前存储信息。
- Quitas 部分: 列出当前配额信息。
- Master charts 部分: 显示 Master Server 的操作情况, 读、 写、 删除等操作。
- Server charts 部分: 显示 Chunk Server 的操作情况、 数据传输率及系统状态。
5.学习mfs维护及灾备
-
mfs集群的启动顺序
- (1) 启动 mfsmaster 进程。
- (2)启动所有的 mfschunkserver 进程。
- (3) 启动 mfsmetalogger 进程(如果配置了mfsmetalogger)。
- (4) 在所有的客户端挂载 MFS 文件系统。
-
mfs集群的停止顺序
- (1) 在所有的客户端卸载 MFS 文件系统。
- (2) 用 mfschunkserver stop 命令停止 chunkserver 进程。
- (3) 用 mfsmetalogger stop 命令停止 metalogger 进程。
- (4) 用 mfsmaster stop 命令停止 master 进程
-
mfs灾备恢复
- 整个 MFS 体系中, 直接断电只有 Master 有可能无法启动, 可以在 master 上使用命令
/usr/local/mfs/sbin/mfsmaster -a
修复 - MFS 元数据通常有两部分的数据, 分别如下:
- 1、主要元数据文件 metadata.mfs, 当 mfsmaster 运行时会被命名为 metadata.mfs.back。
- 2、元数据改变日志 changelog.*.mfs, 存储了过去的 N 小时的文件改变(N 的数值是由
BACK_LOGS 参数设置的, 参数的设置在 mfschunkserver.cfg 配置文件中)。 - 3、在 Master 发生故障时, 可以从 MetaLogger 中恢复 Master, 步骤如下
- 4、安装一台 mfsmaster, 利用同样的配置来配置这台 mfsmaster。
- 5、将 metalogger 上 /usr/local/mfs/var/mfs/目录下的文件复制到 master 相应的目录中
[root@master ~]#scp root@192.168.233.132:/usr/local/mfs/var/mfs/* /usr/local/mfs/var/mfs/ - 利用 mfsmetarestore 命令合并元数据changelogs
- [root@master ~]#/usr/local/mfs/sbin/mfsmaster -a
- 如果是全新安装的 Master, 恢复数据后, 要更改 metalogger 和 chunkserver 配置MASTER_HOST 的 IP, 客户端也需要重新挂载
- 整个 MFS 体系中, 直接断电只有 Master 有可能无法启动, 可以在 master 上使用命令
6.灾难测试,恢复测试及其他测试
- client服务器怎么操作都不会影响master
- 客户端强制kill -9杀掉mfsmount进程,需要先umount,然后再mount。否则会提示:
- fuse: bad mount point `/usr/mfstest/': Transport endpoint is not connected
- see: /usr/local/mfs/bin/mfsmount -h for help
- matser、metalogger、chunker、client端,服务器关机(init0)和重启(init6)时,程序都是正常关闭,无需修复。
- 正常启动顺序:matser---chunker---metalogger---client
关闭顺序:client---chunker---metalogger---master
- 但实际中无论如何顺序启动或关闭,未见任何异常。
- 整个mfs体系中,直接断电只有master有可能无法启动。
-使用mfsmetarestore -a修复才能启动,如果无法修复,使用metalogger上的备份日志进行恢复。(几次测试发现:如果mfsmetarestore -a无法修复,则使用metalogger也无法修复)。
-强制使用metadata.mfs.back创建metadata.mfs,可以启动master,但应该会丢失1小时的数据。
-mfs开发小组针对此问题回信:明确表示会丢失故障点到上一个整点之间的数据。和之前我猜测的一致。因为对mfs的操作日志都记录到changelog.0.mfs里面。changelog.0.mfs每小时合并一次到metadata.mfs中,如果突然断电,则changelog.0.mfs里面的信息就没有合并到metadata中,强制使用metadata.mfs.back创建metadata.mfs,就会导致丢失changelog.0.mfs里的数据。
-直接断电测试过程,使用mfsmetarestore –a无法修复,使用metalogger也无法修复的情况较少发生。5次只有一次无法修复。
- chunker的维持:chunker的块(chunks)能够自动复制或删除
-对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的copy份数。但使用-r选项可以更改已经存在的copy份数。
-goal设置为2,只要两个chunker有一个能够正常运行,数据就能保证完整性。
假如每个文件的goal(保存份数)都不小于2,并且没有under-goal文件(可以用mfsgetgoal –r和mfsdirinfo命令来检查),那么一个单一的chunkserver在任何时刻都可能做停止或者是重新启动。以后每当需要做停止或者是重新启动另一个chunkserver的时候,要确定之前的chunkserver被连接,而且要没有under-goal chunks。
-实际测试时,传输一个大文件,设置存储2份。传输过程中,关掉chunker1,这样绝对会出现有部分块只存在chunker2上;启动chunker1,关闭chuner2,这样绝对会有部分块只存在chuner1上。
把chunker2启动起来。整个过程中,客户端一直能够正常传输。
-在客户端查看,一段时间内,无法查看;稍后一段时间后,就可以访问了。文件正常,使用mfsfileinfo 查看此文件,发现有的块分布在chunker1上,有的块分布在chuner2上。
使用mfssetgoal 2和mfssetgoal -r 2均不能改变此文件的目前块的现状。
但使用mfssetgoal -r 1后,所有块都修改成1块了,再mfssetgoal -r 2,所有块都修改成2份了。
-测试chunker端,直接断电情况下,chunker会不会出问题:
a、数据传输过程中,关掉chunker1,等待数据传输完毕后,开机启动chunker1.
chunker1启动后,会自动从chunker2复制数据块。整个过程中文件访问不受影响。
b、数据传输过程中,关掉chunker1,不等待数据传输完毕,开机启动chunker1.
chunker1启动后,client端会向chunker1传输数据,同时chunker1也从chunker2复制缺失的块。
-如果有三台chunker,设置goal=2,则随机挑选2个chunker存储。
-如果有一个chunker不能提供服务,则剩余的2个chunker上肯定有部分chunks保存的是一份。则在参数(REPLICATIONS_DELAY_DISCONNECT = 3600)后,只有一份的chunks会自动复制一份,即保存两份。
保存两份后,如果此时坏掉的chunker能够提供服务后,此时肯定有部分chunks存储了三份,mfs会自动删除一份。
-当我增加第三个服务器做为额外的chunkserver时,虽然goal设置为2,但看起来第三个chunkserver从另外两个chunkserver上复制数据。
-硬盘空间平衡器是独立地使用chunks的,因此一个文件的chunks会被重新分配到所有的chunkserver上。
- chunks修复 :mfsfilerepair
-mfsfilerepair用来处理坏文件(如读操作引起的I/O错误),使文件能够部分可读。在丢失块的情况下使用0对丢失部分进行填充;在块的版本号(version)不匹配时设置块的版本号为master上已知的能在chunkerservers找到的最高版本号;注意:因为在第二种情况下,可能存在块的版本号一样,但内容不匹配,因此建议在文件修复后,对文件进行拷贝(不是快照!),并删除原始文件。
Client端大文件传输过程中,强制拔下master主机电源,造成master非法关闭,使用mfsmetarestore -a修复后,master日志报告有坏块:
Jan 19 17:22:17 ngmaster mfsmaster[3250]: chunkserver has nonexistent chunk (000000000002139F_00000001), so create it for future deletion
Jan 19 17:22:18 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F creation status: 20
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk 000000000002139F has only invalid copies (1) - please repair it manually
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk 000000000002139F_00000001 - invalid copy on (192.168.5.232 - ver:00000000)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: currently unavailable chunk 000000000002139F (inode: 135845 ; index: 23)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: * currently unavailable file 135845: blog.xxx.cn-access_log200904.tar.gz
Client端使用mfsfilerepair修复
[root@localhost mfstest]# /usr/local/mfs/bin/mfsfilerepair blog.xxx.cn-access_log200904.tar.gz
blog.xxt.cn-access_log200904.tar.gz:
chunks not changed: 23
chunks erased: 1
chunks repaired: 0
查看master日志,发现:
Jan 19 17:30:17 ngmaster mfsmaster[3250]: chunk hasn't been deleted since previous loop - retry
Jan 19 17:30:17 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Jan 19 17:35:16 ngmaster mfsmaster[3250]: chunk hasn't been deleted since previous loop - retry
Jan 19 17:35:16 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Client端执行以下操作后,master不再报告相关信息:
mv blog.xxt.cn-access_log200904.tar.gz blog.xxt.cn-access_log200905.tar.gz
- chunker的空间
-每一个chunkserver的磁盘都要为增长中的chunks保留些磁盘空间,从而达到创建新的chunk。只有磁盘都超过256M并且chunkservers报告自由空间超过1GB总量才可以被新的数据访问。最小的配置,应该从几个G 字节的存储。
-每个chunkerserver每次以256M的磁盘空间进行申请,客户端查看得到的磁盘总使用情况的是每个chunkerserver使用量的总和。例如:如果你有3个chunkerserver,7个分区磁盘,每次你的硬盘使用会增加3*7*256MB (大约5GB)。假如你有150T的硬盘空间,磁盘空间就不用过多考虑了。
-另外,如果你的chunkservers使用专用的磁盘,df将显示正确的磁盘使用情况。但是如果你有其他的数据在你的MooseFS磁盘上,df将会计算你所有的文件。
-如果你想看你的MooseFS文件的使用情况,请使用'mfsdirinfo'命令。
- 快照snapshot
-可以快照任何一个文件或目录,语法:mfsmakesnapshot src dst
-但是src和dst必须都属于mfs体系,即不能mfs体系中的文件快照到其他文件系统。
Mfsappendchunks:追加chunks到一个文件
snapshot测试:
a、对一个文件做snapshot后,查看两个文件的块,是同一个块。把原文件删除,原文件删除后(回收站中最初可以看到,但一段时间后,回收站中就彻底删除了),snapshot文件仍然存在,并且可以访问。使用mfsfileinfo查看,发现仍然是原来的块。
b、对一个文件做snapshot后,查看两个文件的块,是同一个块。把原文件修改后,发现原文件使用的块名变了,即使用的是一个新块。而snapshot文件仍然使用原来的块。
- 回收站trash bin
-设置文件或目录的删除时间。一个删除的文件能够存放在“ 垃圾箱”中的时间称为隔离时间, 这个时间可以用mfsgettrashtime 命令来查看,用mfssettrashtime 命令来设置。单位为秒。
-单独安装或挂载MFSMETA 文件系统(mfsmount -m mountpoint),它包含目录/ trash (包含仍然可以被还原的删除文件的信息)和/ trash/undel (用于获取文件)。
-把删除的文件,移到/ trash/undel下,就可以恢复此文件。
-在MFSMETA 的目录里,除了trash 和trash/undel 两个目录,还有第三个目录reserved,该目录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后,reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作。
- 文件描述符
-1.5.12版本,进行大量小文件写时,出现了一个严重错误,有可能和操作系统文件描述符有关。操作系统默认文件描述符为1024.
-1.6.11版本默认为100000
-建议上线时,master和chunker修改文件描述符,即修改/etc/security/limits.conf添加
* - nofile 65535
- mfscgiserv
-Mfscgiserv 是一个python 脚本, 它的监听端口是9425 ,使用/usr/local/mfs/sbin/mfscgiserv 来直接启动,使用浏览器就可全面监控所有客户挂接, chunkserver 及master server,客户端的各种操作等。