MFS 特性:

1. Free(GPL)

2. 通用文件系统,不需要修改上层应用就可以使用

3. 可以在线扩容,体系架构可伸缩性极强。

4. 部署简单。

5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或 写的性能,只会加速!)

6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类 似 oralce 的闪回等高级 dbms 的即时回滚特性!)

7. 提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文 件创建文件的快照)

8. google filesystem 的一个 c 实现。

9. 提供 web gui 监控接口。

10. 提高随机读或写的效率。

11. 提高海量小文件的读写效率。


可能的瓶颈:

1. master 本身的性能瓶颈。mfs 系统 master 存在单点故障如何解决?moosefs+drbd+heartbeat 来保证 master 单点问题?不过在使用过程中不可能完全不关机和间歇性的网络中断!

2. 体系架构存储文件总数的可遇见的上限。(mfs 把文件系统的结构缓存到 master 的内存中,文 件越多,master 的内存消耗越大,8g 对应 2500w 的文件数,2 亿文件就得 64GB 内存 )master 服务器 CPU 负载取决于操作的次数,内存的使用取决于文件和文件夹的个数。

 

MFS 文件系统结构:

包含 4 种角色:

管理服务器 managing server (master)

元数据日志服务器 Metalogger server(Metalogger)

数据存储服务器 data servers (chunkservers)

客户机挂载使用 client computers

各种角色作用:

1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷 贝。

2. 元数据日志服务器: 负责备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。

3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数 据传输。

4. 客户端: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文 件系统和本地 unix 文件系统使用一样的效果。

 

MFS 读写原理:

原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬 盘和网络的吞吐量越好,整个系统的性能也就会越好.


系统环境: rhel6 x86_64 iptables and selinux disabled

主机: 192.168.122.112 server12.example.com Master server

192.168.122.234 server34.example.com Master server

192.168.122.20 server20.example.com Chunk servers

192.168.122.205 server5.example.com Chunk servers

192.168.122.77 server77.example.com Client

所需的包: mfs-1.6.27.tar.gz

相关网址http://www.moosefs.org/


#安装配置Master server(主控服务器)

以下步骤在server12上实施:

[root@server12 ~]# yum install rpm-build -y

[root@server12 ~]# rpmbuild -tb mfs-1.6.27.tar.gz

此时会出现如下错误:

(1)error: Failed build dependencies:

fuse-devel is needed by mfs-1.6.27-2.x86_64

zlib-devel is needed by mfs-1.6.27-2.x86_64

(2)configure: error: no acceptable C compiler found in $PATH

(3)/var/tmp/rpm-tmp.zJWron: line 47: make: command not found


解决方法如下:

(1) [root@server12 ~]# yum install fuse-devel zlib-devel -y

(2) [root@server12 ~]# yum install gcc -y

(3) [root@server12 ~]# yum install make -y


[root@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/

[root@server12 x86_64]# rpm -ivh mfs-master-1.6.27-2.x86_64.rpm mfs-cgi-1.6.27-2.x86_64.rpm mfs-cgiserv-1.6.27-2.x86_64.rpm

[root@server12 x86_64]# cd /etc/mfs/

[root@server12 mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg

此文件中凡是用#注释掉的变量均使用其默认值,基本不需要就可以工作:

#WORKING_USER WORKING_GROUP:是运行 master server 的用户和组;

#SYSLOG_IDENT:master server syslog 中的标识;

#LOCK_MEMORY:是否执行 mlockall()以避免 mfsmaster 进程溢出(默认为 0);

#NICE_LEVE:运行的优先级(如果可以默认是 -19; 注意: 进程必须是用 root 启动);

#EXPORTS_FILENAME:被挂接目录及其权限控制文件的存放位置

#TOPOLOGY_FILENAME : 定义 MFS 网络拓扑结构的文件位置

#DATA_PATH:数据存放路径,此目录下大致有三类文件,changelog,sessions stats;

#BACK_LOGS:metadata 的改变 log 文件数目(默认是 50);

#BACK_META_KEEP_PREVIOUS:保存以前 mfs 元数据的文件数,默认值是 1;

#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/MATOCL_LISTEN_HOST:用于客户端挂接连接的 IP 地址(默认是*,

代表任何 IP);

# MATOCU_LISTEN_PORT/MATOCL_LISTEN_PORT:用于客户端挂接连接的端口地址(默认

9421);

#CHUNKS_LOOP_CPS:chunks 的回环每秒检查的块最大值,默认 100000;

# CHUNKS_LOOP_TIME :chunks 的回环频率(默认是:300 );

# CHUNKS_SOFT_DEL_LIMIT :一个 chunkserver 中可以删除 chunks 的最大数,软限 (默认:

10)

