构建高可用MFS分布式文件存储架构

By: opsren
2012.6.12
   现在有大量的企业采用共享存储服务器NFS的方式,来对应用数据进行网络存储,但这存在性能瓶颈和单点故障的问题,于是分布式文件存储管理系统开始流行起来。其优点是不言而喻的,本文为大家推荐了开源的分布式文件系统MFS,与NFS相比它是一种多对多的关系,这样一来,性能大幅提升,同时可靠性也高了许多!相信对大家有所帮助。
大家都知道,目前MFS元数据服务器存在单点问题,因此我们可以通过DRBD提供磁盘及时同步,通过HeartBeat提供Failover,来达到高可用。
相信DRBD大家都有了解过,DRBD(Distributed Replicated Block Device)是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中. 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
DRBD的工作原理如下图:
                    +----------+
                    | 文件系统 |
                    +----------+
                         |
                         V
                   +-------------+
                   |  块设备层   |
                   | (/dev/drbd1)|
                   +-------------+
                      |      |
                      |      |
                      V      V
             +------------+  +-------------+
             |  本地硬盘  |  | 远程主机硬盘|
             | (/dev/sdb) |  | (/dev/sdb)  |
             +------------+  +-------------+
至于MFS更多的知识可以差看相关资料!这里不再多说!这里只是说明下MFS文件系统的组成!
MFS文件系统的组成:
1、元数据服务器。在整个体系中负责管理管理文件系统,目前MFS只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后MFS能支持多个master服务器,进一步提高系统的可靠性。
2、数据存储服务器chunkserver。真正存储用户数据的服务器,存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间复制(复制份数可以手工指定,建议设置副本数为3)。数据服务器可以是多个,并且数量越多,可使用的"磁盘空间"越小,可靠性也越高。
3、元数据日志服务器metalogger。 负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作,在1.6版中新增加的功能。
4、客户端。使用MFS文件系统来存储和访问的主机称为MFS的客户端,成功挂载MFS文件系统以后,就可以像以前使用NFS一样共享这个虚拟性的存储了。
整个系统架构图如下: 095919814.jpg
通过这个图我们也可以看出整个架构的环境:
当前系统:Centos5.8 x86_64
mfs-master(主机)
eth0:192.168.8.200(对外)
eth1:192.168.125.200(对内,HA专用)
DRBD镜像分区:/dev/sdb
mfs-bak(备机)
eth0:192.168.8.201(对外)/
192.168.125.201(对内,HA专用)
DRBD镜像分区:/dev/sdb
虚拟浮动VIP:192.168.8.210
前期准备工作:
1. 在主服务器的/etc/hosts文件中加入如下内容:
192.168.8.200 mfs-master ha01
192.168.125.200 ha01
192.168.125.201 ha02
192.168.8.201 mfs-bak     ha02
2. 更新系统组件和依赖包
[root@mfs-master ~]# yum -y install gcc gcc-c++ bison patch unzip mlocate flex scanner generator automake autoconf kernel-headers kernel-devel
3.元数据服务器建立一块用于挂载drbd设备的硬盘(先不要格式化操作)
一.元数据服务器上的安装与配置
1.drbd的安装与配置
1.)DRBD安装(这里选择yum来安装,也可以下载源码编译安装)
[root@mfs-master ~]# yum -y install kmod-drbd83 drbd83
[root@mfs-master ~]# modprobe drbd
[root@mfs-master ~]# lsmod |grep -i drbd
drbd                  300440  2
如果没有提示,则系统找不到相应的模块执行下面的命令找到drbd.ko:
[root@mfs-master ~]# modprobe -l | grep -i drbd
/lib/modules/2.6.18-308.4.1.el5/extra/drbd83/drbd.ko
2.)DRBD配置
修改配置文件:
[root@mfs-master ~]# mv /etc/drbd.conf /etc/drbd.conf.bak
[root@mfs-master ~]# cat /etc/drbd.conf
 
  
  1. global { usage-count yes; }

  2. common { syncer { rate 50M; } }

  3. resource r0 {

  4. protocol C;  

  5. net {

  6.        cram-hmac-alg sha1;

  7.        shared-secret "secret string";

  8.    }

  9.   onmfs-master {

  10.        device    /dev/drbd1;

  11.        disk      /dev/sdb;

  12.        address   192.168.8.200:7898;

  13.        meta-disk  internal;

  14.        }

  15.   on mfs-bak {

  16.        device    /dev/drbd1;

  17.        disk      /dev/sdb;

  18.        address   192.168.8.201:7898;

  19.        meta-disk  internal;

  20.        }

  21. }

