背景:
前段时间机房搬迁,于是就暴漏了很多问题,线上很多服务器开户都已经开满了,于是就要添加服务器,经理就突然给了我一个任务,测试下MFS文件系统的性能,之前的服务器都是用个NFS存储。于是这个MFS测试实验就诞生了。ps:由于内网的IP我ping不通,所以我就使用外网IP了

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

2.MFS整体架构的四种角色
mfsmaster-管理服务器:负责整个数据存储服务器的整体运行,为mfs客户端的挂载后的读写进行中心调度。该角色只能存在一个;
mfsmetalogger-元数据日志服务器:负责记录管理服务器变化的日志,方便理解我就将其理解为master的备份,将其想象为mysql的二进制日志,当master出现错误或宕机时可以用其接替master工作;
mfschunkserver-数据存储服务器:负责提供真正的存储空间,连接管理服务器,接受管理服务器的统一调度,对数据进行创建和读取,而这个角色可以有多个存在,每个chunkserver都会互相复制对方的数据,已达到他们之间的数据始终保持一致,以达到数据的冗余;
mfsclient-客户端:使用MFS数据存储的角色,通过fuse内核接口挂接管理服务器master上所管理的数据存储空间,该角色可以有多个;

其工作架构图如下: 

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

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

由以上两幅图可以看出,MFS具有以下特性:
1、数据高可靠性:相同的一份数据被拷贝到多个chunkserver上
2、动态扩容:通过添加新的chunkserver或者存储可以实现容量的动态扩展
3、单点故障:Master本身的性能瓶颈,只能存在一个,导致单点故障

环境介绍:

    外网           内网 角色        内存     CPU

xxx.xxx.xxx.68  10.12.6.11 master,metalogger 8G 8颗

xxx.xxx.xxx.72 10.12.22.191 chunkserver 4G 4颗

xxx.xxx.xxx.79 10.12.25.23 chunkserver 4G 4颗

出于Master具有单点故障所以我将一台物理配置比较高的一台作为Master,剩余两台作为chunkserver,由于资源不足吧,暂且将metalogger和master放在一起。client经理说,先用你的虚拟机当吧,我看看能不能再给你找台机器  --!

1.Master安装

# wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.11/mfs-1.6.11.tar.gz
# tar zxvf mfs-1.6.11.tar.gz sz tar xvf mfs-1.6.11.tar.gz
# cd mfs-1.6.11
# useradd -s /sbin/nologin mfs
# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
# make
# make install
# cd /usr/local/mfs/etc/
# cp mfsmaster.cfg.dist mfsmaster.cfg
# cp mfsexports.cfg.dist mfsexports.cfg

mfsmaster.cfg 
为master的主配置文件,配置文件中所有的选项都是用#注释掉的,这代表的是将会使用的选项的默认参数,如果要修改只需取消注释修改其值为你所要使用的值即可;
mfsexportes.cfg 为共享mfs文件系统的控制文件,NFS要共享一个目录时,我们会使用vim /etc/exports命令,编写共享给谁,所要共享的目录,共享出去的属性这些内容,而mfsexports.cfg的作用与其类似其书写格式如下:
client Directory Property
*                /       rw,alldirs,maproot=0
client支持格式:ip、ip/netmask、ip/位数掩码、ip-ip、*
Property权限属性:ro-只读、rw-读写、alldirs-允许挂在任何指定的子目录、maproot-映射为指定用户的uid、password-指定挂载密码

# /usr/local/mfs/sbin/mfsmaster start
出现如下内容,说明正常启动
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
loading sessions ... ok
sessions file has been loaded
exports file has been loaded
loading metadata ...
create new empty filesystemmetadata file has been loaded
no charts data file - initializing empty charts
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly

# ps -ef | grep mfs
# netstat -tnlp

2.Metalogger安装

# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
# vim mfsmetalogger.cfg
修改MASTER_HOST的值,为MASTER_HOST的ip地址:
MASTER_HOST = 10.12.6.11
# /usr/local/mfs/sbin/mfsmetalogger start
# ps -ef | grep mfs
# lsof -i:9419# ll /usr/local/mfs/var/mfs/
初识~MFS分布式文件系统_第3张图片

