使用分布式文件系统MooseFS实现存储共享(v1.6版)
2010-03-01 13:46:12 阿炯


MFS系统工作的原理图

前言:现在有大量的企业采用共享存储服务器NFS的方式,来对应用数据进行网络存储,但这存在性能瓶颈和单点故障的问题,于是分布式文件存储管理系统开始流行起来。其优点是不言而喻的,本文为大家推荐了开源的分布式文件系统MFS,相信对大家有所帮助。

随着公司业务量的增加,相关的业务数据也随着成倍的增加.相应的机器存储空间不足的问题就成为目前一个比较突出的问题,随之而来的备份亦成为一个很为头痛的问题。公司虽然有几台大容量的计算机可用来存放相关数据,但其位置位于各个机房,一时较难以组织,即使将其组织起来只能满足在一段时间内的存储需求,这个需要利用多台服务器上空闲空间加以组织利用,以提供更大的磁盘空间。目前绝大多数业务系统采用NFS文件共享的方式来解决文件惟一性的问题,这种方法在规模较小、访问量低的时候还可以;随着量(访问及文件数目)的增加,这种共享架构显得有些力不从心了,性能与用户体验会有不小的下降。除此之外,还要努力保证这台NFS服务器不能宕机,所有靠共享提供数据的应用就不再可用;尽管用rsync方式同步数据到另外一个服务器上做NFS服务的备份,但这对提高整个系统的性能与可靠性无帮助。基于这样一种需求,我们需要对NFS服务器进行优化或采取别的解决方案,然而优化并不能对应对日益增多的客户端的性能要求,因此只能是采取别的解决方案了。分布式文件系统是一个比较合适的选择,采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系(1个NFS服务器,多个NFS客户端),而是多对多的关系。这样一来,性能大幅提升,同时可靠性也高了许多。

其实,分布式文件系统我们应该都有所耳闻,但不算那些昂贵、需要付费支持的企业产品,绝大多数开源的分布式文件系统解决方案,如MogileFS和Hadoop,虽然都有成功的应用先例,但都有一个共同的令人挠头的特征,即在文件系统层不透明,需要额外的应用层API才能享用它的特性。而MFS完全没有这种困扰,它通过fuse内核模块和用户层的 mfs挂载工具通讯,对使用者完全透明,就和挂载普通的NFS共享一样,且具有动态扩展性、数据冗余、访问权限控制等多种有利于大规模部署的特性。它也兼容POSIX文件属性规范,可通用于Linux、FreeBSD、OpenSolaris、MacOS等操作系统中。

Moose File System 是一个具备容错功能的网络分布式文件系统,它将数据分布在网络中的不同服务器上,MooseFS 通过 FUSE 使之看起来就是一个 Unix 的文件系统。

如果用POSIX的“一次编写,到处编译”风格来作类比,MFS的风格就可以说是“到处随便布点,随处立即可用”。

对于一个基于网络的文件系统来说,网络是制约其性能的关键点,不妨说明一下MFS文件读写的原理:在一次文件读操作中,客户端只需和主控点通讯一次,取得文件所属的数据节点服务器列表,然后便直接和相应的若干台数据节点服务器点对点传输,不再要求和主控点作信息交互。而在写操作时,则是客户端先对主控点发送请求,主控点再请求数据节点服务创建所需的磁盘资源,再将返回信息经由主控点传回客户端,此后客户端将直接与特定这台数据节点点对点通讯,直接写入操作完成,此时客户端就已经能立即读取到刚写入的信息。至于数据节点的冗余复制,将在之后异步进行,不会对平常的读取造成影响。

由此可见,MFS的读写是相当高效的,在千兆内网环境中更是大大减少了数据传输上的瓶颈,且相对于海量小文件来说,大文件的读写更能充分发挥其优势。但这样的架构中仍然存在一个致命缺陷,即主控点是单点,虽然官方声称会在后续版本中改进这个问题,但在这个遥遥无期的限期之前,我们仍然有理由选择依靠既有的其它开源方案来解决这个问题。

关于分布式文件系统MFS
1、实施起来简单。MFS的安装、部署、配置相对于其他几种工具来说,要简单和容易得多。
2、不停服务扩容。MFS框架做好后随时增加服务器扩充容量;扩充和减少容量皆不会影响现有的服务。
3、恢复服务容易。除了MFS本身具备高可用特性外,手动恢复服务也是非常快捷的。

MFS特性
★ 高可靠性(数据能被分成几个副本存储在不同的计算机里)
★ 通过增加计算机或增加新的硬盘动态扩充可用磁盘空间
★ 可以设置删除文件的空间回收时间
[root@localhost hto]# mfsgettrashtime wget-1.10.2.tar.gz
wget-1.10.2.tar.gz: 600
文件被删除10分钟后(600秒),才真正删除文件,回收磁盘空间。
★ 为文件创建快照

MFS的架构和读写原理
一个完整的MFS应用由四个部件构成:主控点服务mfsmaster——管理整个文件群集的元数据日志;数据节点服务mfschunk——以哈希散列的形式存储文件数据,可使用服务器上任意的块设备作为存储设备,能动态扩展;元数据备份服务metalogger——可部署任意数量,用于下载主控点的数据更新日志,以便在主控宕机时恢复服务,非必须;客户端mfsmount——用于挂载分布式文件系统,基于FUSE。除主控点是单点外,其余各点均具备冗余性,默认情况下,mfs会将文件数据复制为两份,分布在不同的数据节点上,即使一台数据节点毁灭,也不会对服务造成影响。