#CHUNKS_HARD_DEL_LIMIT:一个 chunkserver 中可以删除 chunks 的最大数,硬限 (默认:

25)

# REPLICATIONS_DELAY_DISCONNECT:chunkserver 断开后的复制延时(默认:3600 )

# CHUNKS_WRITE_REP_LIMIT:在一个循环里复制到一个 chunkserver 的最大 chunk 数目(

认是 2)

# CHUNKS_READ_REP_LIMIT :在一个循环里从一个 chunkserver 复制的最大 chunk 数目(

认是 10)

# REJECT_OLD_CLIENTS:弹出低于 1.6.0 的客户端挂接(0 1,默认是 0)

# deprecated:

# CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead

# LOCK_FILE - lock system has been changed, and this option is used only to search for old

lockfile


[root@server12 mfs]# cp mfsexports.cfg.dist mfsexports.cfg

该文件每一个条目分为三部分:

第一部分:客户端的 ip 地址

第二部分:被挂接的目录

第三部分:客户端拥有的权限


地址可以指定的几种表现形式:

* 所有的 ip 地址

A.B.C.D 单个 ip 地址

A.B.C.D/BITS IP 网络地址/位数掩码

A.B.C.D/E.F.G.H IP 网络地址/子网掩码

A.B.C.D-E.F.G.H IP 地址范围


目录部分需要注意两点:

/ 标识 MooseFS ;

. 表示 MFSMETA 文件系统


权限部分:

ro 只读模式共享

rw 读写方式共享

alldirs 许挂载任何指定的子目录

maproot 映射为 root,还是指定的用户

password 指定验证密码,客户端挂载时使用


[root@server12 mfs]# cp mfstopology.cfg.dist mfstopology.cfg

[root@server12 mfs]# chown nobody.nobody /var/lib/mfs/ -R

[root@server12 mfs]# cd /var/lib/mfs/

[root@server12 mfs]# cp -a metadata.mfs.empty metadata.mfs

[root@server12 mfs]# mfsmaster (注:关闭为mfsmaster stop)

working directory: /var/lib/mfs

lockfile created and locked

initializing mfsmaster modules ...

loading sessions ... file not found

if it is not fresh installation then you have to restart all active mounts !!!

exports file has been loaded

mfstopology: incomplete definition in line: 7

mfstopology: incomplete definition in line: 7

mfstopology: incomplete definition in line: 22

mfstopology: incomplete definition in line: 22

mfstopology: incomplete definition in line: 28

mfstopology: incomplete definition in line: 28

topology file has been loaded

loading metadata ...

create new empty filesystemmetadata file has been loaded

no charts data file - initializing empty charts

master <-> metaloggers module: listen on *:9419

master <-> chunkservers module: listen on *:9420

main master server module: listen on *:9421

mfsmaster daemon initialized properly

注:出现类似如上输出说明成功.


此时进入/var/lib/mfs 可以看到 moosefs 所产生的数据:

.mfsmaster.lock 文件记录正在运行的 mfsmaster 的主进程

metadata.mfs, metadata.mfs.back MooseFS 文件系统的元数据 metadata 的镜像

changelog.*.mfs MooseFS 文件系统元数据的改变日志(每一个小时合并到 metadata.mfs

中一次)


Metadata 文件的大小是取决于文件数的多少(而不是他们的大小)changelog 日志的大小是取决 于每小时操作的数目,但是这个时间长度(默认是按小时)是可配置的。

 

#启动CGI监控服务

[root@server12 mfs]# cd /usr/share/mfscgi/

[root@server12 mfscgi]# chmod +x *.cgi

[root@server12 mfscgi]# mfscgiserv

lockfile created and locked

starting simple cgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)


此时访问192.168.122.1129425看到如下页面说明配置成功

 

 

#安装配置Chunk servers(存储块服务器)

以下步骤在server12上实施:

