1、分布式文件系统简介
分布式文件系统(Distrbuted File System)是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。分布式文件系统的好处是集中访问、简化操作、数据容灾、提高文件存取性能。
1.1 SAN和MFS比较

当我们存储服务器的容量达到瓶颈之后,那我们就需要采用分布式的文件系统来扩大存储容量,类似于百度云的存储,也是采用分布式存储!
mooseFS(moose 驼鹿)是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
1.2 MFS 的特征
- 层析结构(目录树) 
- 存储文件属性(权限,访问和修改时间) 
- 支持特殊文件(块设备,字符设备,管道) 
- 符号链接,软硬链接 
- 对文件系统访问可以通过IP地址或者密码进行访问限制 
- 高可靠(数据的多个拷贝存储在不同的计算机上) 
- 通过附加新的计算机或者硬盘可以实现容量的动态拓展 
- 删除文件可以根据一个可配置的时间周期进行保留 
- 不受访问和写入影响的文件连贯快照 
1.3 MooseFS

安装和帮助文档:http://www.moosefs.org/reference-guide.html
1.4 MFS分布式文件系统部署方案
MooseFS 是一种分布式文件系统,MooseFS 文件系统结构包括以下四种角色:
- 管理服务器(元数据服务器) managing server (master server):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。目前版本只魂单个Master服务器,存在单点故障的风险,建议采用性能稳定的服务器充当。
- 元数据日志服务器 Metalogger server(Metalogger):负责备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs,当Master服务器数据丢失或者损坏,可以从日志服务器中取得文件恢复。
- 数据存储服务器 data servers (chunk servers ) :听从管理服务器调度,提供存储空间,并为客户提供数据传输.。 真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器 chunkserver之间复 制(复制份数可以手工指定,建议设置副本数为 3)。数据服务器可以是多个,并且数量越多,可使用的“磁盘空间”越大,可靠性也越高。
- 客户机挂载使用 client computers :挂载进程 mfs 服务器共享出的存储并使用。 通过 fuse 内核接口挂载进程管理服务器上所管理的数据存储服务器共享出的硬盘。 共享的文件系统的用法和 nfs 相似。 使用 MFS 文件系统来存储和访问的主机称为 MFS 的客户端,成功挂接 MFS 文件系统以后,就可以像以前使用 NFS 一样共享这个虚拟性的存储了。

1.5 MFS对数据的处理过程
MFS读取数据的处理过程

- 客户端向元数据服务器发出读请求 
- 元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知 客户端 
- 客户端向已知的Chunk Server请求发送数据 
- Chunk Server向客户端发送数据 
MFS写入数据的处理过程

- 客户端向元数据服务器发送写入请求 
- 元数据服务器与Chunk Server进行交互,但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由Chunk Servers告知元数据服务器操作成功 
- 元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据 
- 客户端向指定的Chunk Server写入数据 
- 该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功 
- 客户端告知元数据服务器本次写入完 

1.6 MFS 端口关系图