MFS文件系统的组成
1、元数据服务器。在整个体系中负责管理管理文件系统,目前MFS只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后MFS能支持多个master服务器,进一步提高系统的可靠性。
2、数据存储服务器chunkserver。真正存储用户数据的服务器,存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间复制(复制份数可以手工指定,建议设置副本数为3)。数据服务器可以是多个,并且数量越多,可使用的"磁盘空间"越小,可靠性也越高。
3、 元数据日志服务器metalogger。 负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作,在1.6版中新增加的功能。
4、客户端。使用MFS文件系统来存储和访问的主机称为MFS的客户端,成功挂载MFS文件系统以后,就可以像以前使用NFS一样共享这个虚拟性的存储了。

MFS文件系统结构:
包含4种角色:
管理服务器managing server (master)
元数据日志服务器metalogger server(metalogger)
数据存储服务器data servers (chunkservers)
客户机挂载使用client computers

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

(一)安装和配置元数据服务(master server)
1、下载GNU源码 wget http://www.moosefs.com/files/mfs-1.6.12.tar.gz

2、解包 tar zxvf mfs-1.6.12.tar.gz

3、切换目录 cd mfs-1.6.12

4、创建用户
debian
#useradd --comment 'Used for mfs file stroage serv use' --gid backup --no-user-group --system --shell /usr/sbin/nologin --uid 10020 mfs

redhat
#useradd --comment 'Used for mfs file stroage serv use' --gid backup -r --shell /usr/sbin/nologin --uid 10020 mfs

5、配置./configure --prefix=/usr --sysconfdir=/etc/mfs --localstatedir=/var --with-default-user=mfs --with-default-group=backup

6、编译安装 make ; make install

7、配置
配置文件位于安装目录/etc/mfs,需要的配置文件有两个:mfsmaster.cfg和 mfsexports.cfg,mfsmaster.cfg是主配置文件,mfsexports.cfg是被挂载目录及权限设置。
(1)mfsmaster.cfg的配置
[root@dbserv mfs]# cp -av mfsmaster.cfg.dist mfsmaster.cfg
[root@dbserv mfs]# vim mfsmaster.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmaster
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# EXPORTS_FILENAME = /etc/mfs/mfsexports.cfg
# DATA_PATH = /var/mfs
# BACK_LOGS = 50
# REPLICATIONS_DELAY_INIT = 300
# REPLICATIONS_DELAY_DISCONNECT = 3600
# MATOML_LISTEN_HOST = *
# MATOML_LISTEN_PORT = 9419
# MATOCS_LISTEN_HOST = *
# MATOCS_LISTEN_PORT = 9420
# MATOCU_LISTEN_HOST = *
# MATOCU_LISTEN_PORT = 9421
# CHUNKS_LOOP_TIME = 300
# CHUNKS_DEL_LIMIT = 100
# CHUNKS_WRITE_REP_LIMIT = 1
# CHUNKS_READ_REP_LIMIT = 5
# REJECT_OLD_CLIENTS = 0

需要注意的是,凡是用#注释掉的变量均使用其默认值,这里我解释一下这些变量:
#WORKING_USER和WORKING_GROUP:是运行master server的用户和组
#SYSLOG_IDENT:是master server在syslog中的标识,也就是说明这是由master serve产生的
#LOCK_MEMORY:是否执行mlockall()以避免mfsmaster 进程溢出(默认为0)
#NICE_LEVE:运行的优先级(如果可以默认是 -19; 注意: 进程必须是用root启动)
#EXPORTS_FILENAME:被挂载目录及其权限控制文件的存放位置
#DATA_PATH:数据存放路径,此目录下大致有三类文件,changelog,sessions和stats
#BACK_LOGS:metadata的改变log文件数目(默认是 50)
#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:用于客户端挂载连接的IP地址(默认是*,代表任何IP)
# MATOCU_LISTEN_PORT:用于客户端挂载连接的端口地址(默认是9421)
# CHUNKS_LOOP_TIME :chunks的回环频率(默认是:300秒)

注:原文为Chunks loop frequency in seconds (default is 300)
# CHUNKS_DEL_LIMIT = 100
# CHUNKS_WRITE_REP_LIMIT:在一个循环里复制到一个chunkserver的最大chunk数目(默认是1)
# CHUNKS_READ_REP_LIMIT :在一个循环里从一个chunkserver复制的最大chunk数目(默认是5)
# REJECT_OLD_CLIENTS:弹出低于1.6.0的客户端挂载(0或1,默认是0)
注意:mfsexports访问控制对于那些老客户是没用的。
以上是对master server的mfsmaster.cfg配置文件的解释,对于这个文件不需要做任何修改就可以工作。

(2)mfsexports.cfg的配置
[root@dbserv etc]# 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=mfs,password=test
*                       .       rw
#*                      /       rw,alldirs,maproot=0
192.168.1.86            /tt     rw,alldirs,maproot=0
192.168.1.0/24           /       rw,alldirs,maproot=0
192.168.1.12           /       rw,alldirs,maproot=0,password=123.com

该文件每一个条目分为三部分:
第一部分:客户端的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  指定客户端密码
注:该文件内容里不要有空行。
7、启动master server
master server可以单独启动(所谓单独启动就是在没有数据存储服务器(chunkserver)的时候也可以启动,但是不能存储,chunkserver启动后会自动的加入)。安装配置完MFS后,即可启动它。
执行命令 /usr/sbin/mfsmaster start ,可通过检查如下:
[root@dbserv etc]# ps -ef|grep mfs
mfs      12327     1  0 08:38 ?        00:00:00 /usr/sbin/mfsmaster start

8、停止master server
安全停止master server是非常必要的,最好不要用kill。利用mfsmaster -s来安全停止master server,一旦是用了kill也是有解决方法的,后文有说明。

9、要经常性的查看系统日志(tail -f /var/log/messages)

(二)安装和配置元数据日志服务器(metalogger)
1、下载GNU源码 wget http://www.moosefs.com/files/mfs-1.6.12.tar.gz

2、解包 tar zxvf mfs-1.6.12.tar.gz

3、切换目录 cd mfs-1.6.12

4、创建用户
debian
#useradd --comment 'Used for mfs file stroage serv use' --gid backup --no-user-group --system --shell /usr/sbin/nologin --uid 10020 mfs

redhat
#useradd --comment 'Used for mfs file stroage serv use' --gid backup -r --shell /usr/sbin/nologin --uid 10020 mfs

5、配置./configure --prefix=/usr --sysconfdir=/etc/mfs --localstatedir=/var --with-default-user=mfs --with-default-group=backup

6、编译安装 make ; make install

7、配置
该服务只有一个配置文件,那就是mfsmetalogger.cfg。
[root@mail mfs]# vi mfsmetalogger.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmetalogger
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH = /var/mfs
# BACK_LOGS = 50
# META_DOWNLOAD_FREQ = 24
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.1.34
# MASTER_PORT = 9419
# MASTER_TIMEOUT = 60
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfsmetalogger.lock

文中的大多数变量不难理解,类似于mfsmaster.cfg中的变量,其中:
META_DOWNLOAD_FREQ需要说明一下:
元数据备份文件下载请求频率。默认为24小时,即每隔一天从元数据服务器(MASTER)下载一个metadata.mfs.back文件。当元数据服务器关闭或者出故障时,matedata.mfs.back文件将消失,那么要恢复整个mfs,则需从metalogger服务器取得该文件。请特别注意这个文件,它与日志文件一起,才能够恢复整个被损坏的分布式文件系统。

这个文件中需要修改的是MASTER_HOST变量,这个变量的值是master server的IP地址或域名。

8、启动metalogger服务
[root@mail sbin]# ./mfsmetalogger start
working directory: /var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly

这说明metalogger服务正常启动了,利用命令通过进程检查:
[root@mail sbin]# ps -ef |grep mfs
mfs       1692     1  0 Aug07 ?        00:00:01 /usr/sbin/mfsmetalogger -c /etc/mfs/mfsmetalogger.cfg start
通过检查端口:
[root@mail sbin]# lsof -i:9419
COMMAND    PID USER   FD   TYPE DEVICE SIZE NODE NAME
mfsmetalo 1692  mfs    7u  IPv4   3976       TCP gdeb.freeoa.net:47032->xdeb.freeoa.net:9419 (ESTABLISHED)

查看日志服务器的工作目录
[root@mail mfs]# pwd
/var/mfs
[root@mail mfs]# ll
total 8
-rw-r----- 1 mfs mfs 249 Jan 13 15:39 changelog_ml.1.mfs
-rw-r----- 1 mfs mfs 519 Jan 13 15:40 sessions_ml.mfs

这是运行几小时后:
[root@mail mfs]# ll
total 1808
-rw-r----- 1 mfs mfs      0 Jan 14 08:40 changelog_ml.0.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 23:39 changelog_ml.10.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 08:39 changelog_ml.1.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 07:39 changelog_ml.2.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 06:39 changelog_ml.3.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 05:39 changelog_ml.4.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 04:39 changelog_ml.5.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 03:39 changelog_ml.6.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 02:39 changelog_ml.7.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 01:39 changelog_ml.8.mfs
-rw-r----- 1 mfs mfs   4692 Jan 14 00:39 changelog_ml.9.mfs
-rw-r----- 1 mfs mfs 915016 Jan 14 09:00 csstats.mfs
-rw-r----- 1 mfs mfs 777640 Jan 14 08:10 metadata_ml.mfs.back
-rw-r----- 1 mfs mfs    519 Jan 14 09:16 sessions_ml.mfs

9、停止metalogger服务
[root@mail sbin]# ./mfsmetalogger -s
working directory: /var/mfs
sending SIGTERM to lock owner (pid:12284)
waiting for termination ... terminated

10、如果没有启动metalogger服务
在master server则会有如下提示信息产生:
tail -f /var/log/messages
Dec 30 16:53:00 dbserv mfsmaster[14291]: no meta loggers connected !!!

(三)安装配置数据存储服务器(chunkserver)
1、下载GNU源码 wget http://www.moosefs.com/files/mfs-1.6.12.tar.gz

2、解包 tar zxvf mfs-1.6.12.tar.gz

3、切换目录 cd mfs-1.6.12

4、创建用户
debian
#useradd --comment 'Used for mfs file stroage serv use' --gid backup --no-user-group --system --shell /usr/sbin/nologin --uid 10020 mfs

redhat
#useradd --comment 'Used for mfs file stroage serv use' --gid backup -r --shell /usr/sbin/nologin --uid 10020 mfs

5、配置./configure --prefix=/usr --sysconfdir=/etc/mfs --localstatedir=/var --with-default-user=mfs --with-default-group=backup

6、编译安装 make ; make install

7、配置
配置文件位于安装目录/etc/mfs,需要的配置文件有两个:mfschunkserver.cfg和 mfshdd.cfg,
mfschunkserver.cf是主配置文件,mfshdd.cfg是服务器用来分配给MFS使用的空间,最好是一个单独的硬盘或者一个raid卷,最低要求是一个分区。

(1)mfschunkserver.cfg的配置
[root@mail mfs]# vim mfschunkserver.cfg

# WORKING_USER = mfs
# WORKING_GROUP = backup

# DATA_PATH = /var/mfs
# LOCK_FILE = /var/run/mfs/mfschunkserver.pid
# SYSLOG_IDENT = mfschunkserver

# BACK_LOGS = 50
# MASTER_RECONNECTION_DELAY = 30

MASTER_HOST = 192.168.1.34
MASTER_PORT = 9420
# MASTER_TIMEOUT = 60

# CSSERV_LISTEN_HOST = *
# CSSERV_LISTEN_PORT = 9422

# CSSERV_TIMEOUT = 60
# CSTOCS_TIMEOUT = 60