[root@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/

[root@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.20:/root/

[root@server12 x86_64]# scp mfs-chunkserver-1.6.27-2.x86_64.rpm root@192.168.122.205:/root/


以下步骤在server20server5上实施:

[root@server20 ~]# rpm -ivh mfs-chunkserver-1.6.27-2.x86_64.rpm

[root@server20 ~]# cd /etc/mfs/

[root@server20 mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg

# WORKING_USER = nobody

# WORKING_GROUP =

# SYSLOG_IDENT = mfschunkserver

# LOCK_MEMORY = 0

# NICE_LEVEL = -19

# DATA_PATH = /var/lib/mfs

# MASTER_RECONNECTION_DELAY = 5:在失去连接之后延迟多少秒重新连接 master

# BIND_HOST = *:本地地址用于连接 mfsmaster(默认值是*,即默认的本地地址)

# MASTER_HOST = mfsmaster:master 服务器的主机名或是 ip 地址。

# MASTER_PORT = 9420

# MASTER_TIMEOUT = 60

# CSSERV_LISTEN_HOST = *:允许挂载的客户端连接的 IP 地址(*允许全部)

# CSSERV_LISTEN_PORT = 9422:允许挂载的客户端连接的端口

# HDD_CONF_FILENAME = /etc/mfshdd.cfg:分配给 MFS 使用的磁盘空间配置文件的位置

# HDD_TEST_FREQ = 10:块的测试期(单位为秒)

# deprecated, to be removed in MooseFS 1.7

# LOCK_FILE = /var/run/mfs/mfschunkserver.lock

# BACK_LOGS = 50

# CSSERV_TIMEOUT = 5


[root@server20 mfs]# cp mfshdd.cfg.dist mfshdd.cfg

[root@server20 mfs]# vim mfschunkserver.cfg

MASTER_HOST = 192.168.122.112 (此处填写MasterIP,或直接在/etc/hosts中写解析即可)

[root@server20 mfs]# vim mfshdd.cfg

/mnt/chunk1 #定义mfs共享点

[root@server20 mfs]# mkdir /var/lib/mfs

[root@server20 mfs]# mkdir /mnt/chunk1

[root@server20 mfs]# chown nobody.nobody /var/lib/mfs/ /mnt/chunk1/ -R

[root@server20 mfs]# mfschunkserver (注:关闭为mfschunkserver stop)

working directory: /var/lib/mfs

lockfile created and locked

initializing mfschunkserver modules ...

hdd space manager: path to scan: /mnt/chunk1/

hdd space manager: start background hdd scanning (searching for available chunks)

main server module: listen on *:9422

no charts data file - initializing empty charts

mfschunkserver daemon initialized properly

注:出现类似如上输出说明启动成功!


此时访问192.168.122.1129425并点击ServersDisks可以看到如下页面:

 

 

 

#安装配置Client(客户端)

以下步骤在server12上实施:

[root@server12 ~]# cd ~/rpmbuild/RPMS/x86_64/

[root@server12 x86_64]# scp mfs-client-1.6.27-2.x86_64.rpm root@192.168.122.77:/root/


以下步骤在server77上实施:

[root@server77 ~]# yum localinstall mfs-client-1.6.27-2.x86_64.rpm -y

[root@server77 ~]# cd /etc/mfs/

[root@server77 mfs]# cp mfsmount.cfg.dist mfsmount.cfg

[root@server77 mfs]# vim mfsmount.cfg #定义客户端默认挂载

/mnt/mfs

mfsmaster=192.168.122.112

[root@server77 mfs]# mkdir /mnt/mfs

[root@server77 mfs]# mfsmount

mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root

注:出现类似如上输出说明并且df -h可查看到类似如下内容则说明成功:

192.168.122.112:9421 6.4G 320K 6.4G 1% /mnt/mfs


此时访问192.168.122.1129425并点击Mounts可以看到如下页面:

 

测试:进入到/mnt/mfs,建立dir1dir2两个目录,执行mfssetgoal -r 2 dir2/,然后随意的往dir1dir2中写入数据(例如:创建文件),然后分别mfsfileinfo查看两个录入中的文件,会发现dir1中的文件只保存一份,而dir2中的文件保存了两份.


相关命令:

mfsgetgoal dir2/ #查看dir2中文件存储份数

mfssetgoal -r 2 dir2/ #设置在dir2 中文件存储份数为两个,默认是一个

对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已 经存在的文件及目录的 copy 份数.但使用-r 选项可以更改已经存在的 copy 份数.

mfsfileinfo passwd #查看文件信息


附:

1.当在写入的时候master server挂掉了,如何重新启动

以下步骤在server12上实施:

[root@server12 ~]# mfsmetarestore

[root@server12 ~]# mfsmaster


2.恢复误删文件

假设误删了dir2中的fstab文件

以下步骤在server77上实施:

[root@server77 mfs]# mfsgettrashtime dir1/

dir1/: 86400

文件删除后存放在“ 垃圾箱”中的时间称为隔离时间, 这个时间可以用 mfsgettrashtime 命令来查 看,mfssettrashtime 命令来设置,单位为秒,默认为 86400 秒。

[root@server77 mfs]# mkdir /mnt/mfsmeta

[root@server77 mfs]# mfsmount -m /mnt/mfsmeta/ -H 192.168.122.112

mfsmaster accepted connection with parameters: read-write,restricted_ip

注:此处用df -h查看不到是否已经挂载,可直接进入挂载点/mnt/mfsmeta/看是否有reservedtrash两个目录,有的话即挂载成功.

挂载 MFSMETA 文件系统,它包含目录 trash (包含仍然可以被还原的删除文件的信息)trash/undel (用于获取文件)

[root@server77 mfs]# cd /mnt/mfsmeta/trash/

[root@server77 trash]# mv 00000009\|dir2\|fstab undel/

将要恢复的文件直接移入undel中即可恢复误删的文件.


注:在 MFSMETA 的目录里,除了 trash trash/undel 两个目录,还有第三个目录reserved,该目 录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后, reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作


#Master server的热备

iscsi+corosync+pacemaker

此处省略对iscsi的配置

corosyncpacemaker的安装可以参照文档Rhel6-pacemaker+drbd.pdf


#配置iscsi

要将/var/lib/mfs/中的所有文件复制到通过iscsi分享出来的磁盘中,并注意所有文件的所属主和组均必须为nobody.


#配置corosync

以下步骤server12server34上实施:

[root@server12 ~]# vim /etc/corosync/corosync.conf

# Please read the corosync.conf.5 manual page

compatibility: whitetank


totem {

version: 2

secauth: off

threads: 0

interface {

ringnumber: 0

bindnetaddr: 192.168.122.0

mcastaddr: 226.94.1.1

mcastport: 5405

ttl: 1

}

}


logging {

fileline: off

to_stderr: yes

to_logfile: yes

to_syslog: yes

logfile: /var/log/cluster/corosync.log

debug: off

timestamp: on

logger_subsys {

subsys: AMF

debug: off

}

}


amf {

mode: disabled

}


service {

ver: 0

name: pacemaker

use_mgmtd: yes

}


#mfs启动脚本

[root@server12 ~]# vim /etc/init.d/mfsd

#!/bin/bash

#

# Init file for the MooseFS master service

#

# chkconfig: - 92 84

#

# description: MooseFS master

#

# processname: mfsmaster

# Source function library.

# Source networking configuration.

. /etc/init.d/functions

. /etc/sysconfig/network

# Source initialization configuration.

# Check that networking is up.

[ "${NETWORKING}" == "no" ] && exit 0

[ -x "/usr/sbin/mfsmaster" ] || exit 1

[ -r "/etc/mfs/mfsmaster.cfg" ] || exit 1

[ -r "/etc/mfs/mfsexports.cfg" ] || exit 1

RETVAL=0

prog="mfsmaster"

datadir="/var/lib/mfs"

mfsbin="/usr/sbin/mfsmaster"

mfsrestore="/usr/sbin/mfsmetarestore"

start () {

echo -n $"Starting $prog: "

$mfsbin start >/dev/null 2>&1

if [ $? -ne 0 ];then

$mfsrestore -a >/dev/null 2>&1 && $mfsbin start >/dev/null 2>&1

fi

RETVAL=$?

echo

return $RETVAL

}

stop () {

echo -n $"Stopping $prog: "

$mfsbin -s >/dev/null 2>&1 || killall -9 $prog #>/dev/null 2>&1

RETVAL=$?

echo

return $RETVAL

}

restart () {

stop

start

}

reload () {

echo -n $"reload $prog: "

$mfsbin reload >/dev/null 2>&1

RETVAL=$?

echo

return $RETVAL

}

restore () {

echo -n $"restore $prog: "

$mfsrestore -a >/dev/null 2>&1

RETVAL=$?

echo

return $RETVAL

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

restart

;;

reload)

reload

;;

restore)

restore

;;

status)

status $prog

RETVAL=$?

;;

*)