3.)创建一个ro 资源
[root@mfs-master ~]# drbdadm create-md r0
4.)启动DRBD
[root@mfs-master ~]# /etc/init.d/drbd start
[root@mfs-master ~]# service drbd start
[root@mfs-master ~]# cat /proc/drbd
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:2007644 nr:0 dw:0 dr:2007644 al:0 bm:123 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
对输出的含义解释如下:
ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,
ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。
Ns表示网络发送的数据包信息。
Dw是磁盘写信息
Dr是磁盘读信息
PS:以上步骤主备一样!!!!!!!!!!
+++++++++++++++++++++++++++++++++++++++++++++++++++
在mfs-master服务器上操作:
5.)设置主备节点
由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:
[root@mfs-master ~]# drbdsetup /dev/drbd1 primary -o
或者
[root@mfs-master ~]# drbdadm -- --overwrite-data-of-peer primary all
接下来再执行如下命令
[root@mfs-master ~]# drbdadm primary r0
要是有多个资源的话可以执行以下命令:
[root@mfs-master ~]# drbdadm primary all
执行此命令后,开始同步两台机器对应磁盘的数据!
[root@mfs-master ~]# cat /proc/drbd
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:576224 nr:0 dw:0 dr:581760 al:0 bm:34 lo:84 pe:369 ua:256 ap:0 ep:1 wo:b oos:1443196
[====>...............] sync'ed: 28.4% (1443196/2007644)K delay_probe: 69
finish: 0:03:56 speed: 6,024 (5,876) K/sec
从输出可知:“ro状态现在变为“Primary/Secondary”,“ds”状态也变为“UpToDate/Inconsistent”,也就是“实时/不一致”状态,现在数据正在主备两个主机的磁盘间进行同步,且同步进度为28.4%,同步速度每秒5.8M左右。
只有出现了Primary/Secondary表示主从机器已经识别到对方了,drbd启动正常。
等待片刻,再次查看同步状态,输出如下:
[root@mfs-master ~]#cat /proc/drbd
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:2007644 nr:0 dw:0 dr:2007644 al:0 bm:123 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
我们再到备份服务器上查看下:
[root@ mfs-bak ~]#cat /proc/drbd
1: cs:WFConnection ro:Secondary/Primary ds:UpToDate/UpToDate C r----
   ns:0 nr:4 dw:4 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
可以看到同步完成了,并且“ds“状态也变为“UpToDate/UpToDate”了。即为“实时/实时”状态了。
6.)格式化并挂载文件系统
mount操作只能在主节点进行
[root@mfs-master ~]# mkfs.ext3 /dev/drbd1
[root@mfs-master ~]# mount /dev/drbd1 /usr/local/mfs
[root@mfs-master ~]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /data type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/drbd1 on /data type ext3 (rw)
PS:这里最好挂载到mfs的安装目录(后面主备服务器的MFS安装目录与这里的挂载目录相同!)
7.)正常切换
在主节点卸载磁盘分区,然后执行
[root@mfs-master ~]# drbdadm secondary all
如果不执行这个命令,直接在备用节点执行切换到主节点的命令,会报错:
2: State change failed: (-1) Multiple primaries not allowed by config
Command 'drbdsetup 2 primary' terminated with exit code 11
接着,在备用节点执行
[root@mfs-bak ~]# drbdadm primary all
最后在备用节点挂载磁盘分区即可:
[root@mfs-bak ~]# mount /dev/drbd1  /mnt/mfs
2. HeartBeat安装与配置(同时在主备上操作)
1.) 安装heartbeat
[root@mfs-master ~]# yum -y install libnet        
[root@mfs-master ~]# yum -y install heartbeat-devel        
[root@mfs-master ~]# yum -y install heartbeat-ldirectord        
[root@mfs-master ~]# yum -y install heartbeat
2.)创建ha.cf
[root@mfs-master ~]# cat /etc/ha.d/ha.cf
 
  
  1. logfile /var/log/ha.log

  2. debugfile /var/log/ha-debug                    

  3. bcast eth1                    

  4. keepalive 2                  

  5. warntime 10                    

  6. deadtime 30            

  7. initdead 120                    

  8. hopfudge 1                    

  9. udpport 694                    

  10. auto_failback on                

  11. node mfs-master                  

  12. node mfs-bak

