|
MFS 特性:
1. Free(GPL)
2. 通用文件系统,不需要修改上层应用就可以使用
3. 可以在线扩容,体系架构可伸缩性极强。
4. 部署简单。
5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或 写的性能,只会加速!)
6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类 似 oralce 的闪回等高级 dbms 的即时回滚特性!)
7. 提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文 件创建文件的快照)
8. google filesystem 的一个 c 实现。
9. 提供 web gui 监控接口。
10. 提高随机读或写的效率。
11. 提高海量小文件的读写效率。
可能的瓶颈:
1.master 本身的性能瓶颈。mfs系统 master存在单点故障如何解决?moosefs+drbd+heartbeat来保证master单点问题?不过在使用过程中不可能完全不关机和间歇性的网络中断!
2.体系架构存储文件总数的可遇见的上限。(mfs把文件系统的结构缓存到master的内存中,文件越多,master的内存消耗越大,8g对应2500w的文件数,2亿文件就得64GB内存)。master服务器CPU负载取决于操作的次数,内存的使用取决于文件和文件夹的个数。
MFS文件系统结构:
包含4 种角色:
管理服务器managing server(master)
元数据日志服务器Metaloggerserver(Metalogger)
数据存储服务器data servers(chunkservers)
客户机挂载使用clientcomputers

各种角色作用:
1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷 贝。
2. 元数据日志服务器: 负责备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。
3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数 据传输。
4. 客户端: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文 件系统和本地 unix 文件系统使用一样的效果。
MFS 读写原理:


