|
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分区并格式化(步骤略)
[iyunv@node2 ~]# mkdir /data
[iyunv@node2 ~]#mount /dev/sdb1 /data
[iyunv@node2 ~]# sed -i "10a UUID=`blkid /dev/sdb1 | cut -d '"' -f2` /data ext4 defaults 0 0" /etc/fstab
(写到/etc/fstab里面,不然重启无效)
添加主机名与IP对应
[iyunv@node2 ~]# 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
[iyunv@node2 ~]# init 6
3.3. 编译安装DRBD
安装依赖软件
[iyunv@node2 ~]# yum -y install kernel-devel kernel-headers flex
[iyunv@node2 ~]# tar zxf drbd-8.4.3.tar.gz
[iyunv@node2 ~]# cd drbd-8.4.3
[iyunv@node2 drbd-8.4.3]# ./configure –prefix=/usr/local/drbd –with-km
注意:–with-km是启用内核模块
[iyunv@node2 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/
注意KDIR的路径 (这个内核源码路径需要根据自己的系统修改)
[iyunv@node2 drbd-8.4.3]# make install
[iyunv@node2 ~]# mkdir -p /usr/local/drbd/var/run/drbd
[iyunv@node2 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[iyunv@node2 ~]# chkconfig –add drbd
[iyunv@node2 ~]# chkconfig drbd on
安装drbd模块
回到刚刚解压drbd的目录,然后
[iyunv@node2 drbd-8.4.3]# cd drbd
[iyunv@node2 drbd]# make clean
[iyunv@node2drbd]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/
[iyunv@node2 drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
[iyunv@node2 drbd]# modprobe drbd
查看模块是否加载成功
[iyunv@node2 drbd]# lsmod | grep drbd
drbd 325626 4
libcrc32c 1246 1 drbd
3.4. 修改配置文件
查看drbd的主配置文件
[iyunv@node2 etc]# pwd
/usr/local/drbd/etc
[iyunv@node2 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结尾的文件
修改全局配置文件:
[iyunv@node2 drbd.d]# pwd
/usr/local/drbd/etc/drbd.d
[iyunv@node2 drbd.d]# cp global_common.conf global_common.conf_bak(备份配置文件)
配置文件内容如下:
[iyunv@node2 drbd.d]# 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; #设置主备节点同步时的网络速率
}
}
##########################资源配置文件配置如下 需自己新建####################
[iyunv@node2 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res
resource r1 { #这个r1是定义资源的名字
on node2 { #on开头,后面是主机名称
device /dev/drbd0; #drbd设备名称
disk /dev/sdb1; #drbd0使用的磁盘分区为sdb1
address 10.90.5.132:7789; #设置drbd监听地址与端口
meta-disk internal;
}
on node7 { #on开头,后面是主机名称
device /dev/drbd0; #drbd设备名称
disk /dev/sdb1; #drbd0使用的磁盘分区为sdb1
address 10.90.5.137:7789; #设置drbd监听地址与端口
meta-disk internal;
}
}
#####################################################################
3.5. 启动DRBD
清理磁盘
[iyunv@node2 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1;sync
启动服务
[iyunv@node2 ~]# service drbd start
在node2上初始化资源
[iyunv@node2 ~]# drbdadm create-md r1
(node7 drbd配置与node2完全相同,不再赘述)
将node2设置为drbd的主服务
[iyunv@node2 ~]# drbdadm primary --force r1
查看主服务设置
[iyunv@node2 ~]# drbdadm role r1
Primary/Secondary
查看drbd监听端口:
[[iyunv@node2 ~]# 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 -
查看连接状况
[iyunv@node2 ~]# 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编译器及依赖的软件包
[iyunv@node2 ~]# 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 账户
[iyunv@node2 ~]# groupadd haclient
[iyunv@node2 ~]# useradd -g haclient hacluster -M -s /sbin/nologin
4.3. 编译安装软件 Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
[iyunv@node2 ~]# mkdir -p /usr/local/heartbeat
[iyunv@node2 ~]# mkdir -p /etc/heartbeat
[iyunv@node2 ~]# tar xvf Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2
[iyunv@node2 ~]#cd Reusable-Cluster-Components-glue—glue-1.0.9
[iyunv@node2 Reusable-Cluster-Components-glue--glue-1.0.9]# ./autogen.sh
[iyunv@node2 Reusable-Cluster-Components-glue--glue-1.0.9]# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
[iyunv@node2 Reusable-Cluster-Components-glue--glue-1.0.9]# 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
[iyunv@node2 ~]#tar xvf ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
[iyunv@node2 ~]# cd ClusterLabs-resource-agents-b735277/
[iyunv@node2 ClusterLabs-resource-agents-b735277]# ./autogen.sh
[iyunv@node2 ClusterLabs-resource-agents-b735277]# ./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
[iyunv@node2 ~]# tar xvf Heartbeat-3-0-7e3a82377fa8.tar.bz2
[iyunv@node2 ~]# cd Heartbeat-3-0-7e3a82377fa8
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]# ./bootstrap
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]# ./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'
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]# sed -i '105d' /usr/local/heartbeat/include/heartbeat/glue_config.h
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]# make && make install
4.6. 修改配置文件
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#cp doc/ha.cf /etc/heartbeat/ha.d/
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#cp doc/haresources /etc/heartbeat/ha.d/
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#cp doc/authkeys /etc/heartbeat/ha.d/
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#chkconfig --add heartbeat
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#chkconfig heartbeat on
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#chmod 600 /etc/heartbeat/ha.d/authkeys
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/shellfuncs
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/resource.d/hto-mapfuncs
[iyunv@node2 Heartbeat-3-0-7e3a82377fa8]#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. 编辑资源文件
[iyunv@node2 ~]# 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
[iyunv@node2 ~]# 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
drbdadm secondary r1
;;
'restart')
;;
*)
echo "Usage: $0 { start | stop | restart }"
;;
esac
exit 0
4.10. 配置验证密钥
[iyunv@node2 ~]# echo "auth 1 " >> etc/heartbeat/ha.d/authkeys
[iyunv@node2 ~]# echo "1 crc " >> etc/heartbeat/ha.d/authkeys
[iyunv@node2 ~]# chmod 600 /etc/heartbeat/ha.d/authkeys |
|
|