3.)配置心跳的加密方式:authkeys
[root@mfs-master ~]# cat >> /etc/ha.d/authkeys << EOF
auth 1
1 crc
EOF
再将authkeys  权限给为600
[root@mfs-master ~]chmod 600 /etc/ha.d/authkeys
4.)配置haresources
[root@mfs-master ~]# cat >> /etc/ha.d/haresources << EOF
mfs-master  Initdrbd  mfsmaster 192.168.8.210
EOF
这个文件中各字段的功能说明:
第一个字段:是主机名,是uname -a得到的
第二个字段:作用是执行当前的脚本命令此脚本可以定义在/etc/init.d/或/etc/ha.d/resource.d,此处我定义了一个名叫Initdrbd 的脚本命令,具体的见下面演示。
第三个字段:作用定义启动mfsmaster进程,必须在/etc/init.d/或/etc/ha.d/resource.d能找到的可执行的脚本文件。
第四个字段:作用是启动虚拟IP
5.) 创建Initdrbd脚本
[root@mfs-master ~]# cd /etc/ha.d/resource.d/
[root@mfs-master ~]# cat Initdrbd
 
  
  1. #!/bin/sh

  2. unset LC_ALL; export LC_ALL

  3. unset LANGUAGE; export LANGUAGE

  4. prefix=/usr

  5. exec_prefix=/usr

  6. . /etc/ha.d/shellfuncs

  7. case"$1"in

  8. 'start')

  9.    drbdadm primary r0

  10.    mount /dev/drbd1 /usr/local/mfs

  11.      ;;

  12. 'stop')

  13.    umount /usr/local/mfs

  14.    drbdadm  secondary r0        

  15.    ;;

  16. 'restart')

  17.     ;;

  18. *)

  19.        echo "Usage: $0 { start |  stop | restart }"

  20.     ;;

  21. esac

  22. exit 0