3.chunkserver
10.12.25.23
# useradd -s /sbin/nologin mfs
# wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.11/mfs-1.6.11.tar.gz
# tar xvf mfs-1.6.11.tar.gz 
# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
# make && make install
# cd /usr/local/mfs/etc/
# cp mfschunkserver.cfg.dist mfschunkserver.cfg
# cp mfshdd.cfg.dist mfshdd.cfg
# dd if=/dev/zero of=/opt/mfs.img bs=1M count=50000 &
# losetup /dev/loop0 /opt/mfs.img
# mke2fs -j /dev/loop0
# mkdir /mfsdata
# mount -o loop /dev/loop0 /mfsdata/
# chown -R mfs:mfs /mfsdata
# vim mfshdd.cfg
添加要共享出去的目录,这里我创建了一个50G的本地镜像文件,将其挂载到/mfsdata目录下,并将/mfsdata共享出去
/mfsdata
# /usr/local/mfs/sbin/mfschunkserver start初识~MFS分布式文件系统_第4张图片
# ps -ef | grep mfs
# netstat -tnlp

4.mfs client
# wget http://jaist.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.6/fuse-2.8.6.tar.gz
# wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.11/mfs-1.6.11.tar.gz
# tar xvf fuse-2.8.6.tar.gz
# cd fuse-2.8.6
# ./configure
# make && make install
# ll /dev/ | grep fuse
如果搜索的到,则说明fuse已可以被内核支持使用,否则则需要更新内核版本,编译更新或者使用yum安装kenel、kernel-devel、kernel-headers均可,之后重启
# vim /etc/profile
添加
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
# source /etc/profile
# useradd -s /sbin/nologin mfs
# wget http://ncu.dl.sourceforge.net/project/moosefs/moosefs/1.6.11/mfs-1.6.11.tar.gz
# tar xvf mfs-1.6.11.tar.gz 
# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount
# make && make install
# /usr/local/mfs/bin/mfsmount /mnt/ -H 10.12.6.11 -p 9421
出现如下内容:

mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
/bin/mount: unrecognized option `--no-canonicalize'
Usage: mount -V                 : print version
       mount -h                 : print this help
       mount                    : list mounted filesystems
       mount -l                 : idem, including volume labels
So far the informational part. Next the mounting.
The command is `mount [-t fstype] something somewhere'.
Details found in /etc/fstab may be omitted.
       mount -a [-t|-O] ...     : mount all stuff from /etc/fstab
       mount device             : mount device at the known place
       mount directory          : mount known device here
       mount -t type dev dir    : ordinary mount command
Note that one does not really mount a device, one mounts
a filesystem (of the given type) found on the device.
One can also mount an already visible directory tree elsewhere:
       mount --bind olddir newdir
or move a subtree:
       mount --move olddir newdir
One can change the type of mount containing the directory dir:
       mount --make-shared dir
       mount --make-slave dir
       mount --make-private dir

       mount --make-unbindable dir
One can change the type of all the mounts in a mount subtree
containing the directory dir:
       mount --make-rshared dir
       mount --make-rslave dir
       mount --make-rprivate dir
       mount --make-runbindable dir
A device can be given by name, say /dev/hda1 or /dev/cdrom,
or by label, using  -L label  or by uuid, using  -U uuid .
Other options: [-nfFrsvw] [-o options] [-p passwdfd].


For many more details, say  man 8 mount .
error in fuse_mount

原因是因为mount版本太旧,不支持--no-canonicalize这个选项.moosefs在挂载时会使用这个选项。因此需要升级mount版本

# wget http://pkgs.fedoraproject.org/repo/pkgs/util-linux-ng/util-linux-ng-2.18.tar.bz2/2f5f71e6af969d041d73ab778c141a77/util-linux-ng-2.18.tar.bz2
# tar xvf util-linux-ng-2.18.tar.bz2
# cd util-linux-ng-2.18
# ./configure --prefix=/usr/local/mount-new
# make && make install
# mv /bin/mount{,.off}
# ln -sv /usr/local/mount-new/bin/mount /bin/

重新挂载
# /usr/local/mfs/bin/mfsmount /mnt/ -H 10.12.6.11 -p 9421
# mount
初识~MFS分布式文件系统_第5张图片

可以看出已经挂载上

登陆master执行
# /usr/local/mfs/sbin/mfscgiserv
来启动一个用python写的一个web服务器,它的监听端口是9425
在浏览器中输入: http://masterip:9425  即可访问

初识~MFS分布式文件系统_第6张图片

初识~MFS分布式文件系统_第7张图片

初识~MFS分布式文件系统_第8张图片

初识~MFS分布式文件系统_第9张图片

 

就此,MFS的基本应用已经搭建完成。


参考资料:
http://sery.blog.51cto.com/10037/263515
MooseFS权威指南
MFS文件系统使用手册