原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬 盘和网络的吞吐量越好,整个系统的性能也就会越好.
系统环境:rhel6 x86_64 iptablesand selinux disabled
主机:192.168.122.112 server12.example.comMaster server
192.168.122.234server34.example.comMaster server
192.168.122.20server20.example.comChunkservers
192.168.122.205server5.example.comChunkservers
192.168.122.77server77.example.comClient
所需的包:mfs-1.6.27.tar.gz
相关网址:http://www.moosefs.org/
#安装配置Masterserver(主控服务器)
以下步骤在server12上实施:
[iyunv@server12~]# yum install rpm-build -y
[iyunv@server12~]# rpmbuild -tb mfs-1.6.27.tar.gz
此时会出现如下错误:
(1)error:Failed build dependencies:
fuse-develis needed by mfs-1.6.27-2.x86_64
zlib-develis needed by mfs-1.6.27-2.x86_64
(2)configure:error: no acceptable C compiler found in $PATH
(3)/var/tmp/rpm-tmp.zJWron:line 47: make: command not found
解决方法如下:
(1)[iyunv@server12 ~]# yum install fuse-devel zlib-devel -y
(2)[iyunv@server12 ~]# yum install gcc -y
(3)[iyunv@server12 ~]# yum install make -y
[iyunv@server12~]# cd ~/rpmbuild/RPMS/x86_64/
[iyunv@server12x86_64]# rpm -ivh mfs-master-1.6.27-2.x86_64.rpmmfs-cgi-1.6.27-2.x86_64.rpm mfs-cgiserv-1.6.27-2.x86_64.rpm
[iyunv@server12x86_64]# cd /etc/mfs/
[iyunv@server12mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg
此文件中凡是用#注释掉的变量均使用其默认值,基本不需要就可以工作:
#WORKING_USER和WORKING_GROUP:是运行master server的用户和组;
#SYSLOG_IDENT:是master server 在syslog 中的标识;
#LOCK_MEMORY:是否执行mlockall()以避免mfsmaster进程溢出(默认为0);
#NICE_LEVE:运行的优先级(如果可以默认是-19; 注意:进程必须是用root 启动);
#EXPORTS_FILENAME:被挂接目录及其权限控制文件的存放位置
#TOPOLOGY_FILENAME: 定义MFS 网络拓扑结构的文件位置
#DATA_PATH:数据存放路径,此目录下大致有三类文件,changelog,sessions和stats;
#BACK_LOGS:metadata的改变log 文件数目(默认是50);
#BACK_META_KEEP_PREVIOUS:保存以前mfs元数据的文件数,默认值是1;
#REPLICATIONS_DELAY_INIT:延迟复制的时间(默认是300s);
#REPLICATIONS_DELAY_DISCONNECT:chunkserver断开的复制延迟(默认是3600);
#MATOML_LISTEN_HOST:metalogger 监听的IP 地址(默认是*,代表任何IP);
#MATOML_LISTEN_PORT:metalogger 监听的端口地址(默认是9419);
#MATOCS_LISTEN_HOST:用于chunkserver 连接的IP 地址(默认是*,代表任何IP);
#MATOCS_LISTEN_PORT:用于chunkserver连接的端口地址(默认是9420);
#MATOCU_LISTEN_HOST/MATOCL_LISTEN_HOST:用于客户端挂接连接的IP 地址(默认是*,
代表任何IP);
#MATOCU_LISTEN_PORT/MATOCL_LISTEN_PORT:用于客户端挂接连接的端口地址(默认
是9421);
#CHUNKS_LOOP_CPS:chunks的回环每秒检查的块最大值,默认100000;
#CHUNKS_LOOP_TIME :chunks 的回环频率(默认是:300秒);
#CHUNKS_SOFT_DEL_LIMIT :一个chunkserver中可以删除chunks 的最大数,软限(默认:
10)
#CHUNKS_HARD_DEL_LIMIT:一个chunkserver中可以删除chunks 的最大数,硬限(默认:
25)
#REPLICATIONS_DELAY_DISCONNECT:chunkserver 断开后的复制延时(默认:3600秒)
#CHUNKS_WRITE_REP_LIMIT:在一个循环里复制到一个chunkserver 的最大chunk 数目(默
认是2)
#CHUNKS_READ_REP_LIMIT :在一个循环里从一个chunkserver复制的最大chunk 数目(默
认是10)
#REJECT_OLD_CLIENTS:弹出低于1.6.0 的客户端挂接(0或1,默认是0)
#deprecated:
#CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead
#LOCK_FILE - lock system has been changed, and this option is usedonly to search for old
lockfile
[iyunv@server12mfs]# cp mfsexports.cfg.dist mfsexports.cfg
该文件每一个条目分为三部分:
第一部分:客户端的ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限
地址可以指定的几种表现形式:
*所有的ip 地址
A.B.C.D单个ip 地址
A.B.C.D/BITSIP 网络地址/位数掩码
A.B.C.D/E.F.G.HIP 网络地址/子网掩码
A.B.C.D-E.F.G.HIP 地址范围
目录部分需要注意两点:
/标识MooseFS 根;
.表示MFSMETA 文件系统
权限部分:
ro只读模式共享
rw读写方式共享
alldirs许挂载任何指定的子目录
maproot映射为root,还是指定的用户
password指定验证密码,客户端挂载时使用
[iyunv@server12mfs]# cp mfstopology.cfg.dist mfstopology.cfg
[iyunv@server12mfs]# chown nobody.nobody /var/lib/mfs/ -R
[iyunv@server12mfs]# cd /var/lib/mfs/
[iyunv@server12mfs]# cp -a metadata.mfs.empty metadata.mfs
[iyunv@server12mfs]# mfsmaster (注:关闭为mfsmasterstop)
workingdirectory: /var/lib/mfs
lockfilecreated and locked
initializingmfsmaster modules ...
loadingsessions ... file not found
ifit is not fresh installation then you have to restart all activemounts !!!
exportsfile has been loaded
mfstopology:incomplete definition in line: 7
mfstopology:incomplete definition in line: 7
mfstopology:incomplete definition in line: 22
mfstopology:incomplete definition in line: 22
mfstopology:incomplete definition in line: 28
mfstopology:incomplete definition in line: 28
topologyfile has been loaded
loadingmetadata ...
createnew empty filesystemmetadata file has been loaded
nocharts data file - initializing empty charts
master<-> metaloggers module: listen on *:9419
master<-> chunkservers module: listen on *:9420
mainmaster server module: listen on *:9421
mfsmasterdaemon initialized properly
注:出现类似如上输出说明成功.
此时进入/var/lib/mfs可以看到moosefs 所产生的数据:
.mfsmaster.lock文件记录正在运行的mfsmaster 的主进程
metadata.mfs,metadata.mfs.back MooseFS 文件系统的元数据metadata 的镜像
changelog.*.mfs是MooseFS文件系统元数据的改变日志(每一个小时合并到metadata.mfs
中一次)
Metadata文件的大小是取决于文件数的多少(而不是他们的大小)。changelog日志的大小是取决于每小时操作的数目,但是这个时间长度(默认是按小时)是可配置的。
#启动CGI监控服务
[iyunv@server12mfs]# cd /usr/share/mfscgi/
[iyunv@server12mfscgi]# chmod +x *.cgi
[iyunv@server12mfscgi]# mfscgiserv
lockfilecreated and locked
startingsimple cgi server (host:any , port: 9425 , rootpath: /usr/share/mfscgi)
此时访问192.168.122.112:9425看到如下页面说明配置成功