echo $"Usage: $0 {start|stop|restart|reload|restore|status}"

RETVAL=1

esac

exit $RETVAL


#配置pacemaker

以下步骤在server12server34上实施:

[root@server12 ~]# crm

crm(live)# configure

crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.122.2 cidr_netmask=32 op monitor interval=30s

crm(live)configure# property no-quorum-policy=ignore

crm(live)configure# primitive mfsdata ocf:heartbeat:Filesystem params device=/dev/sda1 directory=/var/lib/mfs fstype=ext4

crm(live)configure# primitive mfsmaster lsb:mfsd op monitor interval=1min

crm(live)configure# location masternode vip 10: server12.example.com

crm(live)configure# order mfsmaster-after-mfsdata inf: mfsdata mfsmaster

crm(live)configure# group mfs vip mfsdata mfsmaster

crm(live)configure# order mfsmaster-after-mfsdata inf: mfsdata mfsmaster

crm(live)configure# commit

crm(live)configure# quit


注:存储块服务器(Chunk server/etc/mfs/mfschunkserver.cfg中的MASTER_HOST选项和客户端(client/etc/mfs/mfsmount.cfg中的mfsmaster选项均指向虚拟IP地址,并重启存储块服务器(通过mfschunkserver stopmfschunkserver

posted on 2015-03-31 15:46  ↗℡.Koen↘  阅读(185)  评论(0编辑  收藏  举报