santaclaus 发表于 2015-9-5 12:54:46

MFS+DRBD+Heartbeat实现MFS master主备切换安装手册

1. 内容简介
现在有大量的企业采用共享存储服务器NFS的方式,来对应用数据进行网络存储,但这存在性能瓶颈和单点故障的问题,于是分布式文件存储管理系统MFS开始流行起来。MFS有元数据服务器(mfsmaster)、元数据日志存储服务器(mfsmetalogger)、数据存储服务器(mfschunkserver)、客户端(clients)组成。
目前MFS元数据服务器存在单点问题,因此我们可以通过DRBD提供磁盘及时同步,通过HeartBeat提供Failover,来达到高可用。
相信DRBD大家都有了解过,DRBD(Distributed Replicated Block Device)是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中. 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了
2. 系统规划
操作系统:CentOS 6.4 2.6.32-358.el6.x86_64
主mfsmaster:             10.90.5.132(heartbeat+drbd)   node2
备mfsmaster :            10.90.5.137(heartbeat+drbd)node7
VIP         :                  10.90.5.139
mfsmetalogger:          10.90.5.133                              node3
mfschunkserver_01    10.90.5.134                            node4
mfschunkserver_02    10.90.5.135                            node5
clients                         10.90.5.136                                 node6
软件版本:
mfs-1.6.11.tar.gz
drbd-8.4.3.tar.gz
ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
Heartbeat-3-0-7e3a82377fa8.tar.bz2
由于主备设置基本一致,这里仅以主mfsmaster进行配置
3. 安装DRBD
3.1. DRBD简介
DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制DRBD 是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,也可以把它看作是一种网络RAID。
DRBD工作机制翻译
Drbd 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。目前,drbd 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
DRBD协议说明
A 数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
B 收到接收确认就认为完成了写入操作。
C 收到写入确认就认为完成了写入操作。
3.2. 分区并格式化硬盘
然后将刚刚添加的一块硬盘 sdb分区并格式化(步骤略)
# mkdir /data
#mount /dev/sdb1/data
# sed -i "10a UUID=`blkid /dev/sdb1 | cut -d '"' -f2` /data                   ext4    defaults      0 0" /etc/fstab
(写到/etc/fstab里面,不然重启无效)
添加主机名与IP对应
# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.90.5.132   node2
10.90.5.137   node7
# init 6
3.3. 编译安装DRBD
安装依赖软件
# yum-yinstallkernel-devel   kernel-headers   flex
# tar zxf drbd-8.4.3.tar.gz
#cd drbd-8.4.3
# ./configure –prefix=/usr/local/drbd –with-km
注意:–with-km是启用内核模块
# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/
注意KDIR的路径 (这个内核源码路径需要根据自己的系统修改)
# make install
# mkdir -p /usr/local/drbd/var/run/drbd
# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
# chkconfig –add drbd
# chkconfig drbd on
安装drbd模块
回到刚刚解压drbd的目录,然后
# cd drbd
# make clean
# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/
# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
# modprobe drbd
查看模块是否加载成功
# lsmod | grep drbd
drbd                  3256264
libcrc32c               12461 drbd
3.4. 修改配置文件
查看drbd的主配置文件
# pwd
/usr/local/drbd/etc
# cat drbd.conf
# You can find an example in /usr/share/doc/drbd…/drbd.conf.example
include “drbd.d/global_common.conf”;
include “drbd.d/*.res”;

由此可见:主配置文件里面已经包含了全局配置文件和drbd目录下以.res结尾的文件
修改全局配置文件:
# pwd
/usr/local/drbd/etc/drbd.d
# cp global_common.conf global_common.conf_bak(备份配置文件)
配置文件内容如下:
# cat global_common.conf
global {
usage-count yes; #是否参加drbd的使用者统计,默认此选项为yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; #使用drbd的同步协议
handlers {
      # These are EXAMPLE handlers only.
      # They may have severe implications,
      # like hard resetting the node under certain circumstances.
      # Be careful when chosing your poison.
      pri-on-incon-degr “/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f”;
      pri-lost-after-sb “/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f”;
      local-io-error “/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f”;
      # fence-peer “/usr/lib/drbd/crm-fence-peer.sh”;
      # split-brain “/usr/lib/drbd/notify-split-brain.sh root”;
      # out-of-sync “/usr/lib/drbd/notify-out-of-sync.sh root”;
      # before-resync-target “/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 — -c 16k”;
      # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
    }
    startup {
      # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
    }
    options {
      # cpu-mask on-no-data-accessible
    }
    disk {
                on-io-error detach; #配置I/O错误处理策略为分离
      # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
      # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
    }
    net {
      # protocol timeout max-epoch-size max-buffers unplug-watermark
      # connect-int ping-int sndbuf-size rcvbuf-size ko-count
      # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
      # after-sb-1pri after-sb-2pri always-asbp rr-conflict
      # ping-timeout data-integrity-alg tcp-cork on-congestion
      # congestion-fill congestion-extents csums-alg verify-alg
      # use-rle
    }
      syncer {
            rate 1024M; #设置主备节点同步时的网络速率
}
}
##########################资源配置文件配置如下需自己新建####################
# vim /usr/local/drbd/etc/drbd.d/drbd.res
resourcer1 {#这个r1是定义资源的名字
          onnode2 {            #on开头,后面是主机名称
          device    /dev/drbd0;#drbd设备名称
          disk      /dev/sdb1;#drbd0使用的磁盘分区为sdb1
          address10.90.5.132:7789; #设置drbd监听地址与端口
          meta-diskinternal;
      }
          onnode7 {            #on开头,后面是主机名称
          device    /dev/drbd0;#drbd设备名称
          disk      /dev/sdb1;#drbd0使用的磁盘分区为sdb1
          address10.90.5.137:7789; #设置drbd监听地址与端口
          meta-diskinternal;
      }
}
#####################################################################
3.5. 启动DRBD
清理磁盘
# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1;sync
启动服务
# service drbd start
在node2上初始化资源
# drbdadm create-md r1
(node7 drbd配置与node2完全相同,不再赘述)
将node2设置为drbd的主服务
# drbdadm primary --force r1
查看主服务设置
# drbdadm role r1
Primary/Secondary
查看drbd监听端口:
[# netstat -anput|grep 7789
tcp      0      0 10.90.5.132:43886         10.90.5.137:7789            ESTABLISHED -                  
tcp      0      0 10.90.5.132:7789            10.90.5.137:51341         ESTABLISHED -   
查看连接状况
# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-07-10 15:52:19
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:12820 nr:9004 dw:21816 dr:27674 al:14 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

4. 安装Heartbeat
4.1 最小化(mininal )安装系统,完成后安装gcc编译器及依赖的软件包
# yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-develmake wget docbook-dtds docbook-style-xsl
4.2添加 Haclient 组和 Hacluster 账户
# groupadd haclient
# useradd -g haclient hacluster -M -s /sbin/nologin
4.3. 编译安装软件   Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
# mkdir -p /usr/local/heartbeat
# mkdir -p /etc/heartbeat
# tar xvf Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
#cdReusable-Cluster-Components-glue—glue-1.0.9
# ./autogen.sh
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
# make && make install
* 32位环境需要将配置参数中的lib64 更改为 lib
* 安装过程中会从 sourceforge 下载一些文件,如果速度慢,需要检查网络是否畅通,以及 docbook-dtds docbook-style-xsl 两个rpm包是否安装
4.4. 编译安装软件   ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
#tar xvfClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
# cd ClusterLabs-resource-agents-b735277/
# ./autogen.sh
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
解决依赖函数库
ln -s /usr/local/heartbeat/lib64/* /lib64/
make && make install
4.5. 编译安装软件   Heartbeat-3-0-7e3a82377fa8.tar.bz2
# tar xvf Heartbeat-3-0-7e3a82377fa8.tar.bz2
# cd Heartbeat-3-0-7e3a82377fa8
# ./bootstrap
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
# sed -i '105d' /usr/local/heartbeat/include/heartbeat/glue_config.h
# make && make install
4.6. 修改配置文件
#cp doc/ha.cf /etc/heartbeat/ha.d/
#cp doc/haresources /etc/heartbeat/ha.d/
#cp doc/authkeys /etc/heartbeat/ha.d/
#chkconfig --add heartbeat
#chkconfig heartbeat on
#chmod 600 /etc/heartbeat/ha.d/authkeys
#sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/shellfuncs
#sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/resource.d/hto-mapfuncs
#sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/ocf-shellfuncs
建立Resource-Agent 的脚本软连接,避免Heartbeat 找不到路径而无法工作
ln -s /usr/local/heartbeat/usr/lib/ocf /usr/lib/ocf
4.7. 修改配置文件 ha.cf
debugfile /var/log/ha-debug
# 用于记录heartbeat的调试信息
logfile /var/log/ha-log
# 用于记录heartbeat的日志信息
logfacility   local0
keepalive 2
# 设置心跳间隔
deadtime 30
# 在30秒后宣布节点死亡
warntime 10
# 在日志中发出“late heartbeat“警告之前等待的时间,单位为秒
initdead 120
# 网络启动时间
udpport 694
# 广播/单播通讯使用的udp端口
bcast   eth0
# 使用网卡heartbeat,并在eth0接口上使用广播heartbeat
ucast eth0 10.90.5.137
watchdog /dev/watchdog
# 该指令是用于设置看门狗定时器,如果节点一分钟内都没有心跳,那么节点将重新启动
auto_failback off
# 当主节点从故障中恢复时,将不会自动切换到主节点
node    node2
node    node7
# 集群中机器的主机名,与“uname –n”的输出相同。
ping 10.90.5.254
# ping 网关或路由器来检测链路正常
respawn hacluster /usr/local/heartbeat/lib64/heartbeat/ipfail
# respawn调用/usr/lib/heartbeat/ipfail来主动进行切换
apiauth ipfail gid=haclient uid=hacluster
# 设置启动ipfail的用户和组
4.8. 编辑资源文件
# vim /etc/heartbeat/ha.d/haresources
node2 initdrbd mfsmaster 10.90.5.139
这个文件中各字段的功能说明:
第一个字段:是主机名,是uname -a得到的
第二个字段:作用是执行当前的脚本命令此脚本可以定义在/etc/init.d/或/etc/ha.d/resource.d,此处我定义了一个名叫Initdrbd 的脚本命令,具体的见下面演示。
第三个字段:作用定义启动mfsmaster进程,必须在/etc/init.d/或/etc/ha.d/resource.d能找到的可执行的脚本文件。
第四个字段:作用是启动虚拟IP
# vim /etc/init.d/initdrbd
#!/bin/sh
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
prefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncs
case "$1" in
'start' )
   drbdadm primary r1
   mount /dev/drbd0 /usr/local/mfs/
   ;;
'stop')
   umount /usr/local/mfs
   drbdadmsecondary r1
   ;;
'restart')
    ;;
*)
       echo "Usage: $0 { start |stop | restart }"
    ;;
esac
exit 0
4.10. 配置验证密钥
# echo "auth 1 " >> etc/heartbeat/ha.d/authkeys
# echo "1 crc " >> etc/heartbeat/ha.d/authkeys
# chmod 600 /etc/heartbeat/ha.d/authkeys
页: [1]
查看完整版本: MFS+DRBD+Heartbeat实现MFS master主备切换安装手册