#安装配置Chunk servers(存储块服务器)
以下步骤在server12上实施:
[iyunv@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/
[iyunv@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.20:/root/
[iyunv@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.205:/root/
以下步骤在server20和server5上实施:
[iyunv@server20~]# rpm -ivh mfs-chunkserver-1.6.27-2.x86_64.rpm
[iyunv@server20~]# cd /etc/mfs/
[iyunv@server20mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
#WORKING_USER = nobody
#WORKING_GROUP =
#SYSLOG_IDENT = mfschunkserver
#LOCK_MEMORY = 0
#NICE_LEVEL = -19
#DATA_PATH = /var/lib/mfs
#MASTER_RECONNECTION_DELAY = 5:在失去连接之后延迟多少秒重新连接master
#BIND_HOST = *:本地地址用于连接mfsmaster(默认值是*,即默认的本地地址)
#MASTER_HOST = mfsmaster:master 服务器的主机名或是ip 地址。
#MASTER_PORT = 9420
#MASTER_TIMEOUT = 60
#CSSERV_LISTEN_HOST = *:允许挂载的客户端连接的IP 地址(*允许全部)
#CSSERV_LISTEN_PORT = 9422:允许挂载的客户端连接的端口
#HDD_CONF_FILENAME = /etc/mfshdd.cfg:分配给MFS使用的磁盘空间配置文件的位置
#HDD_TEST_FREQ = 10:块的测试期(单位为秒)
#deprecated, to be removed in MooseFS 1.7
#LOCK_FILE = /var/run/mfs/mfschunkserver.lock
#BACK_LOGS = 50
#CSSERV_TIMEOUT = 5
[iyunv@server20mfs]# cp mfshdd.cfg.dist mfshdd.cfg
[iyunv@server20mfs]# vim mfschunkserver.cfg
MASTER_HOST= 192.168.122.112(此处填写Master的IP,或直接在/etc/hosts中写解析即可)
[iyunv@server20mfs]# vim mfshdd.cfg
/mnt/chunk1#定义mfs共享点
[iyunv@server20mfs]# mkdir /var/lib/mfs
[iyunv@server20mfs]# mkdir /mnt/chunk1
[iyunv@server20mfs]# chown nobody.nobody /var/lib/mfs/ /mnt/chunk1/ -R
[iyunv@server20mfs]# mfschunkserver (注:关闭为mfschunkserverstop)
workingdirectory: /var/lib/mfs
lockfilecreated and locked
initializingmfschunkserver modules ...
hddspace manager: path to scan: /mnt/chunk1/
hddspace manager: start background hdd scanning (searching for availablechunks)
mainserver module: listen on *:9422
nocharts data file - initializing empty charts
mfschunkserverdaemon initialized properly
注:出现类似如上输出说明启动成功!
此时访问192.168.122.112:9425并点击Servers和Disks可以看到如下页面:

#安装配置Client(客户端)
以下步骤在server12上实施:
[iyunv@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/
[iyunv@server12 x86_64]# scp mfs-client-1.6.27-2.x86_64.rpm root@192.168.122.77:/root/
以下步骤在server77上实施:
[iyunv@server77~]# yum localinstall mfs-client-1.6.27-2.x86_64.rpm -y
[iyunv@server77~]# cd /etc/mfs/
[iyunv@server77mfs]# cp mfsmount.cfg.dist mfsmount.cfg
[iyunv@server77mfs]# vim mfsmount.cfg #定义客户端默认挂载
/mnt/mfs
mfsmaster=192.168.122.112
[iyunv@server77mfs]# mkdir /mnt/mfs
[iyunv@server77mfs]# mfsmount
mfsmasteraccepted connection with parameters: read-write,restricted_ip ; rootmapped to root:root
注:出现类似如上输出说明并且df-h可查看到类似如下内容则说明成功:
192.168.122.112:94216.4G 320K 6.4G 1% /mnt/mfs
此时访问192.168.122.112:9425并点击Mounts可以看到如下页面:

测试:进入到/mnt/mfs中,建立dir1和dir2两个目录,执行mfssetgoal -r 2 dir2/,然后随意的往dir1和dir2中写入数据(例如:创建文件),然后分别mfsfileinfo查看两个录入中的文件,会发现dir1中的文件只保存一份,而dir2中的文件保存了两份.
相关命令:
mfsgetgoaldir2/#查看dir2中文件存储份数
mfssetgoal-r 2 dir2/ #设置在dir2中文件存储份数为两个,默认是一个
对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的 copy份数.但使用-r选项可以更改已经存在的copy 份数.
mfsfileinfopasswd #查看文件信息
附:
1.当在写入的时候masterserver挂掉了,如何重新启动
以下步骤在server12上实施:
[iyunv@server12~]# mfsmetarestore
[iyunv@server12~]# mfsmaster
2.恢复误删文件
假设误删了dir2中的fstab文件
以下步骤在server77上实施:
[iyunv@server77mfs]# mfsgettrashtime dir1/
dir1/:86400
文件删除后存放在“垃圾箱”中的时间称为隔离时间,这个时间可以用mfsgettrashtime命令来查看,用mfssettrashtime命令来设置,单位为秒,默认为86400秒。
[iyunv@server77mfs]# mkdir /mnt/mfsmeta
[iyunv@server77mfs]# mfsmount -m /mnt/mfsmeta/ -H 192.168.122.112
mfsmasteraccepted connection with parameters: read-write,restricted_ip
注:此处用df-h查看不到是否已经挂载,可直接进入挂载点/mnt/mfsmeta/看是否有reserved和trash两个目录,有的话即挂载成功.
挂载MFSMETA文件系统,它包含目录trash(包含仍然可以被还原的删除文件的信息)和trash/undel(用于获取文件)。
[iyunv@server77mfs]# cd /mnt/mfsmeta/trash/
[iyunv@server77trash]# mv 00000009\|dir2\|fstab undel/
将要恢复的文件直接移入undel中即可恢复误删的文件.
注:在MFSMETA的目录里,除了trash和trash/undel两个目录,还有第三个目录reserved,该目录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后,reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作
#Masterserver的热备
(iscsi+corosync+pacemaker)
此处省略对iscsi的配置
corosync和pacemaker的安装可以参照文档Rhel6-pacemaker+drbd.pdf
#配置iscsi
要将/var/lib/mfs/中的所有文件复制到通过iscsi分享出来的磁盘中,并注意所有文件的所属主和组均必须为nobody.
#配置corosync
以下步骤server12和server34上实施:
[iyunv@server12~]# vim /etc/corosync/corosync.conf
#Please read the corosync.conf.5 manual page
compatibility:whitetank
totem{
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.122.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging{
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf{
mode: disabled
}
service{
ver: 0
name: pacemaker
use_mgmtd: yes
}
#mfs启动脚本
[iyunv@server12~]# vim /etc/init.d/mfsd
#!/bin/bash
#
#Init file for the MooseFS master service
#
#chkconfig: - 92 84
#
#description: MooseFS master
#
#processname: mfsmaster
#Source function library.
#Source networking configuration.
./etc/init.d/functions
./etc/sysconfig/network
#Source initialization configuration.
#Check that networking is up.
["${NETWORKING}" == "no" ] && exit 0
[-x "/usr/sbin/mfsmaster" ] ||exit 1
[-r "/etc/mfs/mfsmaster.cfg" ]|| exit 1
[-r "/etc/mfs/mfsexports.cfg" ]|| exit 1
RETVAL=0
prog="mfsmaster"
datadir="/var/lib/mfs"
mfsbin="/usr/sbin/mfsmaster"
mfsrestore="/usr/sbin/mfsmetarestore"
start() {
echo-n $"Starting $prog: "
$mfsbinstart >/dev/null 2>&1
if[ $? -ne 0 ];then
$mfsrestore-a >/dev/null 2>&1 && $mfsbin start >/dev/null2>&1
fi
RETVAL=$?
echo
return$RETVAL
}
stop() {
echo-n $"Stopping $prog: "
$mfsbin-s >/dev/null 2>&1 || killall -9 $prog #>/dev/null 2>&1
RETVAL=$?
echo
return$RETVAL
}
restart() {
stop
start
}
reload() {
echo-n $"reload $prog: "
$mfsbinreload >/dev/null 2>&1
RETVAL=$?
echo
return$RETVAL
}
restore() {
echo-n $"restore $prog: "
$mfsrestore-a >/dev/null 2>&1
RETVAL=$?
echo
return$RETVAL
}
case"$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
restore)
restore
;;
status)
status$prog
RETVAL=$?
;;
*)
echo$"Usage: $0 {start|stop|restart|reload|restore|status}"
RETVAL=1
esac
exit$RETVAL
#配置pacemaker
以下步骤在server12或server34上实施:
[iyunv@server12~]# crm
crm(live)#configure
crm(live)configure#primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.122.2cidr_netmask=32 op monitor interval=30s
crm(live)configure#property no-quorum-policy=ignore
crm(live)configure#primitive mfsdata ocf:heartbeat:Filesystem params device=/dev/sda1directory=/var/lib/mfs fstype=ext4
crm(live)configure#primitive mfsmaster lsb:mfsd op monitor interval=1min
crm(live)configure#location masternode vip 10: server12.example.com
crm(live)configure#order mfsmaster-after-mfsdata inf: mfsdata mfsmaster
crm(live)configure#group mfs vip mfsdata mfsmaster
crm(live)configure#order mfsmaster-after-mfsdata inf: mfsdata mfsmaster
crm(live)configure#commit
crm(live)configure#quit
注:存储块服务器(Chunkserver)/etc/mfs/mfschunkserver.cfg中的MASTER_HOST选项和客户端(client)/etc/mfs/mfsmount.cfg中的mfsmaster选项均指向虚拟IP地址,并重启存储块服务器(通过mfschunkserverstop和mfschunkserver) |
|