Heartbeat 是一款强大的集群管理工具,提供了诸如消息传递、节点成员身份管理、IP 地址分配和迁移等功能。它广泛用于构建高可用性的企业级应用系统,如 Apache、Samba 和 Squid 等。此外,Heartbeat 可以与负载均衡软件结合使用,实现入站请求的分散处理。

本文将以一个包含三台运行 Heartbeat 的服务器组成的示例集群为例,介绍如何测试其故障切换机制。以下是测试拓扑结构:

构建高可用性Apache集群的Heartbeat使用指南

为了确保服务的连续性,Heartbeat 会将指定的 IP 地址分配给主服务器上的虚拟网络接口卡(NIC)。如果主服务器出现故障,IP 地址会自动切换到另一台可用服务器上的虚拟 NIC。当主服务器恢复后,IP 地址会再次切换回主服务器。这种特性使得该 IP 地址被称为“浮动”地址。

在所有服务器上安装必要的软件包

首先,使用 yum 在每个节点上安装所需的软件包:

yum install PyXML cluster-glue cluster-glue-libs resource-agents

接下来,下载并安装两个 Heartbeat 的 RPM 文件,这些文件可能不在官方 CentOS 软件库中:

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-3.0.4-2.el6.x86_64.rpm
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/heartbeat-libs-3.0.4-2.el6.x86_64.rpm
rpm -ivh heartbeat-*

或者,你可以将 EPEL 软件库添加到源文件中,并使用 yum 进行安装。

由于 Heartbeat 将管理 Apache 的 httpd 服务的启动和停止,因此需要停止 Apache 并禁用其自动启动:

service httpd stop
chkconfig httpd off

设置主机名称

编辑每个系统上的 /etc/sysconfig/network 文件,更改 HOSTNAME 这一行:

HOSTNAME=serverX.example.com

使用 hostname 命令立即应用新的主机名称,无需重启服务器:

hostname serverX.example.com

在每一台服务器上运行 uname -n,以确认主机名称已正确设置。

配置 Heartbeat

将 Heartbeat 的默认配置文件从 /usr 复制到 /etc/ha.d/ 目录下:

cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/
cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/

修改所有集群节点上的这三个文件,以满足你的需求。

authkeys 文件包含集群节点之间通信所需的预共享密码。每个 Heartbeat 消息都包含该密码,节点只会处理带有正确密码的消息。Heartbeat 支持 SHA1 和 MD5 密码。在 authkeys 文件中,以下指令将验证方法设置为 SHA1,并定义了使用的密码:

auth 2
2 sha1 pre-shared-password

保存文件并使用 chmod 600 /etc/ha.d/authkeys 为其设置适当的权限。

在 ha.cf 文件中,定义计时器、集群节点、消息传递机制和其他设置:

## 日志
logfile /var/log/ha-log
logfacility local0

## 计时器
## 所有计时器以秒为单位。如需以毫秒为单位设置时间,使用 'ms'。
keepalive 2
## 节点被认为已停滞的时间
deadtime 15
## 证实服务器宕机前等待的额外时间
initdead 120

## 消息传递参数
udpport 694
bcast eth0
## 你还可以使用多播或单播

## 节点定义
## 确保主机名称符合 uname -n
node server1.example.com
node server2.example.com
node server3.example.com

haresources 文件包含 Heartbeat 认为主节点的服务器主机名称、浮动 IP 地址和高可用性服务的脚本名称。该文件在所有服务器上必须一致。主节点正常运行时,它会处理所有请求;Heartbeat 会停止其他节点上的高可用性服务。当主节点故障时,Heartbeat 会在下一个可用节点上自动启动服务。主节点恢复后,Heartbeat 会再次将其设置为主节点。例如,定义 server1.example.com 为主服务器,192.168.56.200 为浮动 IP 地址,httpd 为高可用性服务:

server1.example.com 192.168.56.200 httpd

配置文件准备好后,启动 Heartbeat 服务并将其添加到系统启动项:

service heartbeat start
chkconfig heartbeat on

使用 tailf /var/log/ha-log 命令密切关注 Heartbeat 日志。

Heartbeat 可用于管理多项服务。例如,以下指令将让 Heartbeat 同时管理 Apache 和 Samba 服务:

server1.example.com 192.168.56.200 httpd smb nmb

但是,除非你使用 Pacemaker 之类的集群资源管理器(CRM),否则不建议在一个集群中管理多项服务。如果没有 Pacemaker,Heartbeat 仅通过 IP 地址监测集群节点的状态,而不会关注服务在节点上的实际运行情况。

测试

设置并运行 Heartbeat 后,对其进行测试。在每台服务器上创建单独的 index.html 文件,以便确定哪台服务器正在提供页面。访问 192.168.56.200 或相应的域名,页面应从 server1.example.com 加载。查看 server1 的 Apache 日志文件以确认这一点。刷新页面,确保每次都是从同一台服务器加载。

如果一切正常,测试故障切换机制:停止 server1.example.com 上的 Heartbeat 服务。浮动 IP 地址应迁移到 server2,页面应从该服务器加载。查看 server2 的 Apache 日志文件以确认这一点。如果也停止 server2 上的服务,页面应从唯一的可用节点 server3.example.com 加载。重新启动 server1 和 server2 上的服务后,浮动 IP 地址应根据 haresources 中的设置,从活动节点迁移到 server1。

如你所见,使用 Heartbeat 在 CentOS 下构建高可用性的 Apache 集群非常简单。虽然本文使用了三台服务器,但 Heartbeat 对节点数量没有限制,可以根据需要扩展集群规模。