背景:
前段时间机房搬迁,于是就暴漏了很多问题,线上很多服务器开户都已经开满了,于是就要添加服务器,经理就突然给了我一个任务,测试下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、数据高可靠性:相同的一份数据被拷贝到多个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 |
# /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/
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
# 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
可以看出已经挂载上
登陆master执行
# /usr/local/mfs/sbin/mfscgiserv
来启动一个用python写的一个web服务器,它的监听端口是9425
在浏览器中输入: http://masterip:9425 即可访问
就此,MFS的基本应用已经搭建完成。
参考资料:
http://sery.blog.51cto.com/10037/263515
MooseFS权威指南
MFS文件系统使用手册