[root@mfs-master ~]# chmod +x Initdrbd
6.)启动heartbeat
[root@mfs-master ~]# /etc/init.d/heartbeat start
[root@mfs-master ~]# service heartbeat start
过会我们来ping下虚拟IP
[root@mfs-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:d8:bc:3e brd ff:ff:ff:ff:ff:ff
   inet 192.168.8.200/24 brd 192.168.8.255 scope global eth0
inet 192.168.8.210/24 brd 192.168.8.255 scope global secondary eth0:0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:d8:bc:48 brd ff:ff:ff:ff:ff:ff
   inet 192.168.125.200/24 brd 192.168.125.255 scope global eth1
[root@mfs-master ~]# ping 192.168.8.210
要是能够PING通,说明配置成功!
这里能PING能的前提是:mfsmaster服务必须安装好后,并且/etc/init.d/mfsmaster这个脚本同时也要存在!不然日志出出现意思为mfsmaster无法启动的error!
所以这里没有vip生成是正常,等后面mfs服务安装好后再回过头来测试!!!
[root@mfs-master ~]# tail -f /var/log/ha.log
3.MFS元数据服务器安装配置(主备操作一样)
切忌:用户的uid和gid必须两台主备机一样,否则切换之后,起不来!!!!!
1.)安装mfs
[root@mfs-master ~]# wget http://www.moosefs.org/tl_files/mfscode/mfs-1.6.20-2.tar.gz
[root@mfs-master ~]# groupadd -g 1000 mfs
[root@mfs-master ~]# useradd -u 1000 -g mfs -s /sbin/nologin mfs
[root@mfs-master ~]# tar zxf mfs-1.6.20-2.tar.gz
[root@mfs-master ~]# cd mfs-1.6.20-2
[root@mfs-master mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs  --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@mfs-master mfs-1.6.20-2]# make;make install
[root@mfs-master mfs-1.6.20-2]# chown -R mfs.mfs /usr/local/mfs
2.)创建配置文件
[root@mfs-master ~]# cd /usr/local/mfs/etc
[root@mfs-master etc]# cp mfsmaster.cfg.dist mfsmaster.cfg
[root@mfs-master etc]# cat >> mfsexports.cfg<< EOF
192.168.8.0/24                  /       rw
*                       .       rw
EOF
[root@mfs-master etc]# cd ../var/mfs/
[root@mfs-master etc]# cp metadata.mfs.empty metadata.mfs
3.)设置环境变量
[root@mfs-master ~]# echo "export PATH=$PATH:/usr/local/mfs/sbin" >> /etc/profile
[root@mfs-master ~]# source /etc/profile
4.)启动MFS
[root@mfs-master ~]# mfsmaster start
5.)定制hearbeat的启动文件mfsmaster
[root@mfs-master ~]# cat /etc/init.d/mfsmaster
 
  
  1. # chkconfig: 345 91 10

  2. # description: mfs start.

  3. . /etc/rc.d/init.d/functions

  4. . /etc/sysconfig/network

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

  6. start() {

  7.        /usr/local/mfs/sbin/mfsmaster start

  8. }  

  9. stop() {

  10.        /usr/local/mfs/sbin/mfsmaster stop

  11. }  

  12. restart() {

  13.        /usr/local/mfs/sbin/mfsmaster restart

  14. }  

  15. case"$1"in

  16.  start)

  17.        start

  18.        ;;

  19.  stop)

  20.        stop

  21.        ;;

  22.  restart)

  23.        restart

  24.        ;;

  25.  *)

  26.        echo $"Usage: $0 start|stop|restart"

  27.        exit 1

  28. esac  

  29. exit 0

[root@mfs-master ~]#chmod 755 /etc/init.d/mfsmaster
二.元数据日志服务器metalogger安装与配置
1.)安装mfs
[root@metalogger ~]# wget http://www.moosefs.org/tl_files/mfscode/mfs-1.6.20-2.tar.gz
[root@metalogger ~]# groupadd -g 1000 mfs
[root@metalogger ~]# useradd -u 1000 -g mfs -s /sbin/nologin mfs
[root@metalogger ~]# tar zxf mfs-1.6.20-2.tar.gz
[root@metalogger ~]# cd mfs-1.6.20-2
[root@metalogger mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs  --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@metalogger mfs-1.6.20-2]# make;make install
[root@metalogger mfs-1.6.20-2]# chown -R mfs.mfs /usr/local/mfs
[root@metalogger mfs-1.6.20-2]# echo "export PATH=$PATH:/usr/local/mfs/sbin" >> /etc/profile
[root@metalogger mfs-1.6.20-2]# source /etc/profile
2.)创建配置文件
[root@metalogger ~]# cd /usr/local/mfs/etc
该服务仅需要一个配置文件,这里我们只需要从模板文件复制一个,然后稍微加以修改即可!
[root@metalogger etc]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@metalogger etc]# cat mfsmetalogger.cfg
 
  
  1. # WORKING_USER = mfs

  2. # WORKING_GROUP = mfs

  3. # SYSLOG_IDENT = mfsmetalogger

  4. # LOCK_MEMORY = 0

  5. # NICE_LEVEL = -19

  6. # DATA_PATH = /usr/local/mfs/var/mfs

  7. # BACK_LOGS = 50

  8. # META_DOWNLOAD_FREQ = 24

  9. # MASTER_RECONNECTION_DELAY = 5

  10. MASTER_HOST = 192.168.8.210

  11. # MASTER_PORT = 9419

  12. # MASTER_TIMEOUT = 60

  13. # deprecated, to be removed in MooseFS 1.7

  14. # LOCK_FILE = /var/run/mfs/mfsmetalogger.lock