# HDD_CONF_FILENAME =/etc/mfs/mfshdd.cfg

文中的大多数变量不难理解,类似于mfsmaster.cfg中的变量,其中:
MASTER_HOST:元数据服务器的名称或地址,可以是主机名,也可以是ip地址
CSSERV_LISTEN_PORT:这个监听端口用于与其它数据存储服务器间的连接,通常是数据复制。
HDD_CONF_FILENAME:分配给MFS使用的磁盘空间配置文件的位置。

(2)mfshdd.cfg的配置
[root@mail etc]# more mfshdd.cfg
/home/data/mfs/

在这里/home/data/mfs/是一个给mfs的分区,但在本机上是一个独立的磁盘的挂载目录,用 chown -R mfs:backup /home/data/mfs/ 把属主改变为mfs。

8、启动mfschunkserver
执行命令 /usr/sbin/mfschunkserver start ,如果没有意外,mfschunkserver 就应该作为一个守护进程运行起来。是否启动,检查如下:
[root@dbserv etc]# ps -ef|grep mfs
mfs      12327     1  0 08:38 ?        00:00:00 /usr/sbin/mfschunkserver start

9、停止mfschunkserver
停止mfschunkserver,利用mfschunkserver -s来安全停止mfschunkserver。

(四)MFS客户端的安装及配置
1、由于MFS客户端依赖于fuse,所以要先安装fuse。

1)、解包 tar zxvf fuse-2.7.4.tar.gz

2)、切换目录 cd fuse-2.7.4

3)、配置  ./configure --prefix=/usr --enable-static --enable-lib --enable-util --enable-example --with-pkgconfigdir=/usr/lib/pkgconfig/

4)、编译安装  make;make install
注:此软件安装看似简单,却也费去不少时间和精力。它需要系统安装了内核开发包:kernel-devel.x86_64,但通过yum安装时(此时5.4版的centos已经发布,而目前在用的是5.2版的)些版本与系统中的不一样(比系统中的内核包版本要高,应该为kernel-devel- 2.6.18-128.el5,但通过yum安装的却是164的),但编译安装没有问题,但在后面用”modprobe fuse”加载模块时却报”致命错误”而不能加载其就是因为内核开发头包的版本不对。同时还要安装”pkgconfig”这个软件包。
如果所在的系统已经安装了fuse,则跳过这个步骤,高版本的Linux内核已经支持了。

2、安装MFS客户端
1)、修改环境变量文件/etc/profile ,追加下面的行,然后再执行命令source /etc/profile使修改生效。
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH
如果不执行这个操作,在后面安装MFS的过程中,执行命令
./configure --enable-mfsmount 时可能出现
"checking for FUSE... no configure: error: mfsmount build was forced,but fuse development package is not installed"
checking for FUSE... configure: error: mfsmount build was forced, but fuse development package is not installed
这样的错误,而不能正确安装MFS客户端程序。

2)、tar zxvf mfs-1.6.12.tar.gz

3)、cd mfs-1.6.12

4)、useradd mfs -s /sbin/nologin

5)、./configure --prefix=/usr/ --sysconfdir=/etc/mfs --localstatedir=/var --with-default-user=mfs --with-default-group=nobody --enable-mfsmount

6)、make;make install
检查MFS客户端安装结果
# ll /usr/bin/

若不能正确安装MFS客户端程序,这是因为环境变量没有设置,先编辑/etc/profile在此文件中加入如下条目:export  PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH
然后再利用source命令 /etc/profile使修改生效:source /etc/profile即可,也可直接在命令行中直接执行:export  PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

3、挂载MFS文件系统
1)、创建挂载点 mkdir /mnt/mfs

2)、加载fuse模块到内核:modprobe fuse

3)、挂载MFS
/usr/bin/mfsmount  /mnt/mfs -H mfsmaster.freeoa.net -P 9421 -p
然后在输入密码就可以了,特别需要注意的是,所有的MFS都是挂载同一个元数据服务器master的IP,而不是其他数据存储服务器chunkserver的IP。

4)、查看挂载情况
通过df命令查看磁盘使用情况来检查是否被挂载成功
hdebian:~# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda2             7.4G  272M  6.7G   4% /
tmpfs                1003M  4.0K 1003M   1% /lib/init/rw
udev                   10M   88K   10M   1% /dev
tmpfs                1003M     0 1003M   0% /dev/shm
/dev/sda1             1.9G   51M  1.7G   3% /boot
/dev/sda5             105G   75G   31G  72% /home
/dev/sda6             4.6G  138M  4.3G   4% /tmp
/dev/sda7              12G  2.9G  7.6G  28% /usr
/dev/sda8              15G  510M   14G   4% /var
mfsmaster.freeoa.net:9421
499G  7.0G  492G   2% /mnt/mfs

