
上一章介绍了三个用于控制Heartbeat操作的配置文件:ha.cf,haresources和authkeys。这一章描述如何在两个服务器或两个节点上使用这三个文件,以便Heartbeat能够使用一个高可用配置部署资源。
在一个普通的Heartbeat配置中,在主服务器和备用服务器上这些文件都是相同的(如果不相同将会在你的高可用配置中引入错综复杂的问题),本章用一个实验练习来说明Heartbeat如何启动资源,以及出现故障时如何转移到备用服务器上。
7.1 实验方法
原料清单:
两台运行Linux的服务器(每台都配备两个网卡接口并接上网线)
一条交叉线(或标准网线和一个小型集线器)和/或一条串口线
一份Heartbeat软件包(从http://www.linux-ha.org/download下载或从CD-ROM拷贝)
7.2 准备工作
这个实验中,其中一台Linux服务器将作为主服务器而其他的将作为备用服务器,使用交叉线或小型集线器,或串口线进行连接,我们将使用网络连接或串口连接专门传输心跳消息(如图7-1)。
| 图7-1:Heartbeat网络配置 |
RFC1918定义了下面的专用ip地址范围:
| 10.0.0.0到10.255.255.255(10/8) 172.16.0.0到172.31.255.255(172.16/12) 192.168.0.0到192.168.255.255(192.168/16) |
在继续后面的步骤前,先在这两个系统上互相ping一下,看网络是否连通,也就是说,当你在主服务器上输入ping 10.1.1.2以及在备用服务器上ping 10.1.1.1时你应该收到一个应答。
7.3 步骤1:安装Heartbeat
7.3 步骤1:安装Heartbeat
本书附带的CD-ROM包括了Heartbeat的RPM安装包,你可以使用下面的命令安装这些版本。(也许你想从http://www.linux-ha.org/download下载最新的版本进行安装)
#mount /mnt/cdrom
#rpm -ivh /mnt/cdrom/chapter7/heartbeat-pils-*.rpm[1]
#rpm -ivh /mnt/cdrom/chapter7/hearbeat-stonith-*.rpm
| #rpm -ivh /mnt/cdrom/chapter7/hearbeat-*i386.rpm |
一旦安装好RPM包,你应该拥有一个/etc/ha.d目录,它存放Heartbeat配置文件和脚本,同时,还将有一/usr/share/doc/packages/heartbeat目录,它包括样本配置文件和文档。
万一出错了怎么办
在安装Stonith RPM包的时候,如果你收到加密软件依赖失效的错误消息,输入下面的命令确定是否安装了openssl和openssl-devel软件包:
| rpm -q -a | grep openssl |
如果遇到SNMP依赖失效,输入下面的命令:
| rpm -q -a | grep snmp |
如果安装程序还报出依赖失效,甚至你知道你已经安装了最新版本,你可以使用下面的命令进行强制安装而忽略错误信息:
| #rpm -ivh --nodeps /usr/local/src/heartbeat/heartbeat-*i386.rpm |
注意:除了使用这个方法安装Heartbeat之外,你还可以使用src.rpm格式的包进行安装,安装命令是:
| #rpm --rebuild /usr/local/src/heartbeat/heartbeat-*src.rpm |
[2]注意SNMP包叫做ucd-snmp,但是它已经被重新命名为net-snmp。
7.4 步骤2:配置/etc/ha.d/ha.cf
现在你需要告诉heartbeat守护进程你想让它们使用新的以太网(或交叉网络或串口线)发送和接收心跳数据包。
1、 使用下面的命令查找Heartbeat RPM包安装后释放的ha.cf样本配置文件:
| #rpm -qd heartbeat | grep ha.cf |
| #cp /usr/share/doc/packages/heartbeat/ha.cf /etc/ha.d/ |
| #udpport 694 #bcast eth0 # Linux |
例如:要使用eth1在你的主服务器和备用服务器之间发送心跳消息,第二行应该是下面这样:
| bcast eth1 |
| bcast eth0 eth1 |
| serial /dev/ttyS0 baud 19200 |
| keepalive 2 deadtime 30 initdead 120 |
5、 将下面两行添加到/etc/ha.d/ha.cf文件的末尾:
| node primary.mydomain.com node backup.mydomain.com |
| node primary.mydomain.com backup.mydomain.com |
主、备用服务器的主机名通常与它们提供的服务没什么关系,例如:你的主服务器的主机名可能是primary.mydomain.com,虽然它托管了应该web服务器叫做mystuff.mydomain.com。
注意:在Red Hat系统上,主机名是由/etc/sysconfig/network文件中的hostname变量指定的,在系统启动时就指定了主机名。(但是在系统运行时可以使用hostname命令修改主机名)
7.5 步骤3:配置/etc/ha.d/haresources
正常情况下/etc/ha.d/haresources文件将包括主服务拥有的资源的名字,Heartbeat通常使用来自你使用的发行版自带的开关(init)脚本来控制资源,或使用你自己建立的脚本,如第6章展示的iptakeover脚本,现在我们将使用一个非常简单的测试脚本查看它们是如何工作的,按照下面的步骤执行:
1、 在/etc/ha.d/haresource.d目录使用下面的命令建立一个名叫test1的脚本(这个脚本也包括在CD-ROM中的chapter7子目录中):
| #vi /etc/ha.d/resource.d/test1 |
| #!/bin/bash logger $0 called with $1 case "$1" in start) # Start commands go here ;; stop) # Stop commands go here ;; status) # Status commands go here ;; esac |
注意:这个脚本中的case语句不做任何事情,这里只是为你将来自己开发资源脚本时提供一个样本,以便可以处理start,stop,status参数。
3、 退出并保存你的改变(按ESC键,然后输入:wq)。
4、 使用下面的命令将这个脚本置为可执行:
| #chmod 755 /etc/ha.d/resource.d/test |
| #/etc/ha.d/resource.d/test start |
| #tail /var/log/messages |
| [timestamp] localhost root: /etc/ha.d/resource.d/test called with start |
配置haresources文件
你可以使用这个简单的测试脚本查看Heartbeat使用资源做什么,使用下面的命令查找并复制样本haresources文件到合适的位置:
| #rpm -qd heartbeat | grep haresources #cp /usr/share/doc/packages/heartbeat/haresources /etc/ha.d |
| primary.mydomain.com test |
haresources文件告诉Heartbeat程序哪个机器拥有某个资源,资源名实际上是/etc/init.d目录或/etc/ha.d/resource.d目录下的一个脚本。(这个脚本的副本必须同时存在于主服务器和备用服务器上)
Heartbeat使用haresources配置文件决定它首次启动时做些什么,例如:如果你指定httpd脚本(/etc/init.d/httpd)为一个资源,当你在主服务器上启动heartbeat守护进程时,Heartbeat将运行这个脚本并将start命令传递给它,如果你告诉Heartbeat停止(用命令/etc/init.d/heartbeat stop或service heartbeat stop),Heartbeat将运行/etc/init.d/httpd脚本并发送stop命令,因此,如果Heartbeat没有运行,资源守护进程(本例中是httpd)将也不会运行。
如果你使用一个之前存在的开关(init)脚本(来自/etc/init.d目录),确保要系统知道在启动时不启动这个脚本,使用chkconfig --del <脚本名>命令删除。(参考第1章了解chkconfig命令的详细信息)
注意:如果你不是使用的Red Hat或SuSE,你还应该确定在传递status参数给脚本时,应该返回OK,Running或running。参考第6章详细了解使用开关(init)脚本作为Heartbeat资源脚本的信息。
第8章中将涉及到haresources文件控制资源的能力和灵活性的论述。
使用Heartbeat重新启动守护进程
你可以告诉Heartbeat它每次启动时启动一个守护进程,如果该守护进程停止运行时就启动重新启动,要实现这样的功能,在/etc/ha.d/ha.cf中使用下面这样一行:
| respawn userid /usr/bin/mydaemon |
对于高可用守护进程正常情况下是从带有respawn选项的init启动的,要从主服务器故障转移到备用服务器(如类似Hylafax的串口通讯程序),你必须使用包括在Heartbeat包中的cl_respawn程序,或的包,如与Heartbeat联合使用的Daemontools(第8章中描述)。
[3]在一个好的高可用配置中,ha.cf,haresources和authkeys文件在主服务器和备用服务器上将是相同的。
7.6 步骤4:配置/etc/ha.d/authkeys
这一章中我将安装安全配置文件/etc/ha.d/authkeys,包括在Heartbeat中的样本配置文件需要修改以保护你的配置文件免受黑客攻击,具体步骤如下:
1、 使用下面的命令定位样本authkeys文件,并将其复制到适当的位置:
| #rpm -qd heartbeat | grep authkeys #cp /usr/share/doc/packages/heartbeat/authkeys /etc/ha.d |
| auth1 1 sha1 testlab |
在这个例子中,testlab是数字签名密钥,用于对心跳数据包进行数字签名,使用的是安全哈希算法1(sha1)作为数字签名算法,修改testlab为你创建的密码,并确定在两个系统上都是一样的。
3、 确保authkeys文件只能由root读取:
| #chmod 600 /etc/ha.d/authkeys |
7.7 步骤5:在备用服务器上安装Heartbeat
在备用服务器上安装Heartbeat的RPM包的方法与本章中“步骤1:安装Heartbeat”描述的一样,或使用第5章中描述的SystemImager克隆主服务器,然后在主服务器上执行下面的命令复制所有配置文件到备用服务器上:
| #scp -r /etc/ha.d backupnode:/etc/ha.d |
你第一次运行这个命令时,在开始复制前你需要确定是否运行连接,同时,如果你在主服务器上的SSH配置文件中没有插入备用服务器root账号的私钥,在备用服务器上将提示你输入root密码。(参考第4章了解关于SSH协议的详细信息)
7.8 步骤6:设置系统时间
由于Heartbeat不要求主服务器和备用服务器同步系统时间,它们之间可能会相差几分钟,某些高可用服务可能在某种环境下表现异常,因此在两个系统上启动Heartbeat前,你应该手动检查和设置系统时间(使用date命令)。
注意:长远来看,你应该使用NTP软件来同步两个系统的时钟。
7.9 步骤7:启动Heartbeat
在启动Heartbeat守护进程前,先在主服务器和备用服务器上运行下面的ResourceManager测试你设置的配置文件是正确的:
| #/usr/lib/heartbeat/ResourceManager listkeys `/bin/uname -n` |
| test |
只要你在主服务器上正确地配置了test资源脚本,启动Heartbeat程序,观察/var/log/messages文件里的记录确定发生了什么。
启动Heartbeat(在主服务器上)的命令可以是:
| #/etc/init.d/heartbeat start |
| #service heartbeat start |
| #tail /var/log/messages |
| #tail -f /var/log/messages |
注意:要改变Heartbeat使用其他的日志文件,只要将你的/etc/ha.d/ha.cf文件中下面这一行的注释符号取消掉就可以了。
| logfile /var/log/ha-log |
Heartbeat在它完成启动过程前将等待在/etc/ha.d/ha.cf文件中设置的initdead参数的值那么长时间,因此在Heartbeat启动好前你不得不等待至少2分钟(在这个测试配置文件中initdead被设置为120秒)。
当Heartbeat成功启动后,你应该查看/var/log/messages文件中的下列信息(我已经将每一行前面的时间戳信息移除了以便于阅读):
primary root: test called with status
primary heartbeat[4410]: info: **************************
primary heartbeat[4410]: info: Configuration validated. Starting heartbeat
primary heartbeat[4411]: info: heartbeat: version primary heartbeat[2882]: WARN: No Previous generation - starting at 1[5] primary heartbeat[4411]: info: Heartbeat generation: 1 primary heartbeat[4411]: info: UDP Broadcast heartbeat started on port 694 (694) interface eth1 primary heartbeat[4414]: info: pid 4414 locked in memory. primary heartbeat[4415]: info: pid 4415 locked in memory. primary heartbeat[4416]: info: pid 4416 locked in memory. primary heartbeat[4416]: info: Local status now set to: 'up' primary heartbeat[4411]: info: pid 4411 locked in memory. primary heartbeat[4416]: info: Local status now set to: 'active' primary logger: test called with status primary last message repeated 2 times primary heartbeat: info: Acquiring resource group: primary.mydomain.com test primary heartbeat: info: Running /etc/init.d/test start primary logger: test called with start primary heartbeat[4417]: info: Resource acquisition completed. primary heartbeat[4416]: info: Link primary.mydomain.com:eth1 up 注意:Heartbeat消息不会包括单词ERROR或CRIT(即使在故障转移过程中也不会出现),如果你从Heartbeat看到了ERROR或CRIT消息,你需要正确第做出解决这个问题的行动。 7.9.2 在备用服务器上启动Heartbeat 一旦主服务器上的Heartbeat运行起来后,登陆到备用服务器,使用下面的命令启动Heartbeat: backup heartbeat[4650]: info: ************************** backup heartbeat[4650]: info: Configuration validated. Starting heartbeat backup heartbeat[4651]: info: heartbeat: version backup heartbeat[4651]: info: Heartbeat generation: 9 backup heartbeat[4651]: info: UDP Broadcast heartbeat started on port 694 (694) interface eth1 backup heartbeat[4654]: info: pid 4654 locked in memory. backup heartbeat[4655]: info: pid 4655 locked in memory. backup heartbeat[4656]: info: pid 4656 locked in memory. backup heartbeat[4656]: info: Local status now set to: 'up' backup heartbeat[4651]: info: pid 4651 locked in memory. backup heartbeat[4656]: info: Link backup.mydomain.com:eth1 up. backup heartbeat[4656]: info: Node primary.mydomain.com: status active backup heartbeat: info: Running /etc/ha.d/rc.d/status status backup heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat backup heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat backup heartbeat[4656]: info: No local resources [/usr/lib/heartbeat/ ResourceManager listkeys backup.mydomain.com] backup.mydomain.com heartbeat[4656]: info: Resource acquisition completed 注意:所有在haresources中引用的资源脚本文件都必须存在,并且在Heartbeat启动前有执行它们的许可[6]。 7.9.3 检查主服务器上日志文件 现在,备用服务器启动并处于运行之中,主服务器上的Heartbeat应该被备用服务器检测心跳,在/var/log/messages文件的末尾你应该看到下面的内容: primary heartbeat[2886]: info: Heartbeat restart on node backup.mydomain.com primary heartbeat[2886]: info: Link backup.mydomain.com:eth2 up. primary heartbeat[2886]: info: Node backup.mydomain.com: status up primary heartbeat: info: Running /etc/ha.d/rc.d/status status primary heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat primary heartbeat[2886]: info: Node backup.mydomain.com: status active primary heartbeat: info: Running /etc/ha.d/rc.d/status status [4]本章的实验使用这个方法以便你可以使用单个命令就能从注意脚本中观察消息(tail -f /var/log/messages)。 [5]Heartbeat“代”号,Heartbeat每次启动该号码自动增加,如果Heartbeat注意到它的父服务器修改了代号,依据情况它能做出正确的反应。(例如:如果Heartbeat认为某个节点死掉了,然后接收到了来自相同节点的心跳,它将查看代号,如果代号没有增加,Heartbeat将认为处于隔离状态,并强制重启本地服务) [6]正常情况下,脚本文件属于用户root,它们有权限位,可以使用chmod 755 <脚本名>进行配置。 7.10 停止和启动Heartbeat 现在是实践在主服务器和备用服务器上启动和停止Heartbeat查看会发生什么的好时机。 在主服务器上停掉Heartbeat,可以使用命令: backup.mydomain.com heartbeat[5725]: WARN: node primary.mydomain.com: is dead backup.mydomain.com heartbeat[5725]: info: Link primary.mydomain.com:eth1 dead. backup.mydomain.com heartbeat: info: Running /etc/ha.d/rc.d/status status backup.mydomain.com heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat backup.mydomain.com heartbeat: info: Taking over resource group test *** /etc/ha.d/resource.d/test called with status backup.mydomain.com heartbeat: info: Acquiring resource group: primary.mydomain. com test backup.mydomain.com heartbeat: info: Running /etc/ha.d/resource.d/test start *** /etc/ha.d/resource.d/test called with start backup.mydomain.com heartbeat: info: mach_down takeover complete /etc/ha.d/resource.d/test资源或脚本首先用status参数调用,然后用start参数完成故障转移。 一旦你执行了这些测试,你可能还想测试其他的启动一个故障转移的方法(如拔出主服务器的电源或网络连接)。 注意:如果心跳数据包继续抵达备用服务器将不会发生故障转移,因此,如果你在/etc/ha.d/ha.cf文件中为心跳指定了两条路径(如一条没有moden的串口线和一条交叉网线),拔出其中一条物理路径将不会引发故障转移,只有两条物理路径都不通时才会由备用服务器启动故障转移。 [7]假设你已经启用了auto_failback,它将在第9章中论述。 7.11 监视资源 Heartbeat目前不监视它启动的资源,查看它们是否正在运行,健康状态如何,以及客户端计算机是否能够抵达,要监视这些资源,你需要使用一个的软件包,叫做Mon(第17章中会详细讨论)。 一些系统管理员将Heartbeat放在它们的生产网络中,使用单个网络传输心跳数据包,客户端计算机也使用这个网络访问资源,听起来好像是个好主意,因为主计算机的连接失效意味着客户端计算机不能访问资源,故障转移到备用服务器可能恢复对资源的访问,然而,这种故障转移可能是不需要的(如果问题出在网络而不是主服务器),它可能不会产生任何的改进,或者,情况更糟糕,它可能导致一个隔离状态。 例如:如果资源共享一块SCSI磁盘,如果与备用服务器之间的生产网线断开,将引发一个隔离状态,意味着这两个服务器不能正确判断谁有独占写入共享磁盘的权限,可能破坏掉共享分区上的数据,按照高可用设计原则,如果主服务器不再健康,Heartbeat应该只故障转移到备用服务器,在生产网络中仅使用一条路径是一个坏的实践,应该避免。 注意:正常情况下,使用Heartbeat软件包的唯一理由是确保独占访问运行在单个计算机上的资源,如果服务同时可以由多台计算机提供(独占访问不是必须的),你应该避免Heartbeat高可用故障转移配置的复杂性。 7.12 本章小结 本章是一个“test”资源脚本说明Heartbeat如何启动一个资源,以及主服务器出现故障时如何转移到备用服务器,我们用了三个配置文件/etc/ha.d/ha.cf,,/etc/ha.d/haresources和 /etc/ha.d/authkeys查看了样本配置,这些配置文件在主服务器和备用服务器上应该总是相同的,避免冲突和Heartbeat错误的行为。 Heartbeat软件包被设计为主服务器不再健康时将所有资源转移到备用服务器,最佳实践指导我们应该为心跳状态消息建立多条物理路径,以避免不必要的故障转移,不要在生产环境中在主服务器和备用服务器之间为心跳消息只使用一条路径。 本章中的例子不包括ip地址作为资源的一部分的配置,因此没有使用ARP欺骗广播,也没有测试客户端计算机连接到服务器上运行的服务。 只要你测试了本章描述的资源故障转移(以及知道资源脚本是如何调用Heartbeat程序的),你就可以在/etc/ha.d/haresources文件中插入ip地址(或第6章中引入的iptakeover脚本),这是第8章要讨论的主题,关于/etc/ha.d/haresources文件更详细的论述。
本章早先创建的test脚本在加了status参数时没有返回单词OK,Running或running,因此Heartbeat认为守护进程没有运行,并使用参数start运行这个脚本以获得test资源(至此它没有真正做过任何事情),可以在先前的输出中看到,注意这一行:
Heartbeat警告你备用服务器死掉了,因为备用服务器上的heartbeat守护进程还没有启动。primary.mydomain.com heartbeat[2886]: WARN: node backup.mydomain.com: is dead
备用服务器上的/var/log/messages应该很快就包括下面的内容了:# /etc/init.d/heartbeat start
注意这个输出中Heartbeat声明这台机器(备用服务器)在/etc/ha.d/haresources文件中没有任何本地资源,这台机器将充当备用服务器,保持空闲状态,简单地监听来自主服务器的心跳,直到服务器失效,Heartbeat不需要运行test脚本(/etc/ha.d/resource.d/test), Resource acquisition completed消息有点容易使人误解,因为Heartbeat还没有获得资源。
如果主服务器没有自动认出备用服务器正在运行,检查并确定这两台机器都处于同一个网络之中,它们有相同的广播地址,没有防火墙规则过滤掉数据包。(在两个系统上使用ifconfig命令并对比bcast数字,两个系统上的数字应该相同),如果心跳广播抵达了这两个节点,你也可以使用tcpdump命令:
这个命令应从主服务器或备用服务器该捕获并显示心跳广播数据包。#tcpdump -i all -n -p udp port 694
或者#/etc/init.d/heartbeat stop
你应该看到备用服务器宣布主服务器已经失效了,然后它将加start参数运行/etc/ha.d/resource.d/test脚本,备用服务器上的/var/log/messages文件看起来象:#service heartbeat stop
一旦完成,尝试再次启动主服务器上的Heartbeat,并观察发生了什么,备用服务器上的test脚本应该调用stop参数,主服务器上应该调用start参数。[7]
