MFS即moosefs,可以提供容量PB级别的共享存储,无需昂贵的专业硬件设备,自身拥有冗余功能及动态扩容功能,保证数据的安全性。分布式文件系统把数据分散存储在不同的服务器上,读取数据的时候相当于同时读取,不像NFS是一对多的关系,而是多对多的关系,这样可以使得性能得到大幅提升。本篇博客将使用MFS搭建分布式文件系统,使其具有容错功能,高可用,可扩展的功能。


一、工作原理

1. 分布式原理

    分布式文件系统(Distributed File System)就是把一些分散在多台计算机上的共享文件夹,集合到一个文件夹内(虚拟共享文件夹),用户要访问这些共享文件夹的时候,只要打开虚拟共享文件夹,就可以的看到所有链接到此文件夹内的共享文件夹,用户感觉不到这些共享文件夹是分散于各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾、提高文件夹存取性能


2. MFS原理

    MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。

(1)MFS文件系统的组成

MFS分布式文件系统_第1张图片

元数据服务器(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分布式文件系统,服务器间的数据访问不再是一对多的关系,而是多对多的关系,这样可以使得性能得到大幅提升。具体的拓扑图如下图所示:


MFS分布式文件系统_第2张图片 

主机

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,如下图所示:

MFS分布式文件系统_第3张图片

其中各部分含义如下:

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目录。