MooseFS 分布式文件系统的部署与应用

来源:互联网 发布:大明1937 知乎 编辑:程序博客网 时间:2024/05/16 05:38

mooseFS简介

MooseFS正式的推出是在2008-05-30,到2009-10-12为止,最新的版本是1.5.12。 
MFS是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结 构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。

详细介绍参见官方文档:http://www.moosefs.com/pages/mfs.html 或
本站介绍文章:http://salogs.com/category/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/moosefs/

mooseFS系统的组成

1.master(元数据服务器)

master负责在整个系统中管理数据。是整个系统的维护者。但是它有个弱点就是master只有一个!也就是说如果master坏掉,整个系统将停止工作!不过这算不上致命弱点,因为我们做好数据备份以后,恢复master是很简单的事。

2.chunkserver(数据存储服务器)

chunkserver是mfs系统中的数据存储者。真正的用户数据按照算法被分成chunk,并分发到各个chunkserver上。这样就保证了数据的安全性。

3.client

凡是使用mfs文件系统的机器都可以被称为client。client是mfs系统的使用者。当client把mfs文件系统挂载到本机以后,它可以像使用一个普通的磁盘分区一样,来使用mfs。

试验环境

本文只介绍moosefs的部署与应用,出于试验的目的,并没有考虑性能因素,因此所有的服务器均使用虚拟机来实现。以后有机会做单独的物理服务器,然后对其性能进行测试。

服务器名系统IP备注MasterCentos 5.3 64bit192.168.108.108利用xen虚拟了5台服务器chunkserver 1Centos 5.3 64bit192.168.108.161vmchunkserver 2Centos 5.3 64bit192.168.108.162vmchunkserver 3Centos 5.3 64bit192.168.108.163vmchunkserver 4Centos 5.3 64bit192.168.108.164vmclientCentos 5.3 64bit192.168.108.109vm

拓扑图

moosefs 本次试验拓扑图

备注: 
(1) chunkserver1-4 均添加了一块虚拟的磁盘sda(磁盘空间一定要大于1G,我这里设置了4G),挂载到系统的/data下。所有服务器均升级内核为2.6.18-164本版,为什么要升级内核,下文会有介绍。
(2) 所有服务器均安装了完整版的mfs组件

安装与配置

安装mfs的前提条件

由于mfs的客户端程序也就是加载mfs磁盘系统的命令是使用fuse编写的,因此只要是想挂载mfs的服务器,必要的前提条件就是先安装fuse,这样编译mfs的时候才能顺利通过。另外一点需要注意 :linux 2.6.18-164.e15 版本的linux内核中已经内置了fuse模块。但在该版本之前的linux内核中是不包含这个模块的。另fuse 从2.8.0-pre1 版本的源码包中去掉了fuse系统模块的源码部分,原因就是上一点提到的。这样我们在编译安装当前最新版本的fuse(2.8以上版本) 且正在使用的linux内核版本低于2.6.18-164.e15版本,则系统中是不包含fuse模块的。
解决的方法: 
1、升级系统内核为2.6.18-164版本 
为了方便起见直接利用yum升级系统内核即可。yum install kernel
安装成功后需重启系统

2、使用fuse 2.7x版本编译安装 
该版本的fuse中包含了linux内核需要的fuse模块,配置编译选项时指定 --enable-kernel-module 选项,make的时候就会编译相应的fuse模块,make intall会将fuse.ko复制到 /lib/modules/`uname -r`/kernel/fs/fuse/ 目录下 安装后利用
# modprobe -l | grep fuse
/lib/modules/2.6.18-128.el5xen/kernel/fs/fuse/fuse.ko
查看是否正常安装

3、利用yum安装当前内核版本的fuse模块 
yum install -y dkms-fuse dkms

安装fuse

如果只编译元数据服务端或数据存储服务端的话是没有必要安装fuse的。只有mfsmount需要fuse支持(编译时需要fuse的开发包,使用mfsmount挂载时需要fuse.ko系统模块)。可以使用源码或yum两种方式安装fuse
1、源码安装 
# wget http://ncu.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.1/fuse-2.8.1.tar.gz
# tar -xvzf fuse-2.8.1.tar.gz
# cd fuse-2.8.1
# ./configure --prefix=/usr/ --libdir=/usr/lib64
# make && make install

由于我系统为64位,因此在编译fuse时将lib目录定为/usr/lib64。这样在下面编译安装mfs时就不会因为找不到fuse的lib文件报错了。

2、yum安装 
# yum install -y fuse fuse-devel

安装mfs

# useradd mfs -s /sbin/nologin
# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount
# make && make install

查看安装后目录结构
# ll /usr/local/mfs/
total 20
drwxr-xr-x 2 root root 4096 Oct 14 15:14 bin
drwxr-xr-x 2 root root 4096 Oct 14 12:13 etc
drwxr-xr-x 2 root root 4096 Oct 14 15:14 sbin
drwxr-xr-x 3 root root 4096 Oct 14 12:13 share
drwxr-xr-x 3 root root 4096 Oct 14 12:13 var

bin - 客户端工具
etc - 元数据服务器,数据存储服务器的配置文件都放在该目录中
sbin - 元数据服务器端程序mfsmaster、数据存储服务器端服务程序mfschunkserver
share - 文档
var - 元数据目录(可在配置文件中自定义到其他目录)

配置master(元数据服务器)

IP:192.168.108.108

[ root@ master ~] # vi /usr/local/mfs/etc/mfsmaster.cfg 
# WORKING_USER = mfs 
# WORKING_GROUP = mfs 

# LOCK_FILE = /var/run/mfs/mfsmaster.pid 
# DATA_PATH = /usr/local/mfs/var/mfs 
# SYSLOG_IDENT = mfsmaster 

# BACK_LOGS = 50 

# REPLICATIONS_DELAY_INIT = 300 
# REPLICATIONS_DELAY_DISCONNECT = 3600
 

MATOCS_LISTEN_HOST = 192.168.108.108
# MATOCS_LISTEN_PORT = 9420 

# MATOCU_LISTEN_HOST = * 
# MATOCU_LISTEN_PORT = 9421 

# CHUNKS_LOOP_TIME = 300 
# CHUNKS_DEL_LIMIT = 100 
# CHUNKS_REP_LIMIT = 15

注: 这个配置文件中所有注掉的设置都是默认的配置。在 这里我只更改了MATOCS_LISTEN_HOST的值,也就是将它修改为本机的ip地址:192.168.108.108 。如果又需要还可以修改DATA_PATH的设置将元数据目录存储到其他的分区或磁盘。其他的参数都很简单根据需要调整即可。

master会打开9420端口等待 mfschunkserver 连接 

启动mfsmaster
 
[root@master ~]# /usr/local/mfs/sbin/mfsmaster
[root@master ~]# ps -ef | grep mfsmaster | grep -v grep
mfs 10132 1 0 17:37 ? 00:00:00 /usr/local/mfs/sbin/mfsmaster
[root@master ~]# netstat -tulnp | grep mfsmaster
tcp 0 0 192.168.108.108:9420 0.0.0.0:* LISTEN 10132/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 10132/mfsmaster

查看系统日志 
[root@master ~]# tail -f /var/log/messages
Oct 14 17:37:35 master mfsmaster: config: using default value for option 'SYSLOG_IDENT' - 'mfsmaster'
Oct 14 17:37:35 master mfsmaster[10130]: config: using default value for option 'WORKING_USER' - 'mfs'
Oct 14 17:37:35 master mfsmaster[10130]: config: using default value for option 'WORKING_GROUP' - 'mfs'
...
Oct 14 17:37:35 master mfsmaster[10132]: config: using default value for option 'CHUNKS_LOOP_TIME' - '300'
# 以上日志内容省略的很多,主要是程序读取配置的过程。

# 下面的部分为检查元数据和检查数据存储服务器的情况(每1分钟检查一次)。
# 由于我这里还没有启动chunkservers 因此在chunkservers status:的显示结
# 果为空。total: usedspace: 的结果也为空。
 
Oct 14 17:38:00 master mfsmaster[10132]: inodes: 45
Oct 14 17:38:00 master mfsmaster[10132]: dirnodes: 3
Oct 14 17:38:00 master mfsmaster[10132]: filenodes: 42
Oct 14 17:38:00 master mfsmaster[10132]: chunks: 14
Oct 14 17:38:00 master mfsmaster[10132]: chunks to delete: 0
Oct 14 17:38:00 master mfsmaster[10132]: chunkservers status:
Oct 14 17:38:00 master mfsmaster[10132]: total: usedspace: 0 (0 GB), totalspace: 0 (0 GB), usage: 0.00%

设置服务随系统启动 
[root@master ~]# echo "/usr/local/mfs/sbin/mfsmaster" >>/etc/rc.local

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

IP:192.168.108.161~164

[ root@ chunkserver-1 ~] # vi /usr/local/mfs/etc/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.108.108
# 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

配置存储分区 
[root@chunkserver-1 ~]# vi /usr/local/mfs/etc/mfshdd.cfg
删除
/mnt/hd1
/mnt/hd2
/mnt/hd3
/mnt/hd4
添加独立的分区
/data 
修改分区所有者为mfs 
[root@chunkserver-1 ~]# chown mfs.mfs /data
注: mfschunkserver 服务器的主配置很简单,没有特殊要求只需要修改MASTER_HOST 的地址即可。存储分区的配置选择一个独立的磁盘分区(分区必须大于1G)。

启动mfschunkserver 
[root@chunkserver-1 ~]# /usr/local/mfs/sbin/mfschunkserver
[root@chunkserver-1 ~]# netstat -an | grep 9420
tcp 0 0 192.168.108.161:15099 192.168.108.108:9420 ESTABLISHED

同时查看系统日志 
Oct 14 17:53:45 vm_web_1 mfschunkserver[1992]: connecting ...
Oct 14 17:53:45 vm_web_1 mfschunkserver[1992]: connected to Master
说明已经和master服务器成功连接

再查看master的日志查看 
Oct 14 17:59:00 experiment mfsmaster[10132]: server 1 (192.168.108.161): usedspace: 560484352 (0 GB), totalspace: 4226125824 (3 GB), usage: 13.26%
Oct 14 17:59:00 experiment mfsmaster[10132]: total: usedspace: 560484352 (0 GB), totalspace: 4226125824 (3 GB), usage: 13.26%
同样也说明有一台 chunkserver 与自己连接,并给出了使用空间和剩余磁盘空间

剩余的3台mfschunkserver利用同样的方法配置好后启动mfschunkserver程序,这时候再查看master系统日志: 
Oct 16 15:27:00 experiment mfsmaster[10132]: inodes: 9
Oct 16 15:27:00 experiment mfsmaster[10132]: dirnodes: 1
Oct 16 15:27:00 experiment mfsmaster[10132]: filenodes: 8
Oct 16 15:27:00 experiment mfsmaster[10132]: chunks: 18
Oct 16 15:27:00 experiment mfsmaster[10132]: chunks to delete: 0
Oct 16 15:27:00 experiment mfsmaster[10132]: chunkservers status:
Oct 16 15:27:00 experiment mfsmaster[10132]: server 1 (192.168.108.162): usedspace: 924282880 (0 GB), totalspace: 4226125824 (3 GB), usage: 21.87%
Oct 16 15:27:00 experiment mfsmaster[10132]: server 2 (192.168.108.164): usedspace: 924282880 (0 GB), totalspace: 4226125824 (3 GB), usage: 21.87%
Oct 16 15:27:00 experiment mfsmaster[10132]: server 3 (192.168.108.163): usedspace: 924282880 (0 GB), totalspace: 4226125824 (3 GB), usage: 21.87%
Oct 16 15:27:00 experiment mfsmaster[10132]: server 4 (192.168.108.161): usedspace: 924028928 (0 GB), totalspace: 4226125824 (3 GB), usage: 21.86%
Oct 16 15:27:00 experiment mfsmaster[10132]: total: usedspace: 3696877568 (3 GB), totalspace: 16904503296 (15 GB), usage: 21.87%
这里可以看到有4台chunkserver已经连接到了master

客户端挂载与工具使用

192.168.108.109

挂载MFS 
mfsmount 
[root@client ~]# mkdir /mnt/mfs
[root@client ~]# mfsmount -h 192.168.108.108

* mfsmount默认情况下将分区加载到/mnt/mfs目录下。如果想加载到其他目录请利用-w参数。
mfsmount --help
usage: /usr/local/mfs/bin/mfsmount [-r][-m][-c] [-v 0..2] [-h master host] [-p master port] [-l path] [-w mount point]

r: readonly mode
m: mount metadata
c: allow using cache
v: verbose level

defaults:
h: mfsmaster
p: 9421
l: /
w: /mnt/mfs
----------------------------------------------------------------
修改MFS文件删除延迟时间 
mfsrsettrashtime 
[root@client ~]# mfsrsettrashtime 100 /mnt/mfs/
/mnt/mfs/:
inodes with trashtime changed: 1 (1)
inodes with trashtime not changed: 0 (0)
inodes with permission denied: 0 (0)

查看MFS文件删除延迟时间 
mfsrgettrashtime 
# mfsrgettrashtime /mnt/mfs/
/mnt/mfs/:
directories with trashtime 100 : 1 (1)

----------------------------------------------------------------
mfssettrashtime 
[root@client ~]# mfssettrashtime 60 /mnt/mfs/
/mnt/mfs/: 60

mfsgettrashtime 
[root@client ~]# mfsgettrashtime /mnt/mfs/
/mnt/mfs/: 60
----------------------------------------------------------------
----------------------------------------------------------------
设置文件保存份数 
mfssetgoal 
[root@client ~]# mfssetgoal 4 /mnt/mfs/
/mnt/mfs/: 4

查看文件保存保存数 
mfsgetgoal 
[root@client ~]# mfsgetgoal /mnt/mfs/
/mnt/mfs/: 4
----------------------------------------------------------------
mfsrsetgoal 
[root@client ~]# mfsrsetgoal 3 /mnt/mfs/
/mnt/mfs/:
inodes with goal changed: 1 (1)
inodes with goal not changed: 0 (0)
inodes with permission denied: 0 (0)

mfsrgetgoal 
[root@client ~]# mfsrgetgoal /mnt/mfs/
/mnt/mfs/:
directories with goal 3 : 1 (1)

----------------------------------------------------------------

文件(文件夹)的查看(检查)命令 
先生成1个10M的文件
[root@client ~]# dd if=/dev/zero of=file bs=1M count=10
[root@client ~]# cp file /mnt/mfs

文件信息查看 
mfsfileinfo 
[root@client ~]# mfsfileinfo /mnt/mfs/file
/mnt/mfs/file:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 192.168.108.161:9422
copy 2: 192.168.108.162:9422
copy 3: 192.168.108.163:9422

文件检查 
mfscheckfile 
[root@client ~]# mfscheckfile /mnt/mfs/file
/mnt/mfs/file:
3 copies: 1 chunks

目录信息查看 
mfsdirinfo

[ root@ client ~] # rm /mnt/mfs/file 
[ root@ client ~] # mkdir /mnt/mfs/newdir 
[ root@ client ~] # cp file /mnt/mfs/newdir 
[ root@ client ~] # mfsdirinfo /mnt/mfs/newdir 
/ mnt/ mfs/ newdir/ :
inodes:                   2 ( 2 )        // inode个数,1 个目录,1 个文件
directories:             1 ( 1 )        // 1 个目录
files:                   1 ( 1 )        // 1 个文件
good files:             1 ( 1 )       // 正常文件个数
under goal files:       0 ( 0 ) 
missing files:          0 ( 0 ) 
chunks:                   1 ( 1 ) 
good chunks:             1 ( 1 ) 
under goal chunks:       0 ( 0 ) 
missing chunks:          0 ( 0 ) 
length:                 10M ( 10485760 
size
 :                   10M ( 10490880 )    // 这里是文件大小
hdd usage:              30M ( 31472640 )    // 由于我设置文件份数为3 ,因此这里为3 * 100M

[ root@ client ~] # cp /data/file newdir/file_2 
/ mnt/ mfs/ newdir/ :
inodes:                   3 ( 3 ) 
directories:             1 ( 1 ) 
files:                   2 ( 2 ) 
good files:             2 ( 2 ) 
under goal files:       0 ( 0 ) 
missing files:          0 ( 0 ) 
chunks:                   2 ( 2 ) 
good chunks:             2 ( 2 ) 
under goal chunks:       0 ( 0 ) 
missing chunks:          0 ( 0 ) 
length:                 20M ( 20971520 
size
 :                   20M ( 20981760 ) 
hdd usage:              60M ( 62945280 )

创建文件快照 
mfssnapshot

[ root@ client / mnt/ mfs/ newdir] # mfssnapshot mysnapshot file 
[ root@ client / mnt/ mfs/ newdir] # ll 
total 30720 
-rw-r--r-- 1 root root 10485760 Oct 16 16 :43 file 
-rw-r--r-- 1 root root 10485760 Oct 16 16 :44 file_2
-rw-r--r-- 1 root root 10485760 Oct 16 16 :58 mysnapshot

[ root@ monitor / mnt/ mfs/ newdir] # mfsfileinfo mysnapshot 
mysnapshot:
chunk 0 : 0000000000000003_00000001 / ( id :3 ver:1 ) 
copy 1 : 192.168.108.161:9422 
copy 2 : 192.168.108.162:9422 
copy 3 : 192.168.108.163:9422 
[ root@ monitor / mnt/ mfs/ newdir] # mfsfileinfo file 
file :
chunk 0 : 0000000000000003_00000001 / ( id :3 ver:1 ) 
copy 1 : 192.168.108.161:9422 
copy 2 : 192.168.108.162:9422 
copy 3 : 192.168.108.163:9422

通过mfsfileinfo命令可以查看创建出来的文件快照,它只占用了一个inode,并不占用磁盘空间,就像ln命令创建硬链接类似。但mfsdirinfo的显示似乎有些问题:

[ root@ monitor / mnt/ mfs/ newdir] # mfsdirinfo /mnt/mfs/newdir/ 
/ mnt/ mfs/ newdir/ :
inodes:                   4 ( 4 ) 
directories:             1 ( 1 ) 
files:                   3 ( 3 ) 
good files:             3 ( 3 ) 
under goal files:       0 ( 0 ) 
missing files:          0 ( 0 ) 
chunks:                   3 ( 3 ) 
good chunks:             3 ( 3 ) 
under goal chunks:       0 ( 0 ) 
missing chunks:          0 ( 0 ) 
length:                 30M ( 31457280 
size
 :                   30M ( 31472640 ) 
hdd usage:              90M ( 94417920 )

利用mfsdirinfo查看目录信息发现刚刚创建的快照文件也占用了与原文件相同大小的磁盘空间。但实际情况真的如此吗?

查看master的系统日志 
Oct 16 17:14:00 experiment mfsmaster[24445]: inodes: 5
Oct 16 17:14:00 experiment mfsmaster[24445]: dirnodes: 2
Oct 16 17:14:00 experiment mfsmaster[24445]: filenodes: 3
Oct 16 17:14:00 experiment mfsmaster[24445]: chunks: 2
Oct 16 17:14:00 experiment mfsmaster[24445]: chunks to delete: 0

通过日志的chunks: 2 可知有2个chunks 刚刚mfsfineinfo查看文件得知file文件占用1个chunks那么2个chunks 说明有2个文件。再往上看一行filenodes: 3 说明文件inode数为3 说明有3个文件,这正是2个文件+1个快照文件。

查看各个mfschunkserver的mfs文件

[root@192.168.108.161 data]# tree
|-- 0
|-- 1
|-- 2
|-- 3
| `--chunk_0000000000000003_00000001.mfs 
|-- 4
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- A
|-- B
|-- C
|-- D
|-- E
`-- F
16 directories, 1 file[root@192.168.108.161 data]# tree
|-- 0
|-- 1
|-- 2
|-- 3
| `--chunk_0000000000000003_00000001.mfs 
|-- 4
| `-- chunk_0000000000000004_00000001.mfs
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- A
|-- B
|-- C
|-- D
|-- E
`-- F
16 directories, 2 files[root@192.168.108.161 data]# tree
|-- 0
|-- 1
|-- 2
|-- 3
| `--chunk_0000000000000003_00000001.mfs 
|-- 4
| `-- chunk_0000000000000004_00000001.mfs
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- A
|-- B
|-- C
|-- D
|-- E
`-- F
16 directories, 2 files[root@192.168.108.161 data]# tree
|-- 0
|-- 1
|-- 2
|-- 3
|-- 4
| `-- chunk_0000000000000004_00000001.mfs
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- A
|-- B
|-- C
|-- D
|-- E
`-- F
16 directories, 1 file

通过查看master日志和查看各个数据存储服务器上的mfs文件,验证了我们刚才用mfsfileinfo的检查结果!“文件快照,它只占用了一个inode,并不占用磁盘空间,就像ln命令创建硬链接类似。 ”

MooseFS性能测试

有待测试

MooseFS破坏性测试

参见sery 博客文章:http://sery.blog.51cto.com/10037/147761

转自:http://salogs.com

原创粉丝点击