Rhel6-moosefs分布式存储配置文档

时间:2020-12-27 12:52:45

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

Rhel6-moosefs分布式存储配置文档

各种角色作用:

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

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

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

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

MFS 读写原理:

Rhel6-moosefs分布式存储配置文档

Rhel6-moosefs分布式存储配置文档

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

系统环境:
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)

看到如下页面说明配置成功

Rhel6-moosefs分布式存储配置文档

#安装配置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
(此处填写Master的IP,或直接在/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

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

并点击Servers和Disks可以看到如下页面:

Rhel6-moosefs分布式存储配置文档

#安装配置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

并点击Mounts可以看到如下页面:

Rhel6-moosefs分布式存储配置文档

测试:进入到/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/看是否有reserved和trash两个目录,有的话即挂载成功.

挂载
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
stop
mfschunkserver