您的位置:首页 > 其它

分布式文件系统MFS(moosefs)实现存储共享

2011-03-07 15:00 495 查看

分布式文件系统MFS(moosefs)实现存储共享

版权声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处
、作者信息和本声明。否则将追究法律责任。/article/4124698.html

由于用户数量的不断攀升
,
我对访问量大的应用实现了可扩展、高可靠的集群部署(即
lvs+keepalived
的方式),但仍然有用户反馈访问慢的问题。通过排查个服务器的情况,发现问题的根源在于共享存储服务器
NFS
。在我这个网络环境里,
N
个服务器通过
nfs
方式共享一个服务器的存储空间,使得
NFS
服务器不堪重负。察看系统日志,全是
nfs
服务超时之类的报错。一般情况下,当
nfs
客户端数目较小的时候,
NFS
性能不会出现问题;一旦
NFS
服务器数目过多,并且是那种读写都比较频繁的操作,所得到的结果就不是我们所期待的。下面是某个集群使用
nfs
共享的示意图:


这种架构除了性能问题而外,还存在单点故障,一旦这个
NFS

服务器发生故障,所有靠共享提供数据的应用就不再可用,尽管用
rsync

方式同步数据到另外一个服务器上做
nfs

服务的备份,但这对提高整个系统的性能毫无帮助。基于这样一种需求,我们需要对
nfs

服务器进行优化或采取别的解决方案,然而优化并不能对应对日益增多的客户端的性能要求,因此唯一的选择只能是采取别的解决方案了;通过调研,分布式文件系统是一个比较合适的选择。采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系(
1


NFS

服务器,多个
NFS

客户端),而是多对多的关系,这样一来,性能大幅提升毫无问题。

到目前为止,有数十种以上的分布式文件系统解决方案可供选择,如
lustre,hadoop,Pnfs

等等。我尝试了
PVFS,hadoop,moosefs

这三种应用,参看了
lustre


KFS

等诸多技术实施方法,最后我选择了
moosefs

(以下简称
MFS

)这种分布式文件系统来作为我的共享存储服务器。为什么要选它呢?我来说说我的一些看法:

1、

实施起来简单。
MFS

的安装、部署、配置相对于其他几种工具来说,要简单和容易得多。看看
lustre 700

多页的
pdf

文档,让人头昏吧。

2、

不停服务扩容。
MFS

框架做好后,随时增加服务器扩充容量;扩充和减少容量皆不会影响现有的服务。注:
hadoop

也实现了这个功能。

3、

恢复服务容易。除了
MFS

本身具备高可用特性外,手动恢复服务也是非常快捷的,原因参照第
1

条。

4、

我在实验过程中得到作者的帮助,这让我很是感激。



MFS

文件系统的组成


1、

元数据服务器。在整个体系中负责管理管理文件系统,目前
MFS
只支持一个元数据服务器
master
,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后
MFS
能支持多个
master
服务器,进一步提高系统的可靠性。

2、

数据存储服务器
chunkserver
。真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器
chunkserver
之间复制(复制份数可以手工指定,建议设置副本数为
3
)。数据服务器可以是多个,并且数量越多,可使用的“磁盘空间”越大,可靠性也越高。

3、

客户端。使用
MFS
文件系统来存储和访问的主机称为
MFS
的客户端,成功挂接
MFS
文件系统以后,就可以像以前使用
NFS
一样共享这个虚拟性的存储了。

元数据服务器安装和配置


元数据服务器可以是
linux,
也可以是
unix,
你可以根据自己的使用习惯选择操作系统
,
在我的环境里
,
我是用
freebsd
做为
MFS
元数据的运行平台。
GNU
源码,在各种类
unix
平台的安装都基本一致。

(一)

安装元数据服务

1
、下载
GNU
源码
wget http://www.moosefs.com/files/mfs-1.5.12.tar.gz

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

3
、切换目录
cd mfs-1.5.12

4
、创建用户
useradd mfs –s /sbin/nologin

5
、配置

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

6
、编译安装
make ; make install

(二)

配置元数据服务

元数据服务器的配置文件是
mfsmaster.cfg,
我在安装
MFS
时指定了前缀,因此这个文件的位置在
/usr/local/mfs/etc/mfsmaster.cfg.
我们打开这个配置文件,看看都有哪些内容:


尽管每行都被注释掉了,但它们却是配置文件的默认值,要改变这些值,需要取消注释,然后明确指定其取值。接下来说明一下其中一些项目的含义。



LOCK_FILE = /var/run/mfs/mfsmaster.pid
文件锁所在的位置,它的功能是避免启动多次启动同一个守护进程。由于系统中本来不存在目录
/var/run/mfs
,因此需要手动创建
mkdir /var/run/mfs
,然后更改其属主
chown –R mfs:mfs /var/run/mfs
这样
MFS
服务就能对这个目录有创建
/
写入
mfsmaster.pid
文件的权限了。



DATA_PATH = /usr/local/mfs/var/mfs
数据存放路径,只元数据的存放路径。那么这些数据都包括哪些呢?进目录看看,大致分
3
种类型的文件:



这些文件也同样要存储在其他数据存储服务器的相关目录。



MATOCS_LISTEN_PORT = 9420 MATOCS--master to chunkserver
,即元数据服务器使用
9420
这个监听端口来接受数据存储服务器
chunkserver
端的连接。



MATOCU_LISTEN_PORT = 9421
元数据服务器在
9421
端口监听,用以接受客户端对
MFS
进行远程挂接(客户端以
mfsmount
挂接
MFS




其他部分看字面意思都不难理解。还有几个与时间有关的数值,其单位是秒。

这个配置文件,不必做修改就能工作了。

(一)

元数据服务器
master
启动

元数据服务器可以单独启动,即使没有任何数据存储服务器(
chunkserver
)也是能正常工作的,因此当我们安装配置完
MFS
后,即可启动它。执行命令
/usr/local/mfs/sbin/mfsmaster start
,如果没有意外,元数据库服务器就应该作为一个守护进程运行起来。现在我们可以通过
3
个方面来检查一下
MFS master
的运行状况:



(四)、关闭元数据服务器

关闭元数据服务器,务必使用
/usr/local/mfs/sbin/mfsmaster –s
这种方式,如果直接使用
kill
杀死进程,将导致下次启动时出现找不到相关文件,而不能正常启动服务器。这个一定要谨慎。当然,如果发生了这个事情,还是可以通过
mfsmetastore
来恢复的。

数据存储

chunkserver

服务器的安装配置


数据存储服务器
chunkserver
也是可以运行在各种类
unix
平台的,因此不再多说。一个
MFS
环境到底能集群多少服务器,作者的说法是上
PB
容量,个人建议,最好
3
台以上;并且专门用来做存储,不要把它跟
master
搞到一个机器(理论上没问题,实现也是可以的,但这不是一个好策略)。因为每个数据存储服务器的安装和配置都是相同的,所以只需按照一个服务器的操作就可以了。

(一)、安装数据存储服务器
chunkserver

1
、下载
GNU
源码
wget http://www.moosefs.com/files/mfs-1.5.12.tar.gz

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

3
、切换目录
cd mfs-1.5.12

4
、创建用户
useradd mfs –s /sbin/nologin

5
、配置

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

6
、编译安装
make ; make install

(二)配置数据存储服务器
chunkserver

数据存储服务器有
2
个配置服务器需要修改,一个是主配置文件
mfschunkserver.cfg ,
另一个配置文件是
mfshdd.cfg
。每个服务器用来分配给
MFS
使用的空间最好是一个单独的硬盘或者一个
raid
卷,最低要求是一个分区。作者举的例子是创建一个大文件,然后挂接在本地,这不好,只能用来做实验了。

1
、修改配置文件
/usr/local/mfs/etc/mfschunkserver.cfg
。下面是修改了的配置文件:



这个配置文件里,没有注释符号“
#
”就是被修改过的项了,接下来是里面某些项的含义说明:



MASTER_HOST = 192.168.0.19
元数据服务器的名称或地址,可以是主机名,也可以是
ip
地址,只要数据存储服务器能访问到元数据服务器就行。



LOCK_FILE = /var/run/mfs/mfschunkserver.pid
与元数据服务器
master
的处理完全相同
.



CSSERV_LISTEN_PORT = 9422 CSSERV—chunkserver,
这个监听端口用于与其它数据存储服务器间的连接,通常是数据复制。



HDD_CONF_FILENAME =
/usr/local/mfs/etc/mfshdd.cfg

分配给
MFS
使用的磁盘空间配置文件的位置。

2
、修改配置文件
/usr/local/mfs/etc/mfshdd.cfg
。在我的服务器上,只有一个
1T

SATA
硬盘,分了一个
800G
容量的分区来做为
MFS
存储服务的组成部分。为了使
mfs
拥有写目录的权限,需要修改目录的属主。我的服务器的分区挂接点是
/data ,

chown –R mfs:mfs /data
把属主改变。因为我的每个服务器只需贡献一个分区做为
MFS,
因此配置文件只需要如下一行内容就可以了:



(四)

关闭数据存储服务器

跟元数据服务器
master
相似,执行命令
/usr/local/mfs/sbin/mfschunkserver –s , chunkserver
服务就停下来了。为了使系统重启过程能自动启动
chunkserver
服务,可以通过在
/etc/rc.local
文件追加行

/usr/local/mfs/sbin/mfschunkserver start

来达到这个目的(
master
的自动重启处理也可同样处理)。

MFS

客户端的安装及配置


我的生产环境,只有
centos

freebsd
两种环境,因此下面的描述,只有
centos

freebsd
挂接
MFS
文件系统的情形,其他类型的
unix
系统,待日后尝试。对比前面的操作过程,客户端挂接后使用
MFS
集群文件系统才是最费时的事情。

一、

centos
作为
MFS
的客户端。

(一)

安装
MFS
客户端


Mfsmount
需要依赖
FUSE,
因此需要先安装好
fuse
,这里我选用
fuse-2.7.4.tar.gz


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

2
、切换目录
cd fuse-2.7.4.

3
、配置

./configure

4
、编译安装

make

make install

如果系统已经安装了
fuse,
则跳过这个步骤。

◆安装
MFS
客户端程序

1
、修改环境变量文件
/etc/profile ,
追加下面的行,然后再执行命令
source /etc/profile
使修改生效。



(二)挂接和使用
MFS
文件系统

1
、创建挂接点
mkdir /mnt/mfs

2
、挂接
MFS /usr/local/mfs/bin/mfsmount –h 192.168.0.19
.
注意,所有的
MFS
都是挂接同一个元数据服务器
master,
而不是其他数据存储服务器
chunkserver !



一、

freebsd
作为
MFS
客户端

Freebsd
安装和挂接
MFS
集群文件系统
,

centos
操作起来要复杂一些
.mfsmount
需要依赖
fuse,
并且需要在内核中加载
fusefs
模块。

(一)安装
fuse

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

2
、切换目录
cd fuse-2.7.4.

3
、配置

./configure

4
、编译安装

make

make install

如果系统已经安装了
fuse,
则跳过这个步骤。

(二)

安装内核模块
fusefs-kmod







6
、选择“
fusefs-kmod-0.3.9.p1_2”

,

[OK]
返回到第“
4

步出现的那个操作界面。这时我们用“
Tab
”键选中底部右边的“
Install
”,完成安装后,会出现一个安装成功的提示,然后瞬间消失。



加载
fusefs
模块
kldload /usr/local/modules/fuse.ko .
如果加载不成功,请检查是否存在模块文件
fuse.ko.



检查
fusefs
模块是否被加载到内核:



如果没有类似上面馆的输出,就表明
fusefs
模块没有加载成功。

(三)安装包
pkg-config


1

cd /usr/ports/devel/pkg-config

2

make install clean

(四)安装
MFS
客户端

1
、解包
tar zxvf mfs-1.5.12.tar.gz

2
、切换目录
cd mfs-1.5.12

3
、创建用户
pw useradd mfs –s /sbin/nologin

4
、配置

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount

5
、编译安装
make ; make install

◆检查
MFS
客户端安装的结果。通过查看目录
/usr/local/mfs/bin
目录的文件,应该发现如下文件:





就能实现开机或重启系统自动挂接
MFS
文件系统。

破坏性测试




、测试数据存储服务器

我用
5
个服务器组成了
MFS
的存储平台,其中一个是
master,
其余四个服务器是
chunkserver.
先停止一个
chunkserver
服务,然后在某个
MFS
客户端往挂接点的目录(
/mnt/mfs
)里复制数据或者创建目录
/
文件、或者读取文件、或者删除文件,观察操作是否能正常进行。再停止第
2

chunkserver
,重复执行上述操作;然后再停止第
3
个服务器,执行类似的文件读些操作。减少
chunkserver
试验后,我们再来逐步增加
chunkserver
服务器
,
然后对
MFS
执行读写等相关访问操作,检验其正确性。

通过增减
chunkserver
服务器的测试,服务的可靠性确实不错,哪怕只剩下最后一个服务器,也能正常提供存储访问服务。

二、测试元数据服务器

元数据服务器最重要的文件在目录
/usr/local/mfs/var/mfs ,MFS
每一个数据的变化
,
都被记录在这个目录的文件里
,
我们可以通过备份这个目录的全部文件
,
来保障整个
MFS
文件系统的可靠性
.
在正常情况下
,
元数据服务器的改变日志文件
(changelogs)
实时地、自动地复制到所有的数据存储服务器,并且以
changelog_csback.*.mfs

的形式命名。换句换说,即使元数据服务器报废了,也能再部署一个元数据服务器,然后从数据存储服务器chunkserver
取得恢复所需要的文件。

(一)本地测试

1
、停止元数据服务
/usr/local/mfs/sbin/mfsmaster

2
、备份元数据服务器数据
cd /usr/local/mfs/var; tar czvf mfs.tgz mfs

3
、删除目录
mv mfs mfs.bk

rm –rf mfs

4
、启动元数据服务
../sbin/mfsmaster start
启动失败,提示不能初始化数据。

5
、解包
tar zxvf mfs.tgz

6
、执行恢复操作
..
/sbin
/
mfsmetarestore –a

7
、启动元数据服务 ../sbin/mfsmaster start

8
、在MFS
客户端检查MFS
存储的数据是否跟恢复前一致?能否正常访问等等。

(一)

迁移测试

1、

安装新的MFS
元数据服务器。

2、

复制元数据服务器数据目录(/usr/local/mfs/var/mfs
)到这个新的元数据服务器。

3、

停止原先的那个元数据服务器(关闭计算机或停止它的网络服务)。

4、

更改新的元数据服务器的ip
为原来那个服务器的ip.

5、

启动新的元数据服务 /usr/local/mfs/sbin/mfsmaster start

6、

在MFS
客户端检查MFS
存储的数据是否跟恢复前一致?能否正常访问等等。

感谢Pawel Kalinowski
(mfs
作者)提供帮助!

补充: linux可能需要在执行mfsmount前先加载fuse模块到内核 /sbin/modprobe fuse
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: