正在浏览标签为 分布式文件系统 的文章

系统:CentOS 5.4
IP分配:
HA1 eth0:192.168.0.66 eth1:192.168.10.1
HA2 eth0:192.168.0.69 eth1:192.168.10.2
VIP 192.168.0.120

DRBD(Distributed Replicated Block Device),DRBD 号称是 “网络 RAID”,开源软件,由LINBIT 公司开发。DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

一、安装DRBD

在HA1和HA2上安装DRBD。

wget http://oss.linbit.com/drbd/8.3/drbd-8.3.5.tar.gz

[root@HA1 ~]# tar xzvf drbd-8.3.5.tar.gz

[root@HA1 ~]# cd drbd-8.3.5

[root@HA1 drbd-8.3.5]# make clean all

[root@HA1 drbd-8.3.5]# make install

[root@HA1 drbd-8.3.5]# cd

[root@HA1 ~]# vi /etc/drbd.conf
global {
usage-count yes; # 是否参加使用者统计,yes为参加
}
common {
syncer { rate 100M; } # 设置网络同步速率,建议改为实际网络速率
}

# 一个DRBD设备(即:/dev/drbdX),叫做一个"资源"。
resource "r0" {
protocol C; # 数据同步协议,C表示收到远程主机的写入确认后才认为写入完成
startup {
}
disk {
on-io-error detach;
}
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # 自动修复脑裂问题
}
net {
# 设置主备机之间通信使用的信息算法.
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
# 自动修复脑裂问题
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
syncer {
}
# 每个主机的说明以"on"开头,后面是主机名
on HA1 {
device /dev/drbd0;
disk /dev/sdb;
# 设置DRBD的监听端口,用于与另一台主机通信
address 192.168.0.66:7789;
# metadata的存放位置
# internal表示将metadata存放到drbd挂在的磁盘分区的最后的位置上
meta-disk internal;
}

on HA2 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.0.69:7789;
meta-disk internal;
}
}
DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了

a,DRBD设备的大小

b,产生的标识

c,活动日志

d,快速同步的位图

metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的

内部metadata:内部metadata存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。

外部metadata:外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要人为的干预操作来进行现有node对心硬盘的同步了

[root@HA1 ~]# scp /etc/drbd.conf HA2:/etc/

初始化并启动两个系统上的 DRBD 服务:

[root@HA1 ~]# drbdadm create-md r0
[root@HA1 ~]# service drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

将 HA1 配置为主节点:
[root@HA1 ~]# drbdadm --overwrite-data-of-peer primary r0

两个设备开始同步数据:
[root@HA2 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.5 (api:88/proto:86-91)
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29
m:res cs ro ds p mounted fstype
… sync’ed: 0.6% (6108/6140)M
0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C
………
[root@HA2 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.5 (api:88/proto:86-91)

GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29
m:res cs ro ds p mounted fstype
… sync’ed: 45.6% (3344/6140)M
0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C
………

同步数据完成:

[root@HA2 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.5 (api:88/proto:86-91)
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29
m:res cs ro ds p mounted fstype
… sync’ed:100.0% (4/6140)M
0:r0 SyncTarget Secondary/Primary Inconsistent/UpToDate C

[root@HA2 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.5 (api:88/proto:86-91)
GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29

m:res cs ro ds p mounted fstype

0:r0 Connected Secondary/Primary UpToDate/UpToDate C

[root@HA1 ~]# cat /proc/drbd

version: 8.3.5 (api:88/proto:86-91)

GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA1, 2009-11-13 01:53:51

0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-

ns:6291228 nr:0 dw:0 dr:6291228 al:0 bm:384 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

两个节点上的块设备都完全同步之后,使用诸如ext3的文件系统格式化主节点上的 DRBD 设备。

[root@HA1 ~]# mkfs.ext3 /dev/drbd0

测试DRBD服务:

手动挂载DRBD设备,并测试写入文件。

[root@HA1 ~]# mount -o rw /dev/drbd0 /data/

[root@HA1 ~]# echo “This is a test line.” > /data/test.txt

卸载DRBD设备并将HA1设置为从设备。

[root@HA1 ~]# umount /data/

[root@HA1 ~]# drbdadm secondary r0

将HA2设置为主设备。

[root@HA2 ~]# drbdadm primary r0

[root@HA2 ~]# service drbd status

drbd driver loaded OK; device status:

version: 8.3.5 (api:88/proto:86-91)

GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29

m:res cs ro ds p mounted fstype

0:r0 Connected Primary/Secondary UpToDate/UpToDate C

挂载DRBD设备并验证能够读出在HA1上写入的文件。

[root@HA2 ~]# mount -o rw /dev/drbd0 /data/

[root@HA2 ~]# cat /data/test.txt

This is a test line.

卸载DRBD设备并将HA2设置为从设备。

[root@HA2 ~]# umount /data/

[root@HA2 ~]# drbdadm secondary r0

将HA1设置为主设备。

[root@HA1 ~]# drbdadm primary r0

查看HA2的DRDB状态:

[root@HA2 ~]# service drbd status

drbd driver loaded OK; device status:

version: 8.3.5 (api:88/proto:86-91)

GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@HA2, 2009-11-13 01:58:29

m:res cs ro ds p mounted fstype

0:r0 Connected Secondary/Primary UpToDate/UpToDate C

在HA1和HA2上配置hosts

[root@HA1 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 vpc localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.10.1 HA1
192.168.10.2 HA2
在HA1和HA2上配置时间同步:

[root@HA1 ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp.api.bz
二、在HA1和HA2安装MySQL和Nginx并将数据迁移到/data目录

[root@HA1 ~]# yum install -y mysql-server

[root@HA1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
bind-address=192.168.0.120
[root@HA1 ~]# cp -r /var/lib/mysql/ /data/

[root@HA1 ~]# cd /data/

[root@HA1 data]# chown -R mysql.mysql mysql/

[root@HA1 data]# service mysqld start

Starting MySQL: [ OK ]

[root@HA1 data]# service mysqld stop

Stopping MySQL: [ OK ]

注意:数据迁移只需在HA1上做。

安装Nginx略,具体见Nginx 0.7.x + PHP 5.2.8(FastCGI)搭建胜过Apache十倍的Web服务器(http://blog.s135.com/post/366/)

[root@HA1 ~]# chkconfig --level 2345 mysqld off

[root@HA2 ~]# chkconfig --level 2345 mysqld off

注意:不要在外部启动HA使用的资源,一切让HA去控制。

编写nginx lsb资源代理脚本(注意nginx安装路径):

[root@HA1 ~]# cat /etc/init.d/nginxd
#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

RETVAL=0
prog="nginx"

nginxDir=/usr/local/nginx
nginxd=$nginxDir/sbin/nginx
nginxConf=$nginxDir/conf/nginx.conf
nginxPid=$nginxDir/nginx.pid

nginx_check()
{
if [[ -e $nginxPid ]]; then
ps aux |grep -v grep |grep -q nginx
if (( $? == 0 )); then
echo "$prog already running..."
exit 1
else
rm -rf $nginxPid &> /dev/null
fi
fi
}

start()
{
nginx_check
if (( $? != 0 )); then
true
else
echo -n $"Starting $prog:"
daemon $nginxd -c $nginxConf
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
fi
}

stop()
{
echo -n $"Stopping $prog:"
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginxPid
}

reload()
{
echo -n $"Reloading $prog:"
killproc $nginxd -HUP
RETVAL=$?
echo
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
RETVAL=1
esac
exit $RETVAL
[root@HA1 ~]# chmod +x /etc/init.d/nginxd

[root@HA1 ~]# scp /etc/init.d/nginxd HA2: /etc/init.d/nginxd

三、安装配置corosync和pacemaker

corosync是基于OpenAIS构建的集群引擎,可替代heartbeat进行心跳检测。

The Corosync Cluster Engine is an open source project Licensed under the BSD License derived from the OpenAIS project. OpenAIS uses a UDP multicast based communication protocol to periodically check for node availability.

[root@HA1 ~]# wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo

[root@HA1 ~]# wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/libesmtp-1.0.4-6.el5.kb.i386.rpm

[root@HA1 ~]# rpm -ivh libesmtp-1.0.4-6.el5.kb.i386.rpm

[root@HA1 ~]# yum install -y pacemaker corosync

[root@HA1 ~]# corosync-keygen

Corosync Cluster Engine Authentication key generator.

Gathering 1024 bits for key from /dev/random.

Press keys on your keyboard to generate entropy.

Writing corosync key to /etc/corosync/authkey.

[root@HA1 ~]# scp /etc/corosync/authkey HA2:/etc/corosync/

[root@HA1 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

[root@HA1 ~]# vi !$
# Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.10.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}

logging {
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /var/log/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

service {
# Load the Pacemaker Cluster Resource Manager
ver: 0
name: pacemaker
use_mgmtd: yes
}
[root@HA1 ~]# scp /etc/corosync/corosync.conf HA2:/etc/corosync/corosync.conf

[root@HA1 ~]# service corosync start

Starting Corosync Cluster Engine (corosync): [ OK ]

[root@HA1 ~]# chkconfig --level 2345 corosync on

在HA2上执行:

[root@HA2 ~]# chown root:root /etc/corosync/authkey

[root@HA2 ~]# chmod 400 /etc/corosync/authkey

[root@HA2 ~]# service corosync start

Starting Corosync Cluster Engine (corosync): [ OK ]

[root@HA2 ~]# chkconfig --level 2345 corosync on

四、配置CRM资源
[root@HA1 ~]# crm
crm(live)# configure
crm(live)configure# node HA1
crm(live)configure# node HA2
# 配置drbd原始资源
crm(live)configure# primitive drbd ocf:linbit:drbd \
params drbd_resource="r0" \
meta migration-threshold="10"
# 配置drbd资源监控
crm(live)configure# monitor drbd 30s:20s
# 配置文件系统原始资源
crm(live)configure# primitive fs ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/data" fstype="ext3"
# 配置mysql原始资源,使用lsb代理
crm(live)configure# primitive mysqld lsb:mysqld
# 配置nginx原始资源,使用lsb代理
crm(live)configure# primitive nginxd lsb:nginxd
# 配置共享IP原始资源
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 \
params ip="192.168.0.120" nic="eth0:0"
# 创建资源组保障资源在某一节点上按顺序启动和停止
crm(live)configure# group mysql-group fs vip mysqld nginxd
# 配置drbd主资源约束
crm(live)configure# ms ms-drbd-mysql drbd \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
# 配置资源位置约束,保证mysql-group资源组启动在drbd主资源上
crm(live)configure# colocation mysql-on-drbd inf: mysql-group ms-drbd-mysql:Master
# 配置资源启动顺序约束,保证drbd启动后启动mysql-group资源组
crm(live)configure# order mysql-after-drbd inf: ms-drbd-mysql:promote mysql-group:start
crm(live)configure# property $id="cib-bootstrap-options" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
start-failure-is-fatal="false"
crm(live)configure# commit
crm(live)configure# end
crm(live)#
五、测试

[root@HA1 ~]# crm status

============

Last updated: Fri Nov 20 22:47:51 2009

Stack: openais

Current DC: HA2 -- partition with quorum

Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06

2 Nodes configured, 2 expected votes

2 Resources configured.

============

Online: [ HA1 HA2 ]

Master/Slave Set: ms-drbd-mysql

Masters: [ HA1 ]

Slaves: [ HA2 ]

Resource Group: mysql-group

fs (ocf::heartbeat:Filesystem): Started HA1

vip (ocf::heartbeat:IPaddr2): Started HA1

mysqld (lsb:mysqld): Started HA1

nginxd (lsb:nginxd): Started HA1

关闭HA1,在HA2上查看HA状态:

[root@HA2 ~]# crm_mon -i1

============

Last updated: Sat Nov 21 01:31:13 2009

Stack: openais

Current DC: HA2 - partition WITHOUT quorum

Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06

2 Nodes configured, 2 expected votes

2 Resources configured.

============

Online: [ HA2 ]

OFFLINE: [ HA1 ]

Master/Slave Set: ms-drbd-mysql

Masters: [ HA2 ]

Stopped: [ drbd:1 ]

Resource Group: mysql-group

fs (ocf::heartbeat:Filesystem): Started HA2

vip (ocf::heartbeat:IPaddr2): Started HA2

mysqld (lsb:mysqld): Started HA2

nginxd (lsb:nginxd): Started HA2

启动HA1,资源自动迁移到HA1:

[root@HA1 ~]# crm_mon -i1

============
Last updated: Mon Nov 23 15:42:52 2009
Stack: openais
Current DC: HA2 - partition with quorum
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06
2 Nodes configured, 2 expected votes
2 Resources configured.

============
Online: [ HA1 HA2 ]
Master/Slave Set: ms-drbd-mysql
Masters: [ HA1 ]
Slaves: [ HA2 ]
Resource Group: mysql-group
fs (ocf::heartbeat:Filesystem): Started HA1
vip (ocf::heartbeat:IPaddr2): Started HA1
mysqld (lsb:mysqld): Started HA1
nginxd (lsb:nginxd): Started HA1

手动迁移资源到HA2
[root@HA1 ~]# crm resource migrate mysql-group HA2
[root@HA2 ~]# crm_mon -i1

============
Last updated: Mon Nov 23 15:43:42 2009
Stack: openais
Current DC: HA2 - partition with quorum
Version: 1.0.6-f709c638237cdff7556cb6ab615f32826c0f8c06
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ HA1 HA2 ]
Master/Slave Set: ms-drbd-mysql
Masters: [ HA2 ]
Slaves: [ HA1 ]
Resource Group: mysql-group
fs (ocf::heartbeat:Filesystem): Started HA2
vip (ocf::heartbeat:IPaddr2): Started HA2
mysqld (lsb:mysqld): Started HA2
nginxd (lsb:nginxd): Started HA2

六、解决脑裂(split brain)问题:

在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

对付HA系统“裂脑”的对策大概有以下几条:
1)添加冗余的心跳线,例如双线跳线。尽量减少“裂脑”发生机会。
2)启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
3)设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下 参考IP,不通则表明断点就出在本端,不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

手动解决DRBD脑裂问题:

[root@HA2 ~]# drbdadm down all
[root@HA2 ~]# drbdadm create-md all

六、参考

Integrating DRBD with Pacemaker clusters

DRBD MySQL HowTo

Split brain notification and automatic recovery

Manual split brain recovery

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 备注
Master Centos 5.3 64bit 192.168.108.108 利用xen虚拟了5台服务器
chunkserver 1 Centos 5.3 64bit 192.168.108.161 vm
chunkserver 2 Centos 5.3 64bit 192.168.108.162 vm
chunkserver 3 Centos 5.3 64bit 192.168.108.163 vm
chunkserver 4 Centos 5.3 64bit 192.168.108.164 vm
client Centos 5.3 64bit 192.168.108.109 vm

拓扑图

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

服务器名

系统

IP

备注

Master

Centos 5.3 64bit

192.168.108.108

利用xen虚拟了5台服务器

chunkserver 1

Centos 5.3 64bit

192.168.108.161

vm

chunkserver 2

Centos 5.3 64bit

192.168.108.162

vm

chunkserver 3

Centos 5.3 64bit

192.168.108.163

vm

chunkserver 4

Centos 5.3 64bit

192.168.108.164

vm

client

Centos 5.3 64bit

192.168.108.109

vm

原创文章,转载请注明: 转自 http://salogs.com