MFS 分布式文件系统
一、MFS企业应用场景
多台web服务器通过nfs共享一个存储,虽然业务上满足需求,但在性能与容量上无法胜任更高的要求,nfs服务器不堪重负,出现超时问题,同时也存在单点故障问题。尽管可以使用rsync同步数据到另一台服务器上做nfs服务的备份,但对提高整个系统的性能毫无帮助。可对nfs进行优化或者采取别的解决方案,但是优化并不能满足日益增多的客户端的性能要求。
解决方案是采用分布式文件系统。采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系,而是多对多的关系(即多web服务器对多文件服务器),这样可以使性能得到大幅提升。
MFS分布式文件系统,即moosefs,可提供容量PB级别的共享存储,无需昂贵的专业硬件服务器便可完成构件。具有冗余容错功能,高可用、可扩展的海量级别分布式文件系统,保证数据的安全性。
MFS把数据分散在多台服务器上,但用户看到的只是一个源。
二、MFS分布式文件系统的原理
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接本地节点上,而是通过计算机网络与节点相连。就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有连接到虚拟共享文件夹内的共享文件,用户感觉不到这些共享文件夹是分散于各个计算机上的。
- 好处:集中访问、简化操作、数据容灾、提高文件存取性能、在线扩容。
- MFS时一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈献给用户的是一个统一的资源,对于这个统一的源,可挂载使用。
组成 | 作用 |
---|---|
master 元数据服务器 | 在整个系统中负责管理文件系统,维护元数据。 |
metalogger 元数据日志服务器 | 备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当master服务器数据丢失或损坏,可以从日志服务器中取得文件恢复。 |
chunk server 数据存储服务器 | 真正存储数据的服务器。存储文件时,会把文件分块保存,并在数据服务器之间复制,数据服务器越多,能使用的容量越大,可靠性越高,性能越好。 |
客户端 client | 可以像挂载nfs一样挂载mfs文件系统,操作相同。 |
-
MFS 读取数据的处理过程
客户端(client)向元数据服务器(master)发出读请求——>元数据服务器把所需数据存放的位置(chunk server的IP地址和chunk编号)告知客户端——>客户端向已知的chunk server请求发送数据——>chunk server向客户端发送数据 -
MFS 写入数据的处理过程
客户端(client)向元数据服务器(master)发送写请求——>元数据服务器与chunk server进行交互(只有当所需的分块chunks存在的时候进行这个交互),但元数据服务器只在某些服务器创建新的分块chunks,创建完告知元数据服务器操作成功——>元数据服务器告知客户端,可以在哪个chunk server的哪些chunks写入数据——>客户端向指定的chunk server写入数据——>该chunk server与其他chunk server进行数据同步,之后chunk server告知客户端数据写入成功——>客户端告知元数据服务器本次写入完毕
三、模拟搭建mfs文件系统
服务器 | IP | 提前准备 |
---|---|---|
master | 192.168.2.11 | mfs-1.6.27 |
metalogger | 192.168.2.12 | mfs-1.6.27 |
chunk server1 | 192.168.2.13 | mfs-1.6.27 增加一块5G硬盘 |
chunk server2 | 192.168.2.14 | mfs-1.6.27 增加一块5G硬盘 |
chunk server3 | 192.168.2.15 | mfs-1.6.27 增加一块5G硬盘 |
client | 192.168.2.16 | mfs-1.6.27、fuse-2.9.2 |
由于自己搭建的时候不太方便同时写博客,搭建成功了才写的,大家学习搭建的时候完全可以将这部分复制成一个脚本执行。当然前提你要做好上面的环境准备,自行百度下载,(不用纠结版本)
1.master 配置
useradd -M -s /sbin/nologin mfs
yum -y install zlib-devel
tar -xf mfs-1.6.27-5.tar.gz -C /usr/src/
cd /usr/src/mfs-1.6.27/
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount && make && make install
cd /usr/local/mfs/etc/mfs/
ls
mfsexports.cfg.dist mfsmetalogger.cfg.dist
mfsmaster.cfg.dist mfstopology.cfg.dist
#被挂载目录及权限配置文件
cp mfsexports.cfg.dist mfsexports.cfg
#主配置文件
cp mfsmaster.cfg.dist mfsmaster.cfg
cp mfstopology.cfg.dist mfstopology.cfg
cd /usr/local/mfs/var/mfs/
cp metadata.mfs.empty metadata.mfs
/usr/local/mfs/sbin/mfsmaster start
#验证是否启动
ps aux |grep mfs|grep -v grep
2.搭建 metalogger server(换虚拟机了,注意,对应IP,别搞混了)
useradd -M -s /sbin/nologin mfs
yum -y install zlib-devel
tar xf mfs-1.6.27-5.tar.gz -C /usr/src/
cd /usr/src/mfs-1.6.27/
.configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount && make && make install
cd /usr/local/mfs/etc/mfs/
cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
vim mfsmetalogger.cfg
MASTER_HOST=192.168.2.11 //元数据服务器的master的IP地址
这个步骤用sed能改,自己思考一下,但建议还是亲自打开修改,以免失误
ll -d /usr/local/mfs/var/mfs/
/usr/local/mfs/sbin/mfsmetalogger start
ps aux |grep mfs |grep -v grep
3.搭建三台chunk server(三台方法相同)
fdisk -l|grep /dev/
fdisk /dev/sdb
接下来的步骤是对/dev/sdb分区和格式化,分一个区,大小直接回车,w保存
partx -a /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir /data
mount /dev/sdb1 /data/
chown -R mfs.mfs /data/
df -hT
man partx
The partx is not an fdisk program -- adding and removing partitions does not change the disk, it just tells the kernel about the presence and numbering of on-disk partitions.
useradd -M -s /sbin/nologin mfs
yum -y install zlib-devel
tar xf mfs-1.6.27-5.tar.gz -C /usr/src/
cd /usr/src/mfs-1.6.27/
./configure --prefix=/usr/loca/mfs --with-default-user-mfs --with-default-group=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount && make && make install
cd /usr/local/mfs/etc/mfs
ls
mfschunkserver.dist mfshdd.cfg.dist
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
MASTER_HOST=192.168.2.11
可以用sed解决 sed -i -e '/MASTER_HOST/s/#//;/MASTER_HOST/s/mfsmaster/192.168.2.11/' mfschunkserver.cfg
vim mfshdd.cfg
/data //添加此行,/data是给mfs的分区,生产环境最好是使用一个独立的分区或独立的磁盘挂载到此目录
可以用 echo '/data' >>/usr/local/mfs/etc/mfs/mfshdd.cfg
/usr/local/mfs/sbin/mfschunkserver start
ps aux |grep mfs |grep -v grep
由于三台服务器配置相同,为了提高效率,可以将我这段代码整理成shell脚本实现,在完成分区和格式化后,执行此脚本。
还有一种好方法,用ansible实现,将这些IP加入主机清单,快的很,我写到这儿的时候,已经很不耐烦了,希望大家能够用ansible实现。不知道ansible不要紧,参考本人博客https://www.cnblogs.com/liuwei-xd/p/11108837.html
4.客户端(client)的配置
useradd -M -s /sbin/nologin mfs
yum -y install zlib-devel
tar xf fuse-2.9.2.tar.gz -C /usr/src/
tar xf mfs-1.6.27-5.tar.gz -C /usr/src/
cd /usr/src/fuse-2.9.2/
./configure && make && make install
cd
echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> /etc/profile
echo "export PATH=$PATH:/usr/local/mfs/bin/" >> /etc/profile
./etc/profile
cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount && make && make install
mkdir /mnt/mfs
modprobe fuse
mfsmount /mnt/mfs/ -H 192.168.2.11
df -hT //验证是否挂载成功
四、MFS的一些常用操作
- mfsgetgoal命令:用来查询文件被复制的份数。-r:可以对整个目录递归式查询
- mfssetgoal命令:可以设置文件被复制的份数。生产环境里面chunk server的数量至少大于2,文件副本得小于等于chunk server的数量。
客户端创建文件测试:
touch /mnt/mfs/test
mfsgetgoal /mnt/mfs/test
/mnt/mfs/test:3
五、MFS监控
mfscgiserv
是用Python编写的一个web服务器,其监听端口是9425
,可以在master server上通过一个命令/usr/loca/mfs/sbin/mfscgiserv
来启动。用户可以通过浏览器就可以全面监控所有客户,chunk server、master server以及客户端的各种操作。
http://192.168.2.11:9425
六、MFS维护与灾难恢复
- MFS集群的启动与停止
启动的顺序如下:
启动mfsmaster进程——>启动所有的mfschunkserver进程——>启动mfsmetalogger进程——>在所有的客户端挂载MFS文件系统
停止的顺序如下:
在所有的客户端卸载MFS文件系统——>用mfschunkserver -s命令停止chunkserver进程——>用mfsmetalogger -s停止metalogger进程——>用mfsmaster -s停止master进程
2. MFS灾难恢复
直接断电后,会导致master可能无法启动,在master端可以用/usr/loca/mfs/sbin/mfsmetarestore -a恢复
3.master发生故障时,可以从metalogger中恢复master,步骤如下:
1)安装以前配置再安装一台mfsmaster
2)将metalogger上/usr/local/mfs/var/mfs/目录下的文件复制到mfsmaster相应的目录中
在metalogger端执行
scp /usr/loca/mfs/var/mfs/* 192.168.2.11:/usr/local/mfs
在master端执行
cd /usr/local/mfs
/usr/local/mfs/sbin/mfsmetarestore -m metadate_ml.mfs.back -o
会显示一串ok
MFS分布式文件系统到此模拟实验完毕,博主纯手打,大家练习的时候有问题先检查一下是否有手误,再去百度。做./configure的时候一定要细心,其实分清楚在哪个IP上做的是哪个选项,你就明白了mfs分布式文件系统的原理了。