MFS即moosefs,可以提供容量PB级别的共享存储,无需昂贵的专业硬件设备,自身拥有冗余功能及动态扩容功能,保证数据的安全性。分布式文件系统把数据分散存储在不同的服务器上,读取数据的时候相当于同时读取,不像NFS是一对多的关系,而是多对多的关系,这样可以使得性能得到大幅提升。本篇博客将使用MFS搭建分布式文件系统,使其具有容错功能,高可用,可扩展的功能。
一、工作原理
1. 分布式原理
分布式文件系统(Distributed File System)就是把一些分散在多台计算机上的共享文件夹,集合到一个文件夹内(虚拟共享文件夹),用户要访问这些共享文件夹的时候,只要打开虚拟共享文件夹,就可以的看到所有链接到此文件夹内的共享文件夹,用户感觉不到这些共享文件夹是分散于各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾、提高文件夹存取性能
2. MFS原理
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
(1)MFS文件系统的组成
元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据,目前不支持高可用。
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,当master服务器损坏,可以从日志服务器中取得文件恢复。
数据存储服务器(Chunk Server):真正存储数据的服务器,服务器越多,容量就越大,可靠性越高,性能越好。
客户端(Client):可以像挂载NFS一样 挂载MFS文件系统
(2)MFS读数据的处理过程
1)客户端向元数据服务器发出读请求
2)元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
3)客户端向已知的Chunk Server请求发送数据
4)Chunk Server向客户端发送数据
(3)MFS写入数据的处理过程
1)客户端向元数据服务器发送写入请求
2)元数据服务器与Chunk Server进行交互,但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由Chunk Servers告知元数据服务器操作成功
3)元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
4)客户端向指定的Chunk Server写入数据
5)该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
6)客户端告知元数据服务器本次写入完毕
二、实验案例
公司之前的存储服务器采用的是NFS,随着业务的增加,多台服务器通过NFS共享一个服务器的存储空间,使得NFS服务器不堪重负,经常出现超时的问题。且存在着单点故障问题,尽管可以用rsync同步数据到另外一台服务器上做备份,但性能方便没有任何提升。基于这一需求,选择的解决方案是采用MFS分布式文件系统,服务器间的数据访问不再是一对多的关系,而是多对多的关系,这样可以使得性能得到大幅提升。具体的拓扑图如下图所示:
主机 |
IP地址 |
主要软件 |
Master |
192.168.1.100 |
mfs-1.6.27-5.tar.gz |
MetaLogger |
192.168.1.101 |
mfs-1.6.27-5.tar.gz |
Chunk Server1 |
192.168.1.102 |
mfs-1.6.27-5.tar.gz |
Chunk Server2 |
192.168.1.103 |
mfs-1.6.27-5.tar.gz |
Client |
192.168.1.104 |
mfs-1.6.27-5.tar.gz fuse-2.9.2.tar.gz |
实验步骤:
1. 搭建Master Server
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序运行用户 > --with-default-group=mfs \ //指定程序运行组 > --disable-mfschunkserver \ //禁用Chunk功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist [root@localhost mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg //主配置文件 [root@localhost mfs]# cp mfsexports.cfg.dist mfsexports.cfg //被挂载目录及权限配置文件 [root@localhost mfs]# cp mfstopology.cfg.dist mfstopology.cfg [root@localhost mfs]# cd /usr/local/mfs/var/mfs/ [root@localhost mfs]# ls metadata.mfs.empty [root@localhost mfs]# cp metadata.mfs.empty metadata.mfs //存放master的变化信息 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmaster start //启动mfsmaster服务 loading sessions ... file not found //第一次启动mfsmaster服务会出现错误 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmaster restart //重启服务就OK了 [root@localhost mfs]# netstat -anpt |grep mfs tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 10204/mfsmaster tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 10204/mfsmaster tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 10204/mfsmaster
2. 搭建Metalogger Server
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序运行用户 > --with-default-group=mfs \ //指定程序运行组 > --disable-mfschunkserver \ //禁用Chunk功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist [root@localhost mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg [root@localhost mfs]# vim mfsmetalogger.cfg //修改配置文件 MASTER_HOST = 192.168.1.100 //去掉注释,添加master服务器的ip地址 [root@localhost mfs]# /usr/local/mfs/sbin/mfsmetalogger start root@localhost mfs]# netstat -anpt |grep mfs tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 13456/mfsmetalogger
3. 搭建Chunk Server(二台chunk的搭建步骤相同)
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# useradd -s /sbin/nologin mfs [root@localhost ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序运行用户 > --with-default-group=mfs \ //指定程序运行组 > --disable-mfsmaster \ //禁用mfsmaster功能 > --disable-mfsmount \ //禁用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@localhost mfs]# ls mfschunkserver.cfg.dist mfshdd.cfg.dist [root@localhost mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg [root@localhost mfs]# cp mfshdd.cfg.dist mfshdd.cfg [root@localhost mfs]# vim mfschunkserver.cfg MASTER_HOST = 192.168.1.100 //去掉注释,添加master服务器的ip地址 [root@localhost mfs]# vim mfshdd.cfg //添加一行 /data //这是给MFS的分区,生产环境下最好使用独立的分区或磁盘挂载到此目录下 [root@localhost mfs]# mkdir /data [root@localhost mfs]# chown -R mfs:mfs /data [root@localhost mfs]# /usr/local/mfs/sbin/mfschunkserver start [root@localhost mfs]# netstat -anpt | grep mfs tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 9668/mfschunkserver tcp 0 0 192.168.1.102:41168 192.168.1.100:9420 ESTABLISHED 9668/mfschunkserver
4. 客户端配置
[root@localhost ~]# service iptables stop [root@localhost ~]# yum -y install zlib-devel [root@localhost ~]# tar zxf fuse-2.9.2.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/fuse-2.9.2/ //MFS依赖于FUSE [root@localhost fuse-2.9.2]# ./configure && make && make install [root@localhost fuse-2.9.2]# vim /etc/profile //设置环境变量,添加两行 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export PATH=/usr/local/mfs/bin:$PATH [root@localhost fuse-2.9.2]# source /etc/profile [root@localhost fuse-2.9.2]# useradd -s /sbin/nologin mfs [root@localhost fuse-2.9.2]# tar zxf /root/mfs-1.6.27-5.tar.gz -C /usr/src/ [root@localhost fuse-2.9.2]# cd /usr/src/mfs-1.6.27/ [root@localhost mfs-1.6.27]# ./configure --prefix=/usr/local/mfs \ > --with-default-user=mfs \ //指定程序运行用户 > --with-default-group=mfs \ //指定程序运行组 > --disable-mfsmaster \ //禁用mfsmaster功能 > --disable-mfschunkserver \ //禁用Chunk功能 > --enable-mfsmount \ //启用mfsmount功能 [root@localhost mfs-1.6.27]# make && make install [root@localhost mfs-1.6.27]# mkdir /mnt/mfs //创建挂载点 [root@localhost mfs-1.6.27]# modprobe fuse //加载fuse模块 [root@localhost mfs-1.6.27]# mfsmount /mnt/mfs/ -H 192.168.1.100 //挂载 mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root [root@localhost mfs-1.6.27]# df -Th //查看挂载情况 192.168.1.100:9421 fuse.mfs 24G 0 24G 0% /mnt/mfs [root@localhost mfs-1.6.27]# mfsgetgoal -r /mnt/mfs/ //查询文件被复制的份数 /mnt/mfs/: directories with goal 1 : //生产环境下Chunk Server节点数量应大于2,文件副本数小于Chunk server服务器的数量 //由于我有二台Chunk Server 我将副本数量设置为1 [root@localhost mfs-1.6.27]# mfssetgoal -r 1 /mnt/mfs/ //设置文件被复制的份数 /mnt/mfs/: inodes with goal changed: 1 inodes with goal not changed: 0 inodes with permission denied: 0 [root@localhost mfs-1.6.27]# cd /mnt/mfs/ [root@localhost mfs]# touch test //创建测试文件 [root@localhost mfs]# mfsgetgoal test test: 1
分别打开两台chunk查看/data下,都产生了加密的数据
[root@localhost ~]# cd /data/ [root@localhost data]# ls 00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA 01 0B 15 1F 29 33 3D 47 51 5B 65 6F 79 83 8D 97 A1 AB B5 BF C9 D3 DD E7 F1 FB 02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE E8 F2 FC 03 0D 17 21 2B 35 3F 49 53 5D 67 71 7B 85 8F 99 A3 AD B7 C1 CB D5 DF E9 F3 FD 04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE 05 0F 19 23 2D 37 41 4B 55 5F 69 73 7D 87 91 9B A5 AF B9 C3 CD D7 E1 EB F5 FF 06 10 1A 24 2E 38 42 4C 56 60 6A 74 7E 88 92 9C A6 B0 BA C4 CE D8 E2 EC F6 07 11 1B 25 2F 39 43 4D 57 61 6B 75 7F 89 93 9D A7 B1 BB C5 CF D9 E3 ED F7 08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8 09 13 1D 27 31 3B 45 4F 59 63 6D 77 81 8B 95 9F A9 B3 BD C7 D1 DB E5 EF F9
5. mfs监控
mfscgiserv是用python编写的一个web服务器,其监听端口是9425,可以再masster server 上通过 /usr/local/mfs/sbin/mfscgiserv来启动,用户利用浏览器就可以完全监控所有客户挂接、Chunk server、Master server等。
在Masster Server执行以下命令
[root@localhost ~]# /usr/local/mfs/sbin/mfscgiserv lockfile created and locked starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi) [root@localhost ~]# iptables -I INPUT -p tcp --dport 9425 -j ACCEPT
在一台客户端上通过浏览器访问http://192.168.1.100:9425,如下图所示:
其中各部分含义如下:
Info:显示了MFS的基本信息
Servers:列出现有的Chunk Server
Disks:列出现有的Chunk Server硬盘信息
Exports:列出了可被挂载的目录
Mounts:列出了被挂载的目录
Operations:显示正在执行的操作
Master charts:显示了Master Server的操作情况,读、写删除等操作
Server charts:显示了Chunk Server的操作情况、传输速率及系统状态
6. MFS维护及灾难恢复
1)MFS集群的启动与停止
MFS集群的启动顺序如下:
(1)启动mfsmaster进程
(2)启动所有的mfsChunkserver进程
(3)启动mfsmetalogger进程
(4)在所有客户端上挂载NFS文件系统
MFS集群的停止顺序如下:
(1)在所有客户端卸载MFS挂载
(2)停止Chunkserver进程
(3)停止mfsmetalogger进程
(4)停止mfsmaster进程
2)MFS灾难恢复
整个MFS体系中,直接断电只有master server进程有可能无法启动,可以在master上使用命令/usr/local/mfs/sbin/mfsmetarestore -a修复
我们将master server 直接断电,在重新开机,结果如下:
[root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start //启动失败 init: file system manager failed !!! error occured during initialization - exiting [root@localhost ~]# /usr/local/mfs/sbin/mfsmetarestore -a //修复 [root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start //启动成功
MFS元数据通常有两部分的数据,分别如下:
(1)主要元数据文件metadata.mfs,当mfsmaster运行时会被命名为metadata.back.mfs。
(2)元数据改变日志 changelog.*.mfs,存储了过去N小时的文件变更。
在Master 发生故障时,可以从MetaLogger中恢复,步骤如下:
(1)安装一台mfsmaster,利用同样的配置来配置这台mfsmaster,mfsmaster进程先不要启动
(2)将metalogger上/usr/local/mfs/var/mfs/目录下所有文件复制到mfsmaster相应的目录中。
(3)利用mfsmetarestore命令合并数据元changelogs。
[root@localhost ~]# scp [email protected]:/usr/local/mfs/var/mfs/* /usr/local/mfs/var/mfs/ [root@localhost ~]# /usr/local/mfs/sbin/mfsmetarestore -m metadata_ml.mfs.back -o metadata.mfs changelog_ml.*.mfs [root@localhost ~]# /usr/local/mfs/sbin/mfsmaster start
注意:如果是全新安装的master,恢复数据后,需要更改metalogger和chunkserver,配置MASTER_HOST的IP地址,客户端也需要重新挂载mfs目录。