端口号:
9420:MFS master和MFS chunck通信端口
9421:MFS master和MFS Client端通信端口
9419:MFS master和MFS metalogger端通信端口
9422:MFS chunck 和MFS Client端通信端口
9425:MFS master web界面监听端口,查看整体运行状态
2、搭建MFS文件系统
环境配置
| 主机 | 操作系统 | IP地址 | 主要软件 | 
|---|---|---|---|
| Master | CentOS 6.5 x86_64 | 192.168.1.100 | mfs-1.6.27-5.tar.gz | 
| MetaLogger | CentOS 6.5 x86_64 | 192.168.1.101 | mfs-1.6.27-5.tar.gz | 
| Chunk Server1 | CentOS 6.5 x86_64 | 192.168.1.102 | mfs-1.6.27-5.tar.gz | 
| Chunk Server2 | CentOS 6.5 x86_64 | 192.168.1.103 | mfs-1.6.27-5.tar.gz | 
| Chunk Server3 | CentOS 6.5 x86_64 | 192.168.1.104 | mfs-1.6.27-5.tar.gz | 
| Client | CentOS 6.5 x86_64 | 192.168.1.105 | mfs-1.6.27-5.tar.gz fuse-2.9.2.tar.gz | 
2.1 搭建Master Server
2.1.1 关闭防火墙,并安装好依赖包
| 1 | [root@centos1 ~]# service iptables stop | 
2.1.2 创建运行用户
| 1 | [root@centos1 ~]# useradd mfs -s /sbin/nologin | 
2.1.3 安装源码包
| 1 | [root@centos1 ~]# tar xf mfs-1.6.27-5.tar.gz | 
2.1.4 复制相关文件
| 1 | [root@centos1 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ | 
2.1.5 了解配置文件
(无需改动)
需要用到的配置文件有两个:mfsmaster.cfg(主配置文件)和mfsexports.cfg(被挂载目录及权限配置文件)
mfsmaster.cfg文件常用参数如下:
| 1 | [root@centos1 mfs]# cd /usr/local/mfs/etc/mfs/ | 
mfsexports.cfg文件参数如下:
| 1 | # Allow everything but "meta". | 
mfsexports.cfg 文件每一条由三部分组成,第一部分表示客户端的 IP 地址,第二部分表示被挂接的目录,第三部分表示客户端拥有的权限,下面对三给部分迚行解释
| 1 | 1.客户端 IP 地址 | 
2.1.6 启动Master Server
| 1 | [root@centos1 mfs]# /usr/local/mfs/sbin/mfsmaster start | 
2.2 搭建MetaLogger Server
2.2.1 关闭防火墙,并安装好依赖包
| 1 | [root@centos2 ~]# service iptables stop | 
2.2.2 创建运行用户
| 1 | [root@centos2 ~]# useradd mfs -s /sbin/nologin | 
2.2.3 安装源码包
| 1 | [root@centos2 ~]# tar xf mfs-1.6.27-5.tar.gz | 
2.2.4 复制相关文件
| 1 | [root@centos1 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ | 
2.2.5 编辑配置文件
修改 META_DOWNLOAD_FREQ 和 MASTER_HOST 部分
| 1 | [root@centos2 mfs]# vim mfsmetalogger.cfg# WORKING_USER = mfs | 
2.2.6 启动MetaLogger Server
| 1 | [root@centos2 mfs]# /usr/local/mfs/sbin/mfsmetalogger start | 
2.3 搭建Chunk Server 01 ,02 ,03
2.3.1 关闭防火墙,并安装好依赖包
| 1 | [root@centos3 ~]# service iptables stop | 
2.3.2 创建运行用户
| 1 | [root@centos3 ~]# useradd mfs -s /sbin/nologin | 
2.3.3 安装源码包
| 1 | [root@centos3 ~]# tar xf mfs-1.6.27-5.tar.gz | 
2.3.4 复制相关文件
| 1 | [root@centos3 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ | 
2.3.5 编辑配置文件
修改 MASTER_HOST 部分
| 1 | [root@centos3 mfs]# vim mfsmetalogger.cfg# WORKING_USER = mfs | 
2.3.6 添加,并挂载目录
| 1 | [root@centos3 mfs]# vim mfshdd.cfg | 
2.3.7 启动mfschunkserver
| 1 | [root@centos3 mfs]# /usr/local/mfs/sbin/mfschunkserver start | 
2.4 客户端配置
2.4.1 关闭防火墙,并安装好依赖包
| 1 | [root@centos6 ~]# service iptables stop | 
2.4.2 安装FUSE
| 1 | [root@centos6 ~]# tar xf fuse-2.9.2.tar.gz | 
2.4.3 配置环境变量
| 1 | [root@centos6 ~]# vim /etc/profile | 
2.4.4 安装MFS客户端
| 1 | [root@ centos6 ~]# useradd mfs -s /sbin/nolgoin | 
2.4.5 挂载MFS文件系统
| 1 | [root@centos6 mfs-1.6.27]# mkdir /mnt/mfs | 
2.4.6 添加环境变量
| 1 | [root@centos6 mfs]# vim /etc/profile | 
mfsgetgoal命令用来查询文件被复制的份数,利用 -r 命令可以对整个目录进行递归,goal是指文件被复制的份数。
| 1 | [root@centos6 mfs]# mfsgetgoal -r /mnt/mfs/ | 
命令mfsgetgoal用来设置文件被复制的份数,生产环境Chunk Server节点数量应至少大于2文件副本数小于等于Chunk Server服务器的数量。
| 1 | [root@centos6 mfs]# mfssetgoal -r 3 /mnt/mfs/ | 
2.4.7 创建测试文件
| 1 | [root@centos6 mfs]# touch test.a | 
2.4.8 MFS监控
Mfscgiserv是用python编写程序的服务器,其监听端口是9425,可以在Master Server上通过命令/usr/local/mfs/sbin/nfscgiserv来启动,用户利用浏览器就可全面监控所有客户挂接,Chunk Server、Master Server,以及客户端的各种操作等。
| 1 | [root@centos1 mfs]# /usr/local/mfs/sbin/mfscgiserv | 
在一台客户端上通过浏览器访问http://192.168.1.100:9425 ,如下图所示:

其中部分的含义如下 :
Info部分:显示了MFS的基本信息。
Servers部分:列出现有Chunky Server。
Disks部分:列出现有Chunky Server硬盘信息。
Exports部分:列出可被挂载的目录。
Mounts部分:列出被挂载的目录。
Operations部分:显示正在执行的操作。
Master Charts部分:显示Master Server的操作情况,读、写、删除等操作。
Server Charts部分:显示Chunk Server的操作情况,数据传输率及系统状态。
2.5 MFS维护及灾难恢复
2.5.1 MFS集群的启动停止
MFS集群启动的顺序如下:
- 启动mfsmaster进程
- 启动所有的mfschunkserver进程
- 启动mfsmetalogger进程(如果配置了mfsmetalogger)
- 在所有的客户端挂载MFS文件系统
MFS集群停业的顺序如下:
- 在所有的客户端卸载MFS文件系统
- 用mfschunkserver -s 命令停止chunkserver进程
- 用mfsmetalogger -s 命令停止 metalogger进程
- 用mfsmaster -s 命令停止master进程
2.5.2 MFS灾难恢复
整个MFS体系中,直接断电只有Master有可能无法启动,可以在master上使用命令/usr/local/mfs/sbin/mfsmetarestore -a 修复
2.5.2.1 MFS元数据通常有两部分的数据,分别如下:
- 主要元数据文件metadata.mfs,当mfsmaster运行时会被命名为metadata.mfs.back
- 元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变(N的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg配置文件中)
断电后在Master Server上执行/usr/local/mfs/sbin/mfsmetarestore -a 修复
| 1 | [root@centos1 ~]# /usr/local/mfs/sbin/mfsmetarestore -a | 
在客户端上查看文件是否存在
| 1 | [root@centos6 mfs]# cd /mnt/mfs | 
2.5.2.2 在Master发生故障时,可以从MetaLOgger中恢复Master,步骤如下:
- 安装一台mfsmaster,利用同样的配置来配置这台mfsmaster。
- 将metalogger上/usr/local/mfs/var/mfs/目录下的文件复制到mfsmaster相应的目录中。
| 1 | [root@centos1 ~]# cd /usr/local/mfs/var/mfs/ | 
- 利用mfsmetarestore命令合并元数据changelogs,可以用自动恢复模式mfsmetarestore –a,也可以利用非自动化恢复模式。
指定实际的文件名 mfsmetarestore 语法,例如。
| 1 | [root@centos1 ~]# $mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs | 
强制使用metadata.mfs.back创建metadata.mfs,可以启动master,但丢失的数据暂无法确定。
注:如果是全新安装的Master,恢复数据后,要更改metalooger和chunkserver配置MASTER_HOST的IP,客户端也需要重新挂载。
2.6 MFS的常见问题和建议对策
2.6.1 Master性能瓶颈
master本身的性能瓶颈。
短期对策:按业务切分
2.6.2 体系架构存储文件总数的瓶颈
mfs把文件系统的结构缓存到master的内存中,个人认为文件越多,master的内存消耗越大,8g对应2500kw的文件数,2亿文件就得64GB内存。
短期对策:按业务切分
2.6.3 单点故障解决方案(可参考以下)
Drbd+heartbeat+Moosefs分布式存储双机冗余
http://wenku.baidu.com/view/825d69f9aef8941ea76e055e.html
2.6.4 垃圾回收
默认的垃圾回收时间是86400,存在一种可能性是垃圾还没回收完,你的存储容量就暴掉了。
方案一:设置垃圾回收时间,积极监控存储容量。
经过测试,把垃圾回收时间设置300秒,完全可以正确回收容量。
方案二:手动周期性去删除metamfs里的trash目录下的文件(健壮性还有待测试,反正删除后容量是回收了,不晓得有没有什么后遗症。)
2.6.5 理想的平均写和读的速度是多少?
原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬盘和网络的吞吐量越好,整个系统的性能也就会越好。官方的测试环境中,将MFS安装在linux(Debian)上设置存储的份数为2,一般的测试服务器(还做了其他较大量的计算),G太网络,使用Pbyte级别的数据,测试的结果为写的速度大约在20-30MB/s,读的速度为30-50MB/s。对于小文件写的速度有些下降,但是对于读的速度是没有影响的。
2.6.6 设置文件存储的份数是否影响写/读的速度?
一般来说,它是有影响的。在一定条件下,存储份数的设置会影响的读取的速度。例如,当文件设置存储两份而不是一份时能加快对同一文件有多个客户端读取的速度。但是在真实的环境中,多个机器同时读取同一个文件的机率是比较小的,因此,存储份数的设置对读取的速度影响是比较小的。
同样,设置存储份数对写的速度影响也是不太大的。(只有文件超过64M的时候)