这个配置文件,唯一需要修改的地方就是MASTER_HOST,它的值必须是元数据服务器
上由heartbeat生成的虚拟VIP:192.168.8.210
MASTER_HOST = 192.168.8.210
其它选项不加说明,也很容易理解!
3.) 元数据日志服务(metalogger)运行及关闭
[root@metalogger etc]# mfsmetalogger start
关闭服务
[root@metalogger etc]# mfsmetalogger stop
三.数据存储服务器 chunkserver 安装与配置
1.)安装mfs
[root@chunkserver1 ~]# wget http://www.moosefs.org/tl_files/mfscode/mfs-1.6.20-2.tar.gz
[root@chunkserver1 ~]# groupadd -g 1000 mfs
[root@chunkserver1 ~]# useradd -u 1000 -g mfs -s /sbin/nologin mfs
[root@chunkserver1 ~]# tar zxf mfs-1.6.20-2.tar.gz
[root@chunkserver1 ~]# cd mfs-1.6.20-2
[root@chunkserver1 mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmount
[root@chunkserver1 mfs-1.6.20-2]# make;make install
[root@chunkserver1r mfs-1.6.20-2]# chown -R mfs.mfs /usr/local/mfs
[root@chunkserver1 mfs-1.6.20-2]# echo "export PATH=$PATH:/usr/local/mfs/sbin" >> /etc/profile
[root@chunkserver1 mfs-1.6.20-2]# source /etc/profile
2.)创建配置文件
[root@chunkserver1 ~]# cd /usr/local/mfs/etc
[root@chunkserver1 etc]# cp –a mfschunkserver.cfg.dist mfschunkserver.cfg
[root@chunkserver1 etc]# cat mfschunkserver.cfg
 
  
  1. #WORKING_USER = mfs

  2. #WORKING_GROUP = mfs

  3. # DATA_PATH = /usr/local/mfs/var/mfs

  4. # LOCK_FILE = /var/run/mfs/mfschunkserver.pid

  5. # SYSLOG_IDENT = mfschunkserver

  6. # BACK_LOGS = 50

  7. # MASTER_RECONNECTION_DELAY = 30

  8. MASTER_HOST = 192.168.8.210

  9. # MASTER_PORT = 9420

  10. # MASTER_TIMEOUT = 60

  11. # CSSERV_LISTEN_HOST = *

  12. # CSSERV_LISTEN_PORT = 9422

  13. # CSSERV_TIMEOUT = 60

  14. # CSTOCS_TIMEOUT = 60

  15. # HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg

这个配置文件,唯一需要修改的地方就是MASTER_HOST,它的值必须是元数据服务器上由heartbeat生成的虚拟VIP:192.168.8.210
MASTER_HOST = 192.168.8.210
其它选项不加说明,也很容易理解!
[root@chunkserver1 etc]# cp -a mfshdd.cfg.dist mfshdd.cfg
在配置文件mfshdd.cfg 中,我们给出了用于客户端挂接MFS分布式文件系统根分区所
使用的共享空间位置。建议在chunk server 上划分单独的空间给 MFS 使用,这样做的好处是便于管理剩余空间。此处我们假定要使用两个共享点/mnt/mfschunk为此,我们在mfshdd.cfg 加入下面的文本行:
/data/mfschunk
[root@chunkserver1 etc]# mkdir -p /data/mfschunk
[root@chunkserver1 etc]# chown -R mfs:mfs /data/mfschunk
3.启动和关闭mfschunk
[root@chunkserver1 etc]# mfschunkserver start
[root@chunkserver1 etc]# tail -f /var/log/messages
四、MFS 客户端的安装及配置
1.)安装MFS 客户端
Mfsmount 需要依赖FUSE,因此需要先安装好fuse!
[root@mfs-client ~]#  wget http://cdnetworks-kr-2.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.5/fuse-2.8.5.tar.gz
[root@mfs-client ~]# tar zxf fuse-2.8.5.tar.gz
[root@mfs-client ~]# cd fuse-2.8.5
[root@mfs-client fuse-2.8.5]#./configure
[root@mfs-client fuse-2.8.5]# make;make install
[root@mfs-client fuse-2.8.5]# yum -y install fuse-devel
[root@mfs-client fuse-2.8.5]# modprobe fuse
[root@mfs-client fuse-2.8.5]# cd
PS:这里不yum安装fuse-devl时后面安装mfs时启用 --enable-mfsmount 时会报错!
2.)安装MFS 客户端程序
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
如果不执行这个操作,在后面安装MFS 的过程中,执行命令
./configure --enable-mfsmount 时可能出现"checking for FUSE... no configure:
error: mfsmount build was forced, but fuse development package is not
installed"这样的错误,而不能正确安装MFS 客户端程序。
[root@mfs-client ~]# wget http://www.moosefs.org/tl_files/mfscode/mfs-1.6.20-2.tar.gz
[root@mfs-client ~]# groupadd -g 1000 mfs
[root@mfs-client ~]# useradd -u 1000 -g mfs -s /sbin/nologin mfs
[root@mfs-client ~]# tar zxf mfs-1.6.20-2.tar.gz
[root@mfs-client ~]# cd mfs-1.6.20-2
[root@mfs-client mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount
[root@mfs-client mfs-1.6.20-2]# make;make install
[root@mfs-client mfs-1.6.20-2]# chown -R mfs.mfs /usr/local/mfs
[root@mfs-client mfs-1.6.20-2]# echo "export PATH=$PATH:/usr/local/mfs/bin" >> /etc/profile
[root@mfs-client mfs-1.6.20-2]# source /etc/profile
[root@mfs-client mfs-1.6.20-2]# cd
3.)挂载
挂载前,我们PING下元数据服务器上的VIP
[root@mfs-client ~]# ping 192.168.8.210
[root@mfs-client ~]# mkdir –p /mnt/mfs
[root@mfs-client ~]# mfsmount /mnt/mfs/ -H 192.168.8.210
[root@mfs-client ~]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /data type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
mfs#192.168.8.210:9421 on /mnt/mfs type fuse (rw,nosuid,nodev,allow_other,default_permissions)
[root@mfs-client ~]# df –h
[root@mfs-client mfs]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             3.8G  2.4G  1.3G  65% /
/dev/sda5             4.9G  139M  4.5G   3% /data
/dev/sda1             122M   18M   98M  16% /boot
tmpfs                 144M     0  144M   0% /dev/shm
mfs#192.168.8.210:9421
                      17G     0   17G   0% /mnt/mfs
五.网页监控--mfscgiserv
mfscgiserv是用python编写的一个web服务工具,它的监听端口是9425,可以利用:/usr/local/mfs/sbin/mfscgiserv来启动,用户利用浏览器就可全面监控所有客户挂接,chunkserver及master server,客户端的各种操作等等,绝对是个好工具。通过浏览器可以查看:http://VIP:9425
六.MFS客户端常用命令介绍
[root@mfs-client mfs]# ll /usr/local/mfs/bin/
total 556
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsappendchunks -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfscheckfile -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsdeleattr -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsdirinfo -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsfileinfo -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsfilerepair -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsgeteattr -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsgetgoal -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsgettrashtime -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsmakesnapshot -> mfstools
-rwxr-xr-x 1 root root 384447 Jun  5 01:09 mfsmount
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsrgetgoal -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsrgettrashtime -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsrsetgoal -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsrsettrashtime -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfsseteattr -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfssetgoal -> mfstools
lrwxrwxrwx 1 root root      8 Jun  5 01:09 mfssettrashtime -> mfstools
-rwxr-xr-x 1 root root    137 Jun  5 01:09 mfssnapshot
-rwxr-xr-x 1 root root 170799 Jun  5 01:09 mfstools
七.整个系统架构总结
1.heartbeat与drbd的集成
DRBD的主从的切换依赖与heartbeat的服务,所以集成的关键点在于定义Initdrbd的脚本文件的定义和heartbeat的服务定义文件/etc/ha.d/resource.d。如mfs-master Initdrbd 就是集成DRBD和heartbeat。
2.heartbeat与MFS的集成
与DRBD一样,mfsmaster的脚本文件定义与heartbeat的服务定义文件/etc/ha.d/resource.d中即可。
3.drbd 与mfs 的集成
在主服务器中,必须把MFS的安装文件全部安装到drbd的挂载目录中去,安装到块设备上去,所以在主从切换的时候,备份机器拿到安装环境和主的一样,那么通过同样的方式来启动MFS进程,达到切换切换启动MFS的目的。
八.测试
1.两台server上启动DRBD,利用cat /proc/drbd 查看启动情况和网络状态
主机器上显示Primary/Secondary 备份机器上显示Secondary/Primary,启动成功
主上查看:
[root@mfs-master /]# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
   ns:2377 nr:41 dw:2418 dr:694 al:4 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
备上查看:
[root@mfs-bak ha.d]# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:36
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
   ns:41 nr:2377 dw:2379 dr:173 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
结论:说明主备上DRBD启动正常,之前连接正常!
2. 启动heartbeat,通过日志查看heartbeat包括关联的服务加载的情况,tail -f /var/log/ha.log
[root@mfs-master /]# tail -f /var/log/ha.log
IPaddr[15336]: 2012/06/05_19:26:04 INFO:  Resource is stopped
ResourceManager[15238]: 2012/06/05_19:26:04 info: Running /etc/ha.d/resource.d/IPaddr 192.168.8.210 start
IPaddr[15409]: 2012/06/05_19:26:04 INFO: Using calculated nic for 192.168.8.210: eth0
IPaddr[15409]: 2012/06/05_19:26:04 INFO: Using calculated netmask for 192.168.8.210: 255.255.255.0
IPaddr[15409]: 2012/06/05_19:26:04 INFO: eval ifconfig eth0:0 192.168.8.210 netmask 255.255.255.0 broadcast 192.168.8.255
IPaddr[15392]: 2012/06/05_19:26:04 INFO:  Success
heartbeat[15225]: 2012/06/05_19:26:04 info: local HA resource acquisition completed (standby).
heartbeat[15197]: 2012/06/05_19:26:04 info: Standby resource acquisition done [foreign].
heartbeat[15197]: 2012/06/05_19:26:04 info: Initial resource acquisition complete (auto_failback)
heartbeat[15197]: 2012/06/05_19:26:05 info: remote resource transition completed.
结论:heartbeat 启动成功!
3. 在主机器上ps的方式查看heartbeat 和MFS进程,确保服务启动,如果没有启动,可手动在启动一次。此时备份机器的mfs没有启动。
[root@mfs-master /]# ps aux |grep haert
root     15507  0.0  0.2  61220   748 pts/0    S+   19:30   0:00 grep haert
[root@mfs-master /]# ps aux |grep heart
root     15197  0.0  4.4  58008 13008 ?        SLs  19:25   0:00 heartbeat: master control process
nobody   15200  0.0  2.1  51412  6412 ?        SL   19:25   0:00 heartbeat: FIFO reader        
nobody   15201  0.0  2.1  51408  6408 ?        SL   19:25   0:00 heartbeat: write: bcast eth1  
nobody   15202  0.0  2.1  51408  6408 ?        SL   19:25   0:00 heartbeat: read: bcast eth1  
root     15509  0.0  0.2  61220   744 pts/0    S+   19:30   0:00 grep heart
[root@mfs-master /]# ps aux |grep mfs
root     14914  0.0  3.5 136048 10416 ?        S    19:18   0:00 python /data/mfs/sbin/mfscgiserv
mfs      15320  0.8 27.3  93880 80508 ?        S<   19:25   0:02 /usr/local/mfs/sbin/mfsmaster start
root     15511  0.0  0.2  61220   744 pts/0    S+   19:30   0:00 grep mfs
结论:主服务器上各服务正常启动
4. 停止主服务的heartbeat,查看主服务的日志,发现所有的关联服务都会被关闭,包括drbd,mfs,vip等。
[root@mfs-master mfs]# service heartbeat stop
Stopping High-Availability services:
                                                          [  OK  ]
[root@mfs-master mfs]# tail -f /var/log/ha.log
ResourceManager[14246]:2012/06/05_19:06:57 info: Running /etc/ha.d/resource.d/mfsmaster  stop
ResourceManager[14246]:2012/06/05_19:06:57 info: Running /etc/ha.d/resource.d/Initdrbd  stop
heartbeat[14233]: 2012/06/05_19:06:58 info: All HA resources relinquished.
heartbeat[8527]: 2012/06/05_19:07:00 info: killing HBFIFO process 8529 with signal 15
heartbeat[8527]: 2012/06/05_19:07:00 info: killing HBWRITE process 8530 with signal 15
heartbeat[8527]: 2012/06/05_19:07:00 info: killing HBREAD process 8531 with signal 15
heartbeat[8527]: 2012/06/05_19:07:00 info: Core process 8530 exited. 3 remaining
heartbeat[8527]: 2012/06/05_19:07:00 info: Core process 8531 exited. 2 remaining
heartbeat[8527]: 2012/06/05_19:07:00 info: Core process 8529 exited. 1 remaining
heartbeat[8527]: 2012/06/05_19:07:00 info: mfs-master Heartbeat shutdown complete.
结论:可以看到各关联服务正关闭!
5.查看备份机器的日志,发现已经开始启动关联的服务,此时备份机器上cat /proc/drbd
出现Primary/Secondary 主机器上显示Secondary/Primary,说明DRBD切换成功,然后查看mfs是否启动,如果启动成功,恭喜您,高可用的MFS文件分布式系统已经搭建好了.
查看日志:
[root@mfs-bak ha.d]# tail -f /var/log/ha.log
IPaddr[16737]: 2012/06/05_19:23:31 INFO: Using calculated nic for 192.168.8.210: eth0
IPaddr[16737]: 2012/06/05_19:23:31 INFO: Using calculated netmask for 192.168.8.210: 255.255.255.0
IPaddr[16737]: 2012/06/05_19:23:31 INFO: eval ifconfig eth0:0
192.168.8.210 netmask 255.255.255.0 broadcast 192.168.8.255
IPaddr[16720]:2012/06/05_19:23:32 INFO:  Success
mach_down[16548]:2012/06/05_19:23:32 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired
mach_down[16548]:2012/06/05_19:23:32 info: mach_down takeover complete for node mfs-master.
heartbeat[16471]: 2012/06/05_19:23:32 info: mach_down takeover complete.
heartbeat[16471]: 2012/06/05_19:23:49 WARN: node mfs-master: is dead
heartbeat[16471]: 2012/06/05_19:23:49 info: Dead node mfs-master gave up resources.
heartbeat[16471]: 2012/06/05_19:23:49 info: Link mfs-master:eth1 dead.
切换后mfs是否自己启动起来:
[root@mfs-bak ha.d]# ps aux |grep mfs
mfs      16650 15.8 27.3  93800 80484 ?        S<   19:23   0:02 /usr/local/mfs/sbin/mfsmaster start
root     16843  0.0  0.2  61220   748 pts/0    S+   19:23   0:00 grep mfs
查看有没有自动接管VIP
[root@mfs-bak ha.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:5a:64:12 brd ff:ff:ff:ff:ff:ff
   inet 192.168.8.201/24 brd 192.168.8.255 scope global eth0
 inet 192.168.8.210/24 brd 192.168.8.255 scope global secondary eth0:0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:5a:64:1c brd ff:ff:ff:ff:ff:ff
   inet 192.168.125.201/24 brd 192.168.125.255 scope global eth1
结论:主服务器的heartbeat 服务停掉后,从服务器heartbeat 服务马上接管过来!
下面我们再重启主服务器 heartbeat 服务,他会自动再抢过来!
[root@mfs-master /]# service heartbeat start
Starting High-Availability services:
                                                          [  OK  ]
[root@mfs-master /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:d8:bc:3e brd ff:ff:ff:ff:ff:ff
   inet 192.168.8.200/24 brd 192.168.8.255 scope global eth0
inet 192.168.8.210/24 brd 192.168.8.255 scope global secondary eth0:0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
   link/ether 00:0c:29:d8:bc:48 brd ff:ff:ff:ff:ff:ff
   inet 192.168.125.200/24 brd 192.168.125.255 scope global eth1
本人也刚开始对MFS进行初步了解,整个架构从搭建到最后的测试花了不少时间,凝聚了不少心血!希望大家提出宝贵的意见!!