用Heartbeat配置Linux高可用性集群
Linux下高可用集群方案很多,本文介绍的是性价比比较高的一种: 使用Heartbeat 2.0配置Linux高可用性集群。
一、 准备工作
你首先需要两台电脑,这两台电脑并不需要有相同的硬件(或者内存大小等),但如果相同的话,当某个部件出现故障时会容易处理得多。 接下来您需要决定如何部署。你的集群是通过Heartbeat 软件产生在两台电脑之间心跳信号来建立的。为了传输心跳信号,需要在节点之间存在一条或多条介质通路(串口线通过modem电线,以太网通过交叉线,等等)。 现在可以开始配置硬件了。既然想要获得高可用性(HA),那么您很可能希望避免单点失效。在本例中,可能是您的null modem线/串口,或者网卡(NIC)/ 交叉线。因此便需要决定是否希望为每个节点添加第二条串口null modem连线或者第二条NIC/交叉线连接。我使用一个串口和一块额外的网卡来作为heartbeat的通路,这是因为我只有一条null modem线和一块多余的网卡,并且认为有两种介质类型传输heartbeat信号比较好。 硬件配置完成之后,便需要安装操作系统以及配置网络(我在本文中使用的是RedHat)。假设您有两块网卡,那么有一块应该配置用于常规网络用途,另一块作为集群节点之间的专用网络连接(通过交叉线)。例如,假设集群节点有如表-1下的IP地址:
表-1集群节点的IP地址 
输入如下命令检查您的配置:
ifconfig
这将显示您的网卡及其配置。也可以使用命令“netstat nr”来获得网络路由信息。 如果一切正常,接下来要确定可以来两个节点之间通过所有接口ping通对方。 如果使用了串口,便需要检测其连接情况。把一个节点作为接收者,输入命令:
cat </dev/ttyS0
在另一个节点上,输入:
echo hello >/dev/ttyS0
应该可以在接收节点上看到该文本。如果正常的话交换这两个节点的角色再作一次,否则有可能是使用了错误的设备文件。现在就开始动手搭建和配置一个简单的高性能计算集群系统。关闭不需要的服务:
图-1系统的物理结构
二、下载安装软件包
接下来便可以安装Heartbeat软件。可以从如下位置得到: http://linux-ha.org/download Heartbeat软件包。在网站上也有RPM安装包,您也可以选择从源代码编译。取得源代码tar文件或者安装source RPM包,将其解包到某个文件夹。在源代码树的顶端,输入"./ConfigureMe configure", 之后输入"make"和"make install"。
如果使用RPM安装包的话需要包括如下软件包: ipfail,Stonith,Ldirectord。
ipfail的功能直接包含在heartbeat里面,是一个能够在探知服务IP失效了便立即将服务IP抓取来用的功能。
Stonith是为了要在任何server停止时,确保剩下的server不会被正在运作的server所影响,可以选择性强制停止一些server的解决方案。可能会使用在例如共享数据的情况之下。
Ldirector是一个负载平衡的服务器。
安装命令:
图 -1 Heartbeat与配置Stonith示例
Stonith设备清单如下表-1: 
查看当前支持Stonith设备清单的命令:
#/usr/sbin/stonith -L
查看当前支持Stonith设备其他情况的命令
例如查看rps10的设备配置的命令:
# /usr/sbin/stonith -l -t rps10 test
命令输出:
图 2 编译内核支持Software Watchdog选项
4 加载模块
#insmod softdog
说明:watchdog能让系统在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。 如果使用该特性,则在内核中装入"softdog"内核模块,用来生成实际的设备文件,输入"insmod softdog"加载模块。 输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc | grep watchdog"(应为130)。 生成设备文件:"mknod /dev/watchdog c 10 130" 。
5 测试软件狗
编辑文件 /etc/ha.d/ha.cf
如掉下面一行的注释号:
watchdog /dev/watchdog
重新启动Heartbeat
#service heartbeat restart
使用命令杀掉heartbeat进程
killall -9 heartbeat
此时日志文件中应当出现一行:
Softdog: WDT device closed unexpectedly. WDT will not stop!
表示软件狗生效。另外使用命令lsmod可以看到软件狗已经加载。如图3 。
6 删除软件狗的方法
使用命令可以从内核中删除软件狗:
#modprobe -r softdog
五、测试Heartbeat配置
在你把你的Heartbeat的高可用性服务器放到生产中之前,这里是对试图的一些事情:
1. 在主服务器上拔去电源线
在备份服务器上的Heartbeat应该从主要的服务器发现heartbeat若干数据包损失,并且开始故障转移。 使用Stonith,备份服务器应该把电源关闭或者复位到主要的服务器。 在备份服务器上的Heartbeat然后应该运行适当的资源脚本(当Stonith事件有“清除”时或者完成)拿资源的所有权。 在备份服务器上的Heartbeat也应该发送ARP广播通知顾客或者网络设备MAC地址因为资源IP地址已变化。
2. 测试hb_standby命令的行为
使用在主要的服务器上的hb_standby命令把资源强迫到迁移到备份服务器。 然后再一次在备份服务器上使用命令来把资源往回强迫迁移到主服务器. ipfail如果hb_standby命令不适当地工作,也将不适当地工作。
3. 拔去在主服务器上的网络电缆
使用ipfail可以检测到网络联系失败,并且应该被发现到备份服务器,并且资源和IP别名迁移到备份服务器。
4. 在两个服务器之间删除所有heartbeat路径
当你在两个服务器之间删除所有heartbeat路径时,什么会发生? 如果你使用Stonith,备份服务器将假定主要的服务器已死去,开始一个Stonith事件,而接管资源。
5. 在主要的服务器( 使用命令:killall - 9 heartbeat )上杀死heartbeat 守护进程
当你使用IP别名到提供资源到顾客计算机时,Stonith是尤其重要的。 备份服务器必须Stonith或者在试图假定资源的所有权避免裂痕脑条件之前复位主服务器。
6. 重新引导两个服务器
六、配置Mon
1 什么是Mon
mon是针对linux开发的工具,但众所周知在sorlaris下他也可以工作。因为客户和服务端都是由perl语言书写,因此在轻便性上不会有问题。
简单来说Heartbeat用来实现心跳和高可用性,Mon用来监控服务 。
2 Mon方案
图 4 是基于集群监视的Mon方案
图 5 是Mon检查每个集群节点MIB的过程 
3 首先自行搜以下的 Perl 模块
perl-Mon-0.11-2.2.el5.rf.noarch.rpmperl-Convert-BER-1.31.01-1.2.el5.rf.noarch.rpmperl-Net-Telnet-3.03-1.2.el5.rf.noarch.rpmperl-Time-HiRes-1.55-3.i386.rpmperl-Time-Period-1.20-2.el5.rf.noarch.rpm
安装命令:
#perl -MCPAN -e shellcpan>install Time::Periodcpan>install Time::HiRescpan>install Convert::BERcpan>install Mon::Protocolcpan>install Mon::SNMPcpan>install Mon::Client
4 下载安装fping
Ping命令大概是网管员最常用的命令了,使用Ping可以监测网络的通断、设备是否宕机,遗憾的是每次只能针对一台设备。在一个拥有20余台服务器和80多个可网管交换机的局域网内,Ping上一遍是很艰难的事情,而运行在Linux下的 Fping(http://www.fping.com)可以轻松完成这一工作。Fping 命令与Ping命令非常相似,使用ICMP回应请求和应答来确定系统的可达性。它提供了一些Ping没有的特殊功能,比如,Fping可以在命令行上指定主机名或IP地址的列表、可以处理一个包含主机名或IP地址清单的文件。Fping并不是发送一个请求到单一目标(Ping的做法),而是用循环的方法发送ICMP请求到每个目标。另外,Fping可以用于脚本编程中。
#wget http://www.kernel.org/pub/software/admin/mon/fping-2.2b1.tar.bz2 #bunzip2 fping-2.2b1.tar.bz2#./configure#make#make check#make install
5 下载安装Mon
#wget ftp://ftp.kernel.org/pub/software/admin/mon/mon-0.99.2.tar.gz #tar -xzf mon-0.99.2.tar.gz#cd mon-0.99.2#mkdir /etc/mon#cp auth.cf mon.cf /etc/mon#mkdir /usr/lib/mon#cp -r alert.d mon.d state.d mon /usr/lib/mon
建立Mon报告目录和Mon报告文件
#mkdir /usr/lib/mon/log.d#vi /etc/mon/auth.cf
内容如下:
disable: rootdump: rootenable: rootget: rootloadstate: rootreset: rootsavestate: rootset: rootstart: rootstop: rootterm: root
#vi /etc/mon/mon.cf
内容如下:
不要写跟随他们的箭和数字; 他们仅仅出现在这里说明参数。
alertdir = /usr/lib/mon/alert.d ← [1]mondir = /usr/lib/mon/mon.d ← [2]logdir = /usr/lib/mon/logs ← [3]histlength = 500 ← [4]dtlogging = yes ← [5]dtlogfile = /usr/lib/mon/logs/dtlog ← [6]hostgroup clusternodes clnode1 clnode2 clnode3 ← [7]← [8]watch clusternodes ← [9]service cluster-ping-check [10]interval 5s [11]monitor fping.monitor [12]period wd ...{Sa-Su} [13]alert mail.alert alert@domain.com ← [14]upalert mail.alert alert@domain.com ← [15]alertevery 1h ← [16]
说明如下:
[ 1 ]警报脚本的路径。
[ 2 ]监视器脚本的路径。
[ 3 ]报告文件的路径。
[ 4 ]→事件的最大限度数字在报告中节省。
[ 5 ]→启用宕机的日志记录成为可能。
[ 6 ]→报告到宕机事件。
[ 7 ]被分配到一组的丛群节点的列表。
[ 8 ]→在每个主机之后要求空的行。
[ 9 ]→监视组观看所有节点。
[ 10 ]→称为服务任何事物你想要。
[ 11 ] fping的工作频率。
[ 12 ]→使用fping.monitor脚本。
[ 13 ]→针对语法输入:perldoc Time::Period
[ 14 ]→当节点之一断开时。
[ 15 ]→当节点之一连接时。
[ 16 ]→每小时仅仅发送警报的电子邮件一次。
Vi /etc/services,添加两行:
mon 2583/tcp # MON
mon 2583/udp # MON traps
6 通过手工运行fping.monitor和mail.alert脚本的测试
脚本命令如下:
#/usr/lib/mon/mon.d/fping.monitor clnode1输出如下:start time: <current date>end time : <current date>duration : 0 seconds--------------------reachable hosts rtt-------------------------------------------------------209.100.100.2 58.10 ms
上面的报告IP地址为209.100.100.2以58.10个秒响应fping。
如果这脚本不适当地工作,你能需要告诉Perl找到fping的工具。编辑fping.monitor文件:
my $CMD = "/usr/local/sbin/fping -e -r $RETRIES -t $TIMEOUT";
要测试电子邮件警报,输入:
#echo "Testing 123" | /usr/lib/mon/alert.d/mail.alert alert@domain.com
alert@domain.com 是电子邮件的发送地址。
7 使用调试方式时开始Mon测试
#/usr/lib/mon/mon -d
正常输出如下:
PID 8211 (clusternodes/cluster-ping-check) exited with [0]
Mon发送的电子邮件警报如下:
Subject: ALERT clusternodes/process-check: localhost:ntpd,ypbind
Summary output : localhost:ntpd,ypbind
Group : clusternodes
Service : process-check
Time noticed : <Time and Date>
Secs until next alert :
Members : localhost
Detailed text (if any) follows:
-------------------------------
localhost:ntpd Count=0 Min=0 Max=0
localhost:ypbind Count=0 Min=0 Max=0
到此为止简单介绍了使用Heartbeat 2.0配置Linux高可用性集群的从部署到监视完整过程。