利用mount命令查看:
hdebian:~# mount
/dev/sda2 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sda1 on /boot type ext3 (rw)
/dev/sda5 on /home type xfs (rw)
/dev/sda6 on /tmp type ext3 (rw)
/dev/sda7 on /usr type ext3 (rw)
/dev/sda8 on /var type ext3 (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
mfsmaster.freeoa.net:9421 on /mnt/mfs type fuse.mfs (rw,nosuid,nodev,allow_other,default_permissions)

(五)对mfscgiserv的使用
Mfscgiserv是用python编写的一个web服务器,它的监听端口是9425,
可以利用:/usr/sbin/mfscgiserv来启动,用户利用浏览器就可全面监控所有客户挂载,chunkserver及master server,客户端的各种操作等等。在任何一台装有浏览器的机器上都可以查看:http://mfsmaster.freeoa.net:9425

_____________________________________
回顾编译和安装的过程
MooseFS部署的首选方法是从源代码安装,源代码包安装支持标准./configure && make && make install的步骤,重要的配置选项有:
--disable-mfsmaster –不创建成管理服务器(用于纯节点的安装)
--disable-mfschunkserver –不创建成数据存储chunkserver服务器
--disable-mfsmount –不创建mfsmount和mfstools(如果用开发包安装,他们会被默认创建的)
--enable-mfsmount –确定安装mfsmount和mfstools
--prefix=DIRECTORY –锁定安装目录(默认是/usr/local)
--sysconfdir=DIRECTORY –选择配置文件目录(默认是${prefix}/etc))
--localstatedir=DIRECTORY –选择变量数据目录(默认是${prefix}/var,MFS元数据被存储在mfs的子目录下,默认是${prefix}/var/mfs )
--with-default-user  -运行守护进程的用户,如果配置文件中没有设定用户,默认为nobody用户
--with-default-group=GROUP  运行守护进程的用户组,如果配置文件中没有设定用户组,默认为nogroup用户组
例如用FHS(文件系统层次标准)的兼容路径在Linux上的安装:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib

编译安装遵守标准的DESTDIR='variable',允许安装包在临时目录(例如以创造二进制包)。已经存在的配置或这是元数据文件将会被覆盖掉。

一)、管理服务器(master)
作为管理服务器(master)是MooseFS部署中重要的一个元素,在硬件方面,应该被安装在一台能够保证高可靠性和能胜任的整个系统存取的要求的机器上。一个明智的做法是用一个配有冗余电源、ECC内存、磁盘阵列,如RAID1/RAID5/RAID10。在操作系统方面,管理服务器的操作系统应该是具有POSIX兼容的系统(到目前支持Linux, FreeBSD, Mac OS X and OpenSolaris)。
安装管理服务器(master server)的过程:
1、安装mfs-master

2、如果是从源码安装的话,在configure时不要加--disable-mfsmaster选项

3、创建运行master的用户(如果这样的用户不存在的话)

4、确定存放元数据文件的目录存在,而且能够被运行master的用户可写(通过configure的选项来设置运行master server的用户和元数据存储的路径,make install命令的执行要用root用户)

5、配置master server服务器是通过配置文件mfsmaster.cfg来做的,要特别注意的是TCP端口的使用

6、添加或创建(依赖于操作系统和发布版本)一组启动mfsmaster进程的脚本
安装完管理服务器后,便可以用mfsmaster命令来启动master server,如果用root用户执行mfsmaster命令,则在启动后转为mfsmaster.cfg中指定的用户来运行,否则将以执行 mfsmaster命令的用户来运行master server。

二)、元数据日志服务器
元数据日志守护进程是在安装 master server时一同安装的,最小的要求并不比master本身大,可以被运行在任何机器上(例如任一台chunkserver),但是最好是放置在 MooseFS master的备份机上,备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。因为主要的master server一旦失效,可能就会将这台metalogger机器取代而作为master server。

安装管理进程:
1、从源代码安装mfs-master,在执行configure时不要带有--disable-mfsmaste选项

2、创建有运行mfsmetalogger服务权限运行的用户(如果这样的用户不存在的话)

3、确定存放元数据文件的目录存在,而且能够被运行mfsmetalogger服务的用户可写(通过configure的选项来设置运行mfsmetalogger服务的用户和元数据存储的路径,make install命令的执行要用root用户)

4、通过mfsmetalogger.cfg配置mfsmetalogger服务,要特别注意的是TCP端口,这里要使用MASTER_PORT要必须和mfsmaster.cfg文件中的MATOML_LISTEN_PORT一致

5、添加或创建(依赖于操作系统和发布版本)一组启动mfsmetalogger进程的脚本
安装完管理服务器后,便可以用mfsmetalogger命令来启动mfsmetalogger server,如果用root用户执行mfsmetalogger命令,则在启动后转为mfsmetalogger.cfg中指定的用户来运行,否则将以执行mfsmetalogger命令的用户来运行mfsmetalogger server。

三)、数据服务器
安装完管理服务器后,将安装数据服务器(chunkservers),这些机器的磁盘上要有适当的剩余空间,而且操作系统要遵循POSIX标准(验证了的有这些:Linux, FreeBSD, Mac OS X and OpenSolaris)。Chunkserver在一个普通的文件系统上储存数据块/碎片(chunks/fragments)作为文件。

注:每一个chunkserver的磁盘都要为增长中的chunks保留些磁盘空间,从而达到创建新的chunk。只有磁盘都超过256M并且chunkservers报告自由空间超过1GB总量才可以被新的数据访问。最小的配置,应该从几个G字节的存储。

安装数据服务器 (chunkserver):
1、把预先隔离的磁盘空间作为一个单独的文件系统,挂载在一个本地的目录下(如:/mnt/hd1, /mnt/hd2等等)

2、安装mfs-chunkserver
在执行configure时要不带—disable-mfschunkserver选项

3、创建有运行chunkserver服务权限运行的用户(如果这样的用户不存在的话)

4、并给予这个户对整个MooseFS文件系统写的权限

5、利用mfschunkserver.cfg文件配置mfschunkserver服务,特别要注意的是TCP端口(MASTER_PORT变量要和mfsmaster.cfg中MATOCS_LISTEN_PORT的值一样)

6、在mfshdd.conf文件中列出要用于MooseFS的挂载点

7、添加或创建(依赖于操作系统和发布版本)一组启动mfschunkserver进程的脚本

注:Mfschunkserver 的本地ip很重要,Mfschunkserver用此ip和mfsmaster进行连接,mfsmaster通过此ip和 MFS客户端连接(mfsmount),而且其它chunkservers之间的通讯也是通过这个ip,因此这个ip必须是远程可访问的。因此 mfsmaster的本地ip地址(MASTER_HOST)设置必须和chunkserver一样,以便于正确的连接,通常的做法是 mfsmaster,chunkservers和MFS客户端在同一网段。一般的回环地址(localhost, 127.0.0.1)不能用于MASTER_HOST,它将使chunkserver无法被其她主机访问(这样的配置只会是单机器的机器 mfsmaster,mfschunkserver和mfsmount运行)。

