MFS分布式文件系统部署方案
一、       网络拓扑图
二、       功能模块介绍及部署
2.1 管理服务器(master)
作为管理服务器(master)是MooseFS 部署中重要的一个元素,在硬件方面,应该被安装在一台能够保证高可靠性和能胜任的整个系统存取的要求的机器上。一个明智的做法是用一个配有冗余电源、一个明智的做法是用一个配有冗余电源、ECC 内存、磁盘阵列,如RAID1/RAID5/RAID10。在操作系统方面,管理服务器的操作系统应该是具有POSIX 兼容的系统(到目前支持Linux, FreeBSD, Mac OS X and OpenSolaris)。
2.1.1部署教程: (所有角色都是用的同一个安装文件只是配置有所不同)
useradd mfs –s /sbin/nologin #建立用户并禁示此用户登陆
tar zxvf mfs-1.6.11.tar.gz
cd mfs-1.6.11
./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
vim mfsmaster.cfg
# WORKING_USER = mfs 运行master server 的用户
# WORKING_GROUP = mfs 运行master server 的组
# SYSLOG_IDENT = mfsmaster master server 在syslog中的标识,说明是由master serve 产生的
# LOCK_MEMORY = 0 是否执行mlockall()以避免mfsmaster 进程溢出(默认为0)
# NICE_LEVEL = -19 运行的优先级(如果可以默认是-19; 注意: 进程必须是用root启动)
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg 被挂接目录及其权限控制文件的存放位置
# DATA_PATH = /usr/local/mfs/var/mfs 数据存放路径,此目录下大致有三类文件,changelog,sessions和stats;
# BACK_LOGS = 50 metadata 的改变log 文件数目(默认是50);
# REPLICATIONS_DELAY_INIT = 300 延迟复制的时间(默认是300s);
# REPLICATIONS_DELAY_DISCONNECT = 3600 chunkserver 断开的复制延迟(默认是3600);
# MATOML_LISTEN_HOST = * metalogger 监听的IP 地址(默认是*,代表任何IP);
# MATOML_LISTEN_PORT = 9419 metalogger 监听的端口地址(默认是9419);
# MATOCS_LISTEN_HOST = * 用于chunkserver 连接的IP 地址(默认是*,代表任何IP);
# MATOCS_LISTEN_PORT = 9420 用于chunkserver 连接的端口地址(默认是9420);
# MATOCU_LISTEN_HOST = * 用于客户端挂接连接的IP 地址(默认是*,代表任何IP);
# MATOCU_LISTEN_PORT = 9421 用于客户端挂接连接的端口地址(默认是9421);
# CHUNKS_LOOP_TIME = 300 chunks 的回环频率(默认是:300 秒);
注:原文为Chunks loop frequency in seconds (default is 300)
# CHUNKS_DEL_LIMIT = 100
# CHUNKS_WRITE_REP_LIMIT = 1 在一个循环里复制到一个chunkserver 的最大chunk数目(默认是1)
# CHUNKS_READ_REP_LIMIT = 5 在一个循环里从一个chunkserver 复制的最大chunk数目(默认是5)
# REJECT_OLD_CLIENTS = 0 弹出低于1.6.0的客户端挂接(0 或1,默认是0)
此文件不需要修改,如果需要修改去掉前面的#在修改
Vim mfsexports.cfg
#* / ro
#192.168.1.0/24 / rw
#192.168.1.0/24 / rw,alldirs,maproot=0,password=passcode
#10.0.0.0-10.0.0.5 /test rw,maproot=nobody,password=test
#* / rw,alldirs,maproot=0
#192.168.3.138 / rw,alldirs,maproot=0,password=111111
* . rw
#允许所有客户端可以访问回收站
192.168.1.0/24    /   rw,alldirs,maproot=0
该文件每一个条目分为三部分:
第一部分:客户端的ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限
地址可以指定的几种表现形式:
* 所有的ip 地址
n.n.n.n 单个ip 地址
n.n.n.n/b IP 网络地址/位数掩码
n.n.n.n/m.m.m.m IP 网络地址/子网掩码
f.f.f.f-t.t.t.t IP 段
目录部分需要注意两点:
/ 标识MooseFS 根;
. 表示MFSMETA 文件系统
权限部分:
ro 只读模式共享
rw 读写的方式共享
alldirs 许挂载任何指定的子目录
maproot 映射为root,还是指定的用户
password 指定客户端密码
2.1.2修改目录权限
chown –R mfs:mfs /usr/local/mfs
2.1.3启动服务端
/usr/local/mfs/sbin/mfsmaster start
echo ‘/usr/local/mfs/bin/mfsmasterstart’>> /etc/rc.local
2.1.4关闭服务器
/usr/local/mfs/sbin/mfsmaster -s
关闭服务一定不要用KILL来关闭会出现数据丢失的情况,后面我会做一个启动管理脚本用来管理开机启动和关机关闭服务。
2.2、元数据日志服务器(mfsmetalogger)
元数据日志守护进程是在安装master server 时一同安装的,最小的要求并不比master 本身大,可以被运行在任何机器上(例如任一台chunkserver),但是最好是放置在MooseFS master 的备份机上,备份master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs。因为主要的master server 一旦失效,可能就会将这台metalogger 机器取代而作为master server。
2.2.1部署教程:
useradd mfs –s /sbin/nologin #建立用户并禁示此用户登陆
tar zxvf mfs-1.6.11.tar.gz
cd mfs-1.6.11
./configure –prefix=/usr/local/mfs --with-default-user=mfs –with-default-group=mfs
make && make install
cd /usr/local/mfs/etc
vim mfsmetalogger.cfg
# WORKING_USER =mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT =mfsmetalogger
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH= /usr/local/mfs/var/mfs
# BACK_LOGS = 50
# META_DOWNLOAD_FREQ = 24 元数据备份文件下载请求频率。默认为24小时,即每隔一天从元数据服务器
(MASTER)下载一个metadata.mfs.back 文件。当元数据服务器关闭或者出故障时,matedata.mfs.back 文件将消失,那么要恢复整个mfs,则需从metalogger 服务器取得该文件。请特别注意这个文件,它与日志文件一起,才能够恢复整个被损坏的分布式文件系统。
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.1.252
# MASTER_PORT = 9419
# MASTER_TIMEOUT = 60
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfsmetalogger.lock
2.2.2修改目录权限
chown –R mfs:mfs /usr/local/mfs
2.2.3启动服务
/usr/local/mfs/sbin/mfsmetalogger start
echo ‘/usr/local/mfs/bin/mfsmetaloggerstart’>> /etc/rc.local
2.2.4关闭服务
/usr/local/mfs/sbin/mfsmetalogger -s
2.3 数据存储服务器(chunkserver)
安装完管理服务器后,将安装数据服务器(chunkservers),这些机器的磁盘上要有适当的剩余空间,而且操作系统要遵循POSIX 标准(验证了的有这些: Linux, FreeBSD, Mac OS X and OpenSolaris)。Chunkserver 在一个普通的文件系统上储存数据块/碎片(chunks/fragments)作为文件。
2.3.1部署教程:
useradd mfs –s /sbin/nologin #建立用户并禁示此用户登陆
tar zxvf mfs-1.6.11.tar.gz
cd mfs-1.6.11
./configure –prefix=/usr/local/mfs --with-default-user=mfs –with-default-group=mfs
cd /usr/local/mfs/etc
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# DATA_PATH = /usr/local/mfs/var/mfs
# LOCK_FILE = /var/run/mfs/mfschunkserver.pid
# SYSLOG_IDENT = mfschunkserver
# BACK_LOGS = 50
# MASTER_RECONNECTION_DELAY = 30
MASTER_HOST = 192.168.1.252 元数据服务器的名称或地址,可以是主机名,也可以是ip 地址
MASTER_PORT = 9420
# MASTER_TIMEOUT = 60
# CSSERV_LISTEN_HOST = *
# CSSERV_LISTEN_PORT = 9422 这个监听端口用于与其它数据存储服务器间的连接,通常是数据复制
# CSSERV_TIMEOUT = 60
# CSTOCS_TIMEOUT = 60
# HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 分配给MFS 使用的磁盘空间配置文件的位置
Vim mfshdd.cfg
/tmp
在这里/tmp 是一个给mfs 的分区,但在本机上是一个独立的磁盘的挂载目录
2.3.2修改权限
chown –R mfs:mfs /tmp
chown –R mfs:mfs /usr/local/mfs
2.3.3启动服务
/usr/local/mfs/sbin/mfschunkserver start
echo ‘/usr/local/mfs/bin/mfschunkserver start’>> /etc/rc.local
2.3.4关闭服务
/usr/local/mfs/sbin/mfschunkserver –s
2.3.5共享空间限制(如果不限制可以不用设置)
dd if=/dev/zero of=/opt/mfs.img bs=1M count=50000#设置空间50G
losetup /dev/loop0 mfs.img
mkfs.ext3 /dev/loop0
mkdir /tmp
chown mfs:mfs /tmp
mount -o loop /dev/loop0 /tmp
2.4 MFS客户端(client)
2.4.1 fuse安装
如果所在的系统已经安装了fuse,则跳过这个步骤,高版本的Linux 内核已经支持了。
tar zxvf fuse_2.8.1.tar.gz
cd fuse-2.8.1
./configure
Make && make install
echo ‘export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH’ >>/etc/profile #增加全局变量
source /etc/profile
2.4.2 mfs安装
useradd mfs –s /sbin/nologin
tar zxvf mfs-1.6.11.tar.gz
cd mfs-1.6.11
./configure --prefix=/usr/local/mfs --w ith-default-user=mfs --w ith-default-group=mfs --enable-mfsmount
make && make install
2.4.3挂接MFS文件系统
创建挂载点:mkdir /mnt/mfs
Mkdir /mnt/mfsmeta
加载fuse 模块到内核:modprobe fuse
挂接MFS:
ln -s /usr/local/mfs/bin/mfsmount /usr/sbin/mfsmount #将mfsmount链接到sbin目录中
mfsmount /mnt/mfs -H 192.168.1.252 –p #挂载MFS根目录到/mnt/mfs中密码为服务端设置密码
mfsmount -m /mnt/mfsmeta/ -H 192.168.1.252 #挂载MFS回收站到/mnt/mfsmeta中
系统管理:
ln -s /usr/local/mfs/bin/mfssetgoal /usr/sbin/mfssetgoal
mfsrsetgoal 2 /mnt/mfs #设置文件的备份份数为2份
mfsrsettrashtime 600 /mnt/mfs #设置回收时间为10分钟
开机自动运行
echo  ‘#!/bin/sh
/sbin/modprobe /sys/module/fuse
/usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.1.252’>> /etc/rc.local
2.5 监控服务端(mfssetgoal)
用来监控MFS各节点状态信息,可部署在任一节点服务器。
yum install python
/usr/local/mfs/sbin/mfscgiserv (后台启动二个启动方式只用启动一次就可以了)
/usr/local/mfs/sbin/mfscgiserv  -f(前台启动)
#有可能出现如下提示不用管它已经启动完成如果有问题:
ps aux | grep mfscgiserv
kill -9 “ID”
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi)
Traceback (most recent call last):
Traceback (most recent call last):
File "./mfscgiserv", line 399, in ?
File "./mfscgiserv", line 392, in ?
exit(0)
TypeError: 'str' object is not callable
exit(0)
TypeError: 'str' object is not callable
查看方式在浏览器中输入http://192.168.1.252:9425(我这个部署在MASTER服务器上)
3 附录
3.1 MooseFS 文件系统利用下面的命令:
mfsmount mountpoint [-d] [-f] [-s] [-m] [-n] [-p] [-HMASTER] [-PPORT] [-S PATH] [-o OPT[,OPT...]]
-H MASTER:是管理服务器(master server)的ip 地址
-P PORT: 是管理服务器( master server)的端口号,要按照mfsmaster.cfg 配置文件中的变量MATOCU_LISTEN_POR 的之填写。如果master serve 使用的是默认端口号则不用指出。
-S PATH:指出被挂接mfs 目录的子目录,默认是/目录,就是挂载整个mfs 目录。
Mountpoint:是指先前创建的用来挂接mfs 的目录。
在开始mfsmount 进程时,用一个-m 或-o mfsmeta 的选项,这样可以挂接一个辅助的文件系统MFSMETA,这么做的目的是对于意外的从MooseFS 卷上删除文件或者是为了释放磁盘空间而移动的文件而又此文件又过去了垃圾文件存放期的恢复
3.2 MooseFS 的特定的操作
3.2.1、设定的目标
目标(goal),是指文件被拷贝的份数,设定了拷贝的份数后是可以通过可以mfsgetgoal 命令来证实的,也可以通过mfssetgoal 来改变设定。例如:
$ mfsgetgoal /mnt/mfs-test/test1
/mnt/mfs-test/test1: 2
$ mfssetgoal 3 /mnt/mfs-test/test1
/mnt/mfs-test/test1: 3
$ mfsgetgoal /mnt/mfs-test/test1
/mnt/mfs-test/test1: 3
3.2.2用mfsgetgoal –r 和mfssetgoal –r 同样的操作可以对整个树形目录递归操作。
$ mfsgetgoal -r /mnt/mfs-test/test2
/mnt/mfs-test/test2:
files with goal 2 : 36
directories with goal 2 : 1
$ mfssetgoal -r 3 /mnt/mfs-test/test2
/mnt/mfs-test/test2:
inodes with goal changed: 37
inodes with goal not changed: 0
inodes with permission denied: 0
$ mfsgetgoal -r /mnt/mfs-test/test2
/mnt/mfs-test/test2:
files with goal 3 : 36
directories with goal 3 : 1
3.2.3实际的拷贝份数可以通过mfscheckfile 和mfsfile info 命令来证实,例如:
$ mfscheckfile /mnt/mfs-test/test1
/mnt/mfs-test/test1:
3 copies: 1 chunks
$ mfsfileinfo /mnt/mfs-test/test1
/mnt/mfs-test/test1:
chunk 0: 00000000000520DF_00000001 / (id:336095 ver:1)
copy 1: 192.168.0.12:9622
copy 2: 192.168.0.52:9622
copy 3: 192.168.0.54:9622
3.2.4整个目录树的内容摘要可以用一个功能增强的等同于du –s 的命令mfsdirinfo,mfsdirinfo 为MooseFS 列出具体的信息。
例如:
$ mfsdirinfo /mnt/mfs-test/test/:
inodes: 15
directories: 4
files: 8
chunks: 6
length: 270604
size: 620544
realsize: 1170432
上述内容摘要显示了目录、文件及chunks 的数目,还有整个目录占用磁盘空间的情况。
length -文件大小的总和
size –块长度总和
realsize –磁盘空间的使用包括所有的拷贝
3.3垃圾箱(trash bin)设定隔离的时间(quarantine time)
3.3.1一个删除文件能够存放在一个“ 垃圾箱”的时间就是一个隔离时间, 这个时间可以用
mfsgettrashtime 命令来验证,也可以用mfssettrashtime 命令来设置,例如:
$ mfsgettrashtime /mnt/mfs-test/test1
/mnt/mfs-test/test1: 604800
$ mfssettrashtime 0 /mnt/mfs-test/test1
/mnt/mfs-test/test1: 0
$ mfsgettrashtime /mnt/mfs-test/test1
/mnt/mfs-test/test1: 0
3.3.2这些工具也有个递归选项-r,可以对整个目录树操作,例如:
$ mfsgettrashtime -r /mnt/mfs-test/test2
/mnt/mfs-test/test2:
files with trashtime 0 : 36
directories with trashtime 604800 : 1
$ mfssettrashtime -r 1209600 /mnt/mfs-test/test2
/mnt/mfs-test/test2:
inodes with trashtime changed: 37
inodes with trashtime not changed: 0
inodes with permission denied: 0
$ mfsgettrashtime -r /mnt/mfs-test/test2
/mnt/mfs-test/test2:
files with trashtime 1209600 : 36
directories with trashtime 1209600 : 1
3.3.3时间的单位是秒(有用的值有:1 小时是3600 秒,24 - 86400 秒,1 - 604800 秒)。就像文件被存储的份数一样, 为一个目录设定存放时间是要被新创建的文件和目录所继承的。数字0 意味着一个文件被删除后, 将立即被彻底删除,在想回收是不可能的
删除文件可以通过一个单独安装MFSMETA 文件系统。特别是它包含目录/ trash (包含任然可以被还原的被删除文件的信息)和/ trash/undel (用于获取文件)。只有管理员有权限访问MFSMETA(用户的uid 0,通常是root)。
$ mfssettrashtime 3600 /mnt/mfs-test/test1
/mnt/mfs-test/test1: 3600
$ rm /mnt/mfs-test/test1
$ ls /mnt/mfs-test/test1
ls: /mnt/mfs-test/test1: No such file or directory
# ls -l /mnt/mfs-test-meta/trash/*test1
-rw-r--r-- 1 user users 1 2007-08-09 15:23 /mnt/mfs-test-meta/trash/00013BC7|test1
3.3.4被删文件的文件名在“垃圾箱”目录里还可见,文件名由一个八位十六进制的数i-node 和被删文件的文件名组成,在文件名和i-node 之间不是用“/”,而是用了“|”替代。如果一个文件名的长度超过操作系统的限制(通常是255 个字符),那么部分将被删除。通过从挂载点起全路径的文件名被删除的文件任然可以被读写。需要注意的是被删除的文件在用全路径文件名(注意文件名是两部分)时一定要用单引号引起来。例如:
# cat '/mnt/mfs-test-meta/trash/00013BC7|test1'
test1
# echo 'test/test2' > '/mnt/mfs-test-meta/trash/00013BC7|test1'
# cat '/mnt/mfs-test-meta/trash/00013BC7|test1'
test/test2
移动这个文件到trash/undel 子目录下,将会使原始的文件恢复到正确的MooseFS 文件系统上路径下(如果路径没有改变)。例如:
[root@www mfs]# ll dgg
-rw-r--r-- 1 root root 8 Jan 13 08:45 dgg
[root@www mfs]# rm -f dgg
[root@www mfs]# ll dgg
ls: dgg: No such file or directory
[root@www trash]# ls
0000000B|dgg 00000047|f1 undel
[root@www trash]# mv '/mnt/mfsmeta/trash/0000000B|dgg' ./undel/
[root@www trash]# ls
undel 00000047|f1
[root@www mfs]# ll dgg
-rw-r--r-- 1 root root 8 Jan 13 08:45 dgg
注意:如果在同一路径下有个新的同名文件,那么恢复不会成功
从“垃圾箱”中删除文件结果是释放之前被它站用的空间(删除有延迟,数据被异步删除)。在这种被从“垃圾箱”删除的情况下,该文件是不可能恢复了。
可以通过mfssetgoal 工具来改变文件的拷贝数,也可以通过mfssettrashtime 工具来改变存储在“垃圾箱”中的时间。
在MFSMETA 的目录里,除了trash 和trash/undel 两个目录外,还有第三个目录reserved,该目录内有已经删除的文件,但却有一直打开着。在用户关闭了这些被打开的文件后,reserved 目录中的文件将被删除,文件的数据也将被立即删除。在reserved 目录中文件的命名方法同trash 目录中的一样,但是不能有其他功能的操作。
3.4 快照
MooseFS 系统的另一个特征是利用mfsmakesnapshot 工具给文件或者是目录树做快照,例如:
$ mfsmakesnapshot source ... destination
Mfsmakesnapshot 是在一次执行中整合了一个或是一组文件的拷贝,而且任何修改这些文件的源文件都不会影响到源文件的快照,就是说任何对源文件的操作,例如写入源文件,将不会修改副本(或反之亦然)。
文件快照可以用mfsappendchunks,就像MooseFS1.5 中的mfssnapshot 一样,,作为选择,二者都可以用。例如:
$ mfsappendchunks destination-file source-file ...
当有多个源文件时,它们的快照被加入到同一个目标文件中(每个chunk 的最大量是chunk)
3.5 额外的属性
文件或目录的额外的属性(noowner, noattrcache, noentrycache),可以被mfsgeteattr,mfsseteattr,mfsdeleattr 工具检查, 设置, 删除, 其行为类似mfsgetgoal/mfssetgoal or 或者是mfsgettrashtime/mfssettrashtime,详细可见命令手册。
4、MooseFS 元数据的备份
通常元数据有两部分的数据
1.主要元数据文件metadata.mfs,当mfsmaster 运行的时候会被命名为metadata.mfs.back
2.元数据改变日志changelog.*.mfs,存储了过去的N 小时的文件改变(N 的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg 配置文件中)。
主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs 储存。元数据changelogs 应该实时的自动复制。自从MooseFS 1.6.5,这两项任务是由mfsmetalogger 守护进程做的。
5、MooseFS master的恢复
一旦mfsmaster 崩溃(例如因为主机或电源失败),需要最后一个元数据日志changelog 并入主要的metadata 中。这个操作时通过mfsmetarestore 工具做的,最简单的方法是:
如果master 数据被存储在MooseFS 编译指定地点外的路径,则要利用-d 参数指定使用,如:
mfsmetarestore -a -d /storage/mfsmaster
6 从备份恢复MooseFS master
为了从备份中恢复一个master,需要做:
1、安装一个mfsmaster
2、利用同样的配置来配置这台mfsmaster(利用备份来找回mfsmaster.cfg),可见配置文件也是需要备份的。
3、找回metadata.mfs.back 文件,可以从备份中找,也可以中metalogger 主机中找(如果启动了metalogger 服务),然后把metadata.mfs.back 放入data 目录,一般为${prefix}/var/mfs。
4、从在master 宕掉之前的任何运行metalogger 服务的服务器上拷贝最后metadata 文件,然后放入mfsmaster 的数据目录。
5、利用mfsmetarestore 命令合并元数据changelogs,可以用自动恢复模式mfsmetarestore –a,也可以利用非自动化恢复模式,语法如下:
mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs