mooseFS

mfs文件系统(一)

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

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

 单线程是个硬伤

Master的单线程机制不能够发挥多核CPU的优势,导致其性能有很大的瓶颈。在相同集群上测试过MooseFS和HDFS小文件的读写性能,其中MooseFS的写TPS只能达到100,读TPS只能达到1000,而HDFS的写TPS能达到1000以上,读TPS能达到10000以上,两者相差10倍。

可想而知,MooseFS单线程是一个硬伤,并不适合高并发的业务。

 

一个具体的实例
(一)、安装和配置元数据服务(master server)
1、下载源代码
http://ncu.dl.sourceforge.net/pr ... 1/mfs-1.6.11.tar.gz
2、tar zxvf mfs-1.6.11.tar.gz
3、创建用户 useradd mfs –s /sbin/nologin
4、./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs
5、make ; make install
6、配置
配置文件位于安装目录/usr/local/mfs/etc,需要的配置文件有两个:mfsmaster.cfg和 mfsexports.cfg,
mfsmaster.cfg是主配置文件,mfsexports.cfg是被挂接目录及权限设置。
(1)、mfsmaster.cfg的配置
[root@nas etc]# cp mfsmaster.cfg.dist mfsmaster.cfg
[root@nas etc]# vi mfsmaster.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmaster
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg
# DATA_PATH = /usr/local/mfs/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 :在一个loop设备中可以删除chunks的最大数 (默认:100)
#REPLICATIONS_DELAY_DISCONNECT chunkserver断开后的复制延时(默认:3600秒)
# 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@nas etc]# vi 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
#*                      /       rw,alldirs,maproot=0

192.168.3.98            /tt     rw,alldirs,maproot=0
192.168.3.139           /       rw,alldirs,maproot=0
192.168.3.138           /       rw,alldirs,maproot=0,password=111111

该文件每一个条目分为三部分:
第一部分:客户端的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/local/mfs/sbin/mfsmaster start ,可通过检查如下:
[root@nas etc]# ps -ef|grep mfs
mfs      12327     1  0 08:38 ?        00:00:00 /usr/local/mfs/sbin/mfsmaster start
8、停止master server
安全停止master server是非常必要的,最好不要用kill。利用mfsmaster –s来安全停止master serve,一旦是用了kill也是有解决方法的,后文有说明。
9、要经常性的查看系统日志(tail -f /var/log/messages)
(二)、安装和配置元数据日志服务器(metalogger)
1、下载源码
http://ncu.dl.sourceforge.net/pr ... 1/mfs-1.6.11.tar.gz
2、tar zxvf mfs-1.6.11.tar.gz
3、创建用户 useradd mfs –s /sbin/nologin
4、./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs
5、make ; make install
6、配置
该服务只有一个配置文件,那就是mfsmetalogger.cfg。
[root@mail etc]# vi 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
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.3.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地址。
7、启动metalogger服务
[root@mail sbin]# ./mfsmetalogger start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
这说明metalogger服务正常启动了。利用命令检查:
通过进程:
[root@mail sbin]# ps -ef |grep mfs
mfs      12254     1  0 15:25 ?        00:00:00 ./mfschunkserver start
通过检查端口:
[root@mail sbin]# lsof -i:9419
COMMAND     PID USER   FD   TYPE  DEVICE SIZE NODE NAME
mfsmetalo 12292  mfs    7u  IPv4 1395372       TCP mail.tt.com:52456->192.168.3.34:9419 (ESTABLISHED)
查看日志服务器的工作目录
[root@mail mfs]# pwd
/usr/local/mfs/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

这是运行18小时后:
[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 13 22:39 changelog_ml.11.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 21:39 changelog_ml.12.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 20:39 changelog_ml.13.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 19:39 changelog_ml.14.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 18:39 changelog_ml.15.mfs
-rw-r----- 1 mfs mfs   4692 Jan 13 17:39 changelog_ml.16.mfs
-rw-r----- 1 mfs mfs   4722 Jan 13 16:39 changelog_ml.17.mfs
-rw-r----- 1 mfs mfs    249 Jan 13 15:39 changelog_ml.18.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

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

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

(三)、安装配置数据存储服务器(chunkserver)
1、下载源代码
http://ncu.dl.sourceforge.net/pr ... 1/mfs-1.6.11.tar.gz
2、tar zxvf mfs-1.6.11.tar.gz
3、创建用户 useradd mfs –s /sbin/nologin
4、./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs
5、make ; make install
6、配置
配置文件位于安装目录/usr/local/mfs/etc,需要的配置文件有两个:mfschunkserver.cfg和 mfshdd.cfg,
mfschunkserver.cf是主配置文件,mfshdd.cfg是服务器用来分配给 MFS使用的空间,最好是一个单独的硬盘或者一个raid卷,最低要求是一个分区。
(1)、mfschunkserver.cfg的配置
[root@mail etc]# vi 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.3.34
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

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

(2)、mfshdd.cfg的配置

[root@mail etc]# more mfshdd.cfg
/data

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

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

(四)、MFS客户端的安装及配置
由于MFS客户端依赖于fuse,所以要先安装fuse。
1、        fuse的安装
(1)、解包 tar zxvf fuse-2.8.1.tar.gz
(2)、./configure
(3)、make;make install
如果所在的系统已经安装了fuse,则跳过这个步骤,高版本的Linux内核已经支持了。
2、        安装MFS客户端
(1)、下载源代码
http://ncu.dl.sourceforge.net/pr ... 1/mfs-1.6.11.tar.gz
(2)、tar zxvf mfs-1.6.11.tar.gz
(3)、创建用户 useradd mfs –s /sbin/nologin
(4)、./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –enable-mfsmount
       说明:在这个过程中,当执行到–enable-mfsmount时可能出现”checking for FUSE… no  configure: error: mfsmount build was forced, but fuse development package is not installed”这样的错误,

........
checking for FUSE... no
******************************** mfsmount disabled ********************************
* fuse library is too old or not installed - mfsmount needs version 2.6 or higher *
***********************************************************************************
......

而不能正确安装MFS客户端程序,这是因为环境变量没有设置,先编辑/etc/profile在此文件中加入如下条目:
export  PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
然后再利用source命令 /etc/profile使修改生效:source /etc/profile即可,也可直接在命令行中直接执行:
       export  PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
(5)、make ; make install
3、挂接MFS文件系统
(1)、创建挂接点 mkdir /mnt/mfs
(2)、加载fuse模块到内核:modprobe fuse
(3)、挂接MFS
/usr/local/mfs/bin/mfsmount  /mnt/mfs –H 192.168.3.34 –p
然后在输入密码就可以了
特别需要注意的是,所有的MFS都是挂接同一个元数据服务器master的IP,而不是其他数据存储服务器chunkserver的IP。
4、挂接MFSMETA文件系统
(1)、创建挂接点 mkdir /mnt/mfsmeta
(2)、挂接MFSMETA
/usr/local/mfs-old/bin/mfsmount -m /mnt/mfsmeta/  -H 192.168.3.34
(3)、查看目录内容
[root@www ~]# ls -R /mnt/mfsmeta
/mnt/mfsmeta:
reserved  trash

/mnt/mfsmeta/reserved:

/mnt/mfsmeta/trash:
0000015E|f181  undel

/mnt/mfsmeta/trash/undel:
5、查看挂载情况
通过df命令查看磁盘使用情况来检查是否被挂接成功
root@bzd mfs]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       73G   25G    45G      36%          /
/dev/sda1             99M   13M    82M      13%          /boot
none                  247M     0    247M     0%           /dev/shm
MFS                   45G   204M   45G      1%                   /mnt/mfs
MFSMETA              72K    72K     0        100%         /mnt/mfsmeta

利用mount命令查看:
[root@www ~]# mount
mfsmeta#192.168.3.34:9421 on /mnt/mfsmeta type fuse (rw,nosuid,nodev,allow_other,default_permissions)
mfs#192.168.3.34:9421 on /mnt/mfs type fuse (rw,nosuid,nodev,allow_other,default_permissions

(5)、卸载已挂接的文件系统
利用Linux系统的umount命令就可以了,例如:
[root@www ~]# umount /mnt/mfs

如果出现下列情况:
[root@www ~]# umount /mnt/mfs
umount: /mnt/mfs: device is busy
umount: /mnt/mfs: device is busy
则说明客户端本机有正在使用此文件系统,可以查明是什么命令正在使用,然后推出就可以了,最好不要强制退出。

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

 

mfs文件系统(二)
编译和安装

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)作为文件。
Linux:
creating:
dd if=/dev/zero of=file bs=100m seek=400 count=0
mkfs -t ext3 file
mounting:
mount -o loop file mount-point
FreeBSD:
creating and mounting:
dd if=/dev/zero of=file bs=100m count=400
mdconfig -a -t vnode -f file -u X
newfs -m0 -O2 /dev/mdX
mount /dev/mdX mount-point
mounting a previously created file system:
mdconfig -a -t vnode -f file -u X
mount /dev/mdX mount-point
Mac OS X:
Start "Disk Utility" from "/Applications/Utilities"
Select from menu "Images->New->Blank Image ..."
注: 每一个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的目录。  

 

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
mfsmaster:9421         85T   80T  4.9T  95% /mnt/mfs
mfsmaster:9321        394G  244G  151G  62% /mnt/mfs-test
重要的是每一个文件可以被储存多个副本,在这种情况下,每一个文件所占用的空间要比其文件本身大多了。此外,被删除且在有效期内(trashtime)的文件都放在一个“垃圾箱”,所以他们也占用的空间,其大小也依赖文件的份数。就像其他Unix的文件系统一样,以防删除一个被其它进程打开文件,数据将被一直存储,至少直到文件被关闭。
二、MooseFS的特定的操作
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
用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
实际的拷贝份数可以通过mfscheckfile 和 mfsfileinfo 命令来证实,例如:
$ 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
注意:一个不包含数据的零长度的文件,尽管没有设置为非零的目标(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.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.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.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
副本将任然存在。
假如改变一个已经存在的文件的拷贝个数,那么文件的拷贝份数将会被扩大或者被删除,这个过程会有延时。可以通过上面的命令来证实。
对一个目录设定“目标”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已经存在的文件及目录的拷贝份数。例如:
[root@bzd f]# touch 1
[root@bzd f]# echo “11” > 1
[root@bzd f]# /usr/local/mfs/bin/mfsfileinfo 1  
1:
        chunk 0: 0000000000000043_00000001 / (id:67 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
[root@bzd f]# cd ..
[root@bzd mfs]# /usr/local/mfs/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/local/mfs/bin/mfsfileinfo 1
1:
        chunk 0: 0000000000000043_00000001 / (id:67 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
[root@bzd f]# /usr/local/mfs/bin/mfsfileinfo 2
2:
        chunk 0: 0000000000000044_00000001 / (id:68 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422

整个目录树的内容摘要可以用一个功能增强的等同于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 –磁盘空间的使用包括所有的拷贝

这是一个文件被分成了6个chunk例子:
[root@bzd mfs]# /usr/local/mfs/bin/mfsfileinfo fdsf.iso
1.img:
        chunk 0: 000000000000053A_00000001 / (id:1338 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
        chunk 1: 000000000000053B_00000001 / (id:1339 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
        chunk 2: 000000000000053C_00000001 / (id:1340 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
        chunk 3: 000000000000053D_00000001 / (id:1341 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
        chunk 4: 000000000000053E_00000001 / (id:1342 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422
        chunk 5: 000000000000053F_00000001 / (id:1343 ver:1)
                copy 1: 192.168.3.31:9422
                copy 2: 192.168.3.96:9422
                copy 3: 192.168.3.139:9422

三、垃圾箱(trash bin)设定隔离的时间(quarantine time)
一个删除文件能够存放在一个“垃圾箱”的时间就是一个隔离时间,这个时间可以用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
这些工具也有个递归选项-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
时间的单位是秒(有用的值有: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
被删文件的文件名在 “垃圾箱”目录里还可见,文件名由一个八位十六进制的数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目录中的一样,但是不能有其他功能的操作。
四、快照
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 or或者是mfsgettrashtime/mfssettrashtime,详细可见命令手册。

 

mfs文件系统(四)

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

 

MFS读写性能(简单测试结果):

写:time dd if=/dev/zero of=/usr/mfstest/test2/zhhtest500M  bs=1024k count=500

读:time dd if=/usr/mfstest/test2/zhhtest500M  of=/dev/null

 

 

1copy

2copy

1copy

2copy

1M

0m0.042s

0m0.042s

0m0.017s

0m0.017s

2M

0m0.056s

0m0.066s

0m0.030s

0m0.055s

5M

0m0.073s

0m0.079s

0m0.070s

0m0.071s

10M

0m0.119s

0m0.131s

0m0.136s

0m0.197s

20M

0m0.250s

0m0.288s

0m0.291s

0m0.376s

50M

0m0.514s

0m0.589s

 0m0.896s

0m0.886s

100M

0m0.977s

0m7.497s

0m1.677s

0m1.787s

200M

0m7.910s

0m22.270s

 0m2.683s

0m3.129s

500M

0m22.465s

0m51.735s

0m6.559s

0m6.990s

1G

0m52.346s

1m48.056s

0m17.319s

0m17.154s

2G

1m46.224s

3m46.283s

0m41.608s

0m34.435s

5G

4m41.956s

9m34.798s

2m9.200s

1m56.183s

10G

9m29.037s

19m26.237s

3m55.222s

3m24.914s

100G

95m53.500s

195m7.173s

32m4.295s

41m26.995s

 

总结规律:

1、读速度:ca 71M/s   写速度:ca 22M/s  9M/s   (以500M计算)

2goal的设置和读写速度的关系?貌似没有关系。

 

稳定

整个mfs体系中,直接断电只有master有可能无法启动。

使用mfsmetarestore -a修复才能启动,如果无法修复,使用metalogger上的备份日志进行恢复。(几次测试发现:如果mfsmetarestore -a无法修复,则使用metalogger也无法修复)。

强制使用metadata.mfs.back创建metadata.mfs,可以启动master,但丢失的数据暂无法确定(此问题已经请教MFS开发小组)。

直接断电测试过程,使用mfsmetarestore –a无法修复,使用metalogger也无法修复的情况较少发生。5次只有一次无法修复。

 

引用:http://bbs.chinaunix.net/thread-1643863-1-1.html

此条目发表在linux分类目录,贴了标签。将固定链接加入收藏夹。