安装完mfschunkserver后,便可以用 mfschunkserver命令来启动mfschunkserver服务器,如果用root用户执行 mfschunkserver命令,则在启动后转为mfschunkserver.cfg中指定的用户来运行,否则将以执行mfschunkserver 命令的用户来运行mfschunkserver服务。

四)、客户端(mfsmount)
mfsmount需要FUSE才可以正常工作,FUSE支持多种操作系统:Linux, FreeBSD, OpenSolaris and MacOS X。Linux 一个内核模块的API版本至少必需是7.8的,这个可以用dmesg命令来检测,当载入内核模块后,应该能看到有一行fuse init (API version 7.8)。一些可用的fuse版本是2.6.0以上,Linux kernel 2.6.20(Linux内核从2.6.20后加入了fuse)以上。由于一些小bug,因此比较新模块被荐使用,如fuse 2.7.2 及 Linux 2.6.24(尽管fuse 2.7.x单独没有包含getattr/write race condition fix)。在FreeBSD系统上fusefs-kmod版本要0.3.9以上的才可以,在MacOS X Mac上 FUSE要10.5版本。

安装MooseFS客户端:
1、安装mfs-client,从源代码安装,在进行configure时不要加--disable-mfsmount选项就可以了

2、建立被MooseFS挂载的目录,例如/mnt/mfs

3、MooseFS用一下的命令挂载:
mfsmount [-h master] [-p port] [-l path] [-w mount-point]
-H MASTER:是管理服务器(master server)的ip地址

-P PORT: 是管理服务器(master server)的端口号,要按照mfsmaster.cfg 配置文件中的变量MATOCU_LISTEN_POR的之填写。如果master serve使用的是默认端口号则不用指出。

-S PATH:指出被挂载mfs目录的子目录,默认是/目录,就是挂载整个mfs目录。

Mountpoint:是指先前创建的用来挂载mfs的目录。

_____________________________________
使用 MooseFS
一、挂载文件系统
启动管理服务器(master server)和数据服务器(chunkservers) (chunkservers一个是必需的,但至少两个推荐) 后,客户机便可以利用mfsmount挂载mfs文件系统。

MooseFS文件系统利用下面的命令:
mfsmount mountpoint [-d] [-f] [-s] [-m] [-n] [-p] [-H MASTER] [-P PORT] [-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卷上删除文件或者是为了释放磁盘空间而移动的文件而又此文件又过去了垃圾文件存放期的恢复,例如:
mfsmount -m /mnt/mfsmeta
需要注意的是,如果要决定挂载mfsmeta,那么一定要在mfsmaster的mfsexports.cfg文件中加入如下条目:
*                       .       rw

原文件中有此条目,只要将其前的#去掉就可以了。

基本操作
挂载文件系统后就可以执行所有的标准的文件操作了(如创建,拷贝,删除,重命名文件,等等)。MooseFS是一个网络文件系统,因此操作进度可能比本地系统要慢。

MooseFS卷的剩余空间检查可以用和本地文件系统同样的方法,例如df命令:
$ df -h | grep mfs
mfs#mfsmaster.freeoa.net:9421
106G   65M  106G   1% /mnt/mfs

重要的是每一个文件可以被储存多个副本,在这种情况下,每一个文件所占用的空间要比其文件本身大多了。此外,被删除且在有效期内(trashtime)的文件都放在一个“垃圾箱”,所以他们也占用的空间,其大小也依赖文件的份数。就像其他Unix的文件系统一样,以防删除一个被其它进程打开文件,数据将被一直存储,至少直到文件被关闭。

二、MooseFS的特定的操作
1、设定的目标
目标(goal),是指文件被拷贝的份数,设定了拷贝的份数后是可以通过可以mfsgetgoal命令来证实的,也可以通过mfssetgoal来改变设定。例如:
$ mfsgetgoal /mnt/mfs/test
/mnt/mfs/test: 2
$ mfssetgoal 3 /mnt/mfs/test
/mnt/mfs/test: 3
$ mfsgetgoal /mnt/mfs/test
/mnt/mfs/test: 3
用mfsgetgoal –r和mfssetgoal -r同样的操作可以对整个树形目录递归操作。
$ mfsgetgoal -r /mnt/mfs/test2
/mnt/mfs/test2:
files with goal        2 :                   36
directories with goal  2 :                    1
$ mfssetgoal -r 3 /mnt/mfs/test2
/mnt/mfs/test2:
inodes with goal changed:                        37
inodes with goal not changed:                     0
inodes with permission denied:                    0
$ mfsgetgoal -r /mnt/mfs/test2
/mnt/mfs/test2:
files with goal        3 :                   36
directories with goal  3 :                    1

实际的拷贝份数可以通过mfscheckfile 和 mfsfileinfo 命令来证实,例如:
[root@minsl mfs]# mfscheckfile /mnt/mfs/test/Download.png
/mnt/mfs/test/Download.png:
2 copies: 1 chunks
[root@minsl mfs]# mfsfileinfo /mnt/mfs/test/Download.png
/mnt/mfs/test/Download.png:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 192.168.1.4:9422
copy 2: 192.168.1.12:9422

注意:一个不包含数据的零长度的文件,尽管没有设置为非零的目标(the non-zero "goal"),但用命令查询将返回一个空的结果,例如:
[root@www bin]# touch /mnt/mfs/mmm
[root@www bin]# ./mfsfileinfo  /mnt/mfs/mmm
/mnt/mfs/mmm:

但是如果对此文件进行编辑,如:
[root@www bin]# echo "1234"> /mnt/mfs/mmm
然后看:
root@www bin]# ./mfsfileinfo  /mnt/mfs/mmm   
/mnt/mfs/mmm:
chunk 0: 0000000000000040_00000001 / (id:64 ver:1)
copy 1: 192.168.1.31:9422
copy 2: 192.168.1.96:9422
copy 3: 192.168.1.139:9422

此时在将文件清空:
[root@www bin]# echo ""> /mnt/mfs/mmm

然后在看:
[root@www bin]# ./mfsfileinfo  /mnt/mfs/mmm      
/mnt/mfs/mmm:
chunk 0: 0000000000000041_00000001 / (id:65 ver:1)
copy 1: 192.168.1.31:9422
copy 2: 192.168.1.96:9422
copy 3: 192.168.1.139:9422

副本将任然存在。假如改变一个已经存在的文件的拷贝个数,那么文件的拷贝份数将会被扩大或者被删除,这个过程会有延时,可以通过上面的命令来证实。

对一个目录设定“目标”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的拷贝份数。例如:
[root@bzd f]# touch 1
[root@bzd f]# echo “11” > 1
[root@bzd f]# /usr/mfs/bin/mfsfileinfo 1
1:
chunk 0: 0000000000000043_00000001 / (id:67 ver:1)
copy 1: 192.168.1.31:9422
copy 2: 192.168.1.96:9422
copy 3: 192.168.1.139:9422

[root@bzd f]# cd ..

[root@bzd mfs]# /usr/bin/mfssetgoal 2 f
f: 2
[root@bzd mfs]# cd f/
[root@bzd f]# ls
1
[root@bzd f]# touch 2
[root@bzd f]# echo “222” > 2
[root@bzd f]# /usr/bin/mfsfileinfo 1
1:
chunk 0: 0000000000000043_00000001 / (id:67 ver:1)
copy 1: 192.168.1.31:9422
copy 2: 192.168.1.96:9422
copy 3: 192.168.1.139:9422
[root@bzd f]# /usr/bin/mfsfileinfo 2
2:
chunk 0: 0000000000000044_00000001 / (id:68 ver:1)
copy 1: 192.168.1.31:9422
copy 2: 192.168.1.96:9422

整个目录树的内容摘要可以用一个功能增强的等同于du -s的命令mfsdirinfo,mfsdirinfo为MooseFS列出具体的信息。
例如:
$ mfsdirinfo /mnt/mfs/test/:
inodes:                         15
directories:                    4
files:                          8
chunks:                          6
length:                     270604
size:                       620544
realsize:                  1170432

上述内容摘要显示了目录、文件及chunks的数目,还有整个目录占用磁盘空间的情况。
length -文件大小的总和
size –块长度总和
realsize –磁盘空间的使用包括所有的拷贝

三、垃圾箱(trash bin)设定隔离的时间(quarantine time)
一个删除文件能够存放在一个“垃圾箱”的时间就是一个隔离时间,这个时间可以用mfsgettrashtime命令来验证,也可以用mfssettrashtime命令来设置,例如:
$ mfsgettrashtime /mnt/mfs/test
/mnt/mfs/test: 604800
$ mfssettrashtime 0 /mnt/mfs/test
/mnt/mfs/test: 0
$ mfsgettrashtime /mnt/mfs/test
/mnt/mfs/test: 0

这些工具也有个递归选项-r,可以对整个目录树操作,例如:
$ mfsgettrashtime -r /mnt/mfs/test2
/mnt/mfs/test2:
files with trashtime                 0 :                   36
directories with trashtime      604800 :                    1
$ mfssettrashtime -r 1209600 /mnt/mfs/test2
/mnt/mfs/test2:
inodes with trashtime changed:                       37
inodes with trashtime not changed:                    0
inodes with permission denied:                        0
$ mfsgettrashtime -r /mnt/mfs/test2
/mnt/mfs/test2:
files with trashtime           1209600 :                   36
directories with trashtime     1209600 :                    1

时间的单位是秒(有用的值有:1小时是3600秒,24小时 - 86400秒,1天 - 604800秒)。就像文件被存储的份数一样,为一个目录设定存放时间是要被新创建的文件和目录所继承的。数字0意味着一个文件被删除后, 将立即被彻底删除,在想回收是不可能的删除文件可以通过一个单独安装MFSMETA文件系统。特别是它包含目录 /trash (包含任然可以被还原的被删除文件的信息)和 /trash/undel (用于获取文件)。只有管理员有权限访问MFSMETA(用户的uid 0,通常是root)。

$ mfssettrashtime 3600 /mnt/mfs/test
/mnt/mfs/test: 3600
$ rm /mnt/mfs/test
$ ls  /mnt/mfs/test
ls: /mnt/mfs/test: No such file or directory
# ls -l /mnt/mfs-meta/trash/*test1
-rw-r--r-- 1 user      users     1 2007-08-09 15:23 /mnt/mfs-meta/trash/00013BC7|test1

被删文件的文件名在“垃圾箱”目录里还可见,文件名由一个八位十六进制的数i-node和被删文件的文件名组成,在文件名和i-node之间不是用“/”, 而是用了“|”替代。如果一个文件名的长度超过操作系统的限制(通常是255个字符),那么部分将被删除。通过从挂载点起全路径的文件名被删除的文件任然可以被读写。需要注意的是被删除的文件在用全路径文件名(注意文件名是两部分)时一定要用单引号引起来。例如:
# cat '/mnt/mfs-meta/trash/00013BC7|test1'
test1
# echo 'test/test2' > '/mnt/mfs-meta/trash/00013BC7|test1'
# cat '/mnt/mfs-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目录中的一样,但是不能有其他功能的操作。

四、快照
MooseFS系统的另一个特征是利用mfsmakesnapshot工具给文件或者是目录树做快照,例如:
$ mfsmakesnapshot source ... destination

Mfsmakesnapshot 是在一次执行中整合了一个或是一组文件的拷贝,而且任何修改这些文件的源文件都不会影响到源文件的快照,就是说任何对源文件的操作,例如写入源文件,将不会修改副本(或反之亦然)。文件快照可以用mfsappendchunks,就像MooseFS1.5中的mfssnapshot一样,作为选择,二者都可以用。例如:
$ mfsappendchunks destination-file source-file ...

当有多个源文件时,它们的快照被加入到同一个目标文件中(每个chunk的最大量是chunk)。

五、额外的属性
文件或目录的额外的属性(noowner, noattrcache, noentrycache),可以被mfsgeteattr,mfsseteattr,mfsdeleattr工具检查、设置、删除,其行为类似 mfsgetgoal/mfssetgoal 或者是mfsgettrashtime/mfssettrashtime,详细可见命令手册。

_____________________________________
MooseFS 维护
一、启动MooseFS集群
最安全的启动MooseFS集群(避免任何读或写的错误数据或类似的问题)的方式是按照以下命令步骤:
1)、启动mfsmaster进程

2)、启动所有的mfschunkserver进程

3)、启动mfsmetalogger进程(如果配置了mfsmetalogger)
当所有的chunkservers连接到MooseFS master后,任何数目的客户端可以利用mfsmount去挂载被export的文件系统。(可以通过检查master的日志或是CGI监视器来查看是否所有的chunkserver被连接)。

二、停止MooseFS集群
安全的停止MooseFS集群:
1)、在所有的客户端卸载MooseFS 文件系统(用umount命令或者是其它等效的命令)

2)、用mfschunkserver –s命令停止chunkserver进程

3)、用mfsmetalogger –s命令停止metalogger进程

4)、用mfsmaster –s命令停止master进程

三、MooseFS chunkservers的维护
假如每个文件的goal(目标)都不小于2,并且没有under-goal文件(这些可以用mfsgetgoal –r和mfsdirinfo命令来检查),那么一个单一的chunkserver在任何时刻都可能做停止或者是重新启动。以后每当需要做停止或者是重新启动另一个chunkserver的时候,要确定之前的chunkserver被连接,而且要没有under-goal chunks。

四、MooseFS元数据的备份
通常元数据有两部分的数据
1.主要元数据文件metadata.mfs,当mfsmaster运行的时候会被命名为metadata.mfs.back

2.元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变(N的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg配置文件中)

主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs储存。元数据changelogs应该实时的自动复制。自从MooseFS 1.6.5,这两项任务是由mfsmetalogger守护进程做的。

五、MooseFS master的恢复
一旦mfsmaster崩溃(例如因为主机或电源失败),需要最后一个元数据日志changelog并入主要的metadata中。这个操作时通过mfsmetarestore工具做的,最简单的方法是:
mfsmetarestore -a

如果master数据被存储在MooseFS编译指定地点外的路径,则要利用-d参数指定使用,如:
mfsmetarestore -a -d /storage/mfsmaster

六、从备份恢复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

_____________________________________
MooseFS 启动脚本的编写
下面提供一个脚本,比如启动mfschunkserver的脚本,可将其更改为mfsmaster或mfsmetalogger,针对两种版本的操作系统(由于新版本已经将启动文件放置文档贡献目录,本文从此略去):
debian
-------------
mfsmaster:
...
-------------
mfschunkserver:
...
-------------
mfsmetalogger:
...
-------------
---------------------------
redhat:
...
--------------------------------
将做成的启动脚本加入系统中:
update-rc.d mfsmetalogger defaults
update-rc.d mfschunkserver defaults
invoke-rc.d mfschunkserver restart

chkconfig --level 345 mfschunkserver on
service mfschunkserver restart
_____________________________________
安装配置过程中的若干问题
一、相关依赖软件没有安装
master在debian系统下进行'configure'的过程中出错,记录如下:
checking for pkg-config... no
no pkg-config - can't check FUSE version
**** mfsmount disabled *****
* pkg-config not installed *
****************************
checking for fuse_version in -lfuse... no
checking for zlibVersion in -lz... no
configure: error: zlib development library not found
需要安装pkg-config、fuse、zlib库等软件。安装之:
xdeb:~# apt-get install pkg-config fuse-utils libfuse2 zlib1g-dev
但还是发现缺少fuse模块,难道没有安装对?
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for FUSE... no
******************************** mfsmount disabled ********************************
* fuse library is too old or not installed - mfsmount needs version 2.6 or higher *
***********************************************************************************
checking for fuse_version in -lfuse... no
checking for zlibVersion in -lz... yes
checking zlib.h usability... yes
checking zlib.h presence... yes
checking for zlib.h... yes
看来要安装其开发库,才能解决问题。
xdeb:~# apt-get install libfuse-dev

如果想一次性解决问题和话,就一下装完吧:# apt-get install pkg-config fuse-utils libfuse2 zlib1g-dev libfuse-dev

在redhat系列的Linux下可以通过下面的指令来安装系统中可能不存在的fuse模块及zlib库:
[root@interinx mfs-1.6.16]#yum install fuse.i386 fuse-devel.i386 fuse-libs.i386 zlib-devel.i386

二、在向挂载的分区里复制文件时特别慢,甚至没有响应。
当作为客户端来挂载分区时,如果出现此类现象,可打开调试选项(-d)来通过输出查看问题的所在。
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster.freeoa.net -P 9421 -d
出现这种情况是其中有台chunkserver服务器的防火墙阻止了9422端口,就造成了复制过程停止,关闭那台chunkserver机器的防火墙后问题立即解决。

该文章最后由 阿炯 于 2016-09-05 17:21:06 更新,目前是第 10 版。