Heartbeat 入门

作者:Daniel Bartholomew

在我参与过的每个工作环境中,总有一些服务器是绝对必须保持运行的,以确保业务顺利进行。这些服务器提供的服务始终需要可用,无论是数据库、DHCP、DNS、文件、Web、防火墙还是邮件服务器。

任何需要始终保持运行且无停机服务的基石,都是能够优雅地将服务从一个系统转移到另一个系统。在 Linux 上实现这一点的神奇之处在于一项名为 Heartbeat 的服务。Heartbeat 是高可用性 Linux 项目的主要产品。

Heartbeat 非常灵活且功能强大。在本文中,我仅涉及具有两个成员的基本主/被集群,其中主服务器提供服务,而被动服务器等待在必要时接管。

安装 Heartbeat

Debian、Fedora、Gentoo、Mandriva、Red Flag、SUSE、Ubuntu 和其他发行版在其存储库中都有预构建的软件包。检查您的发行版的主要和补充存储库中是否有名为 heartbeat-2 的软件包。

安装预构建软件包后,您可能会看到“Heartbeat failure”消息。这是正常的。安装 Heartbeat 软件包后,软件包管理器会尝试启动 Heartbeat 服务。但是,该服务尚未具有有效的配置,因此服务启动失败并打印错误消息。

您也可以手动安装 Heartbeat。要获得最新的稳定版本,可能需要从源代码编译。有一些依赖项,因此为了在我的 Ubuntu 系统上做好准备,我首先运行以下命令

sudo apt-get build-dep heartbeat-2

查看 Linux-HA 网站以获取完整的依赖项列表。解决依赖项问题后,下载最新的源代码 tarball 并解压缩。使用 ConfigureMe 脚本来编译和安装 Heartbeat。此脚本通过查看您的环境,对如何最好地配置和安装 Heartbeat 进行有根据的猜测。它还使用一个命令完成所有操作,如下所示

sudo ./ConfigureMe install

运气好的话,您可以离开几分钟,当您回来时,Heartbeat 将在集群中的每个节点上编译并安装完成。

配置 Heartbeat

Heartbeat 有三个主要的配置文件

  • /etc/ha.d/authkeys

  • /etc/ha.d/ha.cf

  • /etc/ha.d/haresources

authkeys 文件必须归 root 用户所有,并且权限设置为 chmod 600。authkeys 文件的实际格式非常简单;它只有两行。有一条带有相关方法 ID 号的 auth 指令,还有一行包含身份验证方法和与 auth 指令的 ID 号相对应的密钥。支持三种身份验证方法:crc、md5 和 sha1。列表 1 显示了一个示例。您可以拥有多个身份验证方法 ID,但这仅在您更改身份验证方法或密钥时有用。使密钥足够长——这将提高安全性,而且您不必再次键入密钥。

列表 1. /etc/ha.d/authkeys 文件

auth 1
1 sha1 ThisIsAVeryLongAndBoringPassword
ha.cf 文件

下一个要配置的文件是 ha.cf 文件——主要的 Heartbeat 配置文件。此文件的内容在所有节点上都应相同,但有几个例外。

Heartbeat 在文档目录中附带了一个详细的示例文件,非常值得一看。此外,在创建 ha.cf 文件时,其中内容的出现顺序很重要。不要随意移动它们!列表 2 和 3 显示了两个不同的 ha.cf 示例文件。

列表 2. Briggs & Stratton 上的 /etc/ha.d/ha.cf 文件

keepalive 2
deadtime 32
warntime 16
initdead 64
baud 19200
# On briggs the serial device is /dev/ttyS1
# On stratton the serial device is /dev/ttyS0
serial /dev/ttyS1
auto_failback on
node briggs
node stratton
use_logd yes

列表 3. Deimos & Phobos 上的 /etc/ha.d/ha.cf 文件

keepalive 1
deadtime 10
warntime 5
udpport 694
# deimos' heartbeat ip address is 192.168.1.11
# phobos' heartbeat ip address is 192.168.1.21
ucast eth1 192.168.1.11
auto_failback off
stonith_host deimos wti_nps ares.example.com erisIsTheKey
stonith_host phobos wti_nps ares.example.com erisIsTheKey
node deimos
node phobos
use_logd yes

您需要指定的第一个内容是 keepalive——心跳之间的间隔时间,以秒为单位。我通常喜欢将其设置为一秒或两秒,但负载重的服务器可能无法及时发送心跳。因此,如果您看到很多关于心跳延迟的警告,请尝试增加 keepalive。

接下来是 deadtime。这是在没有收到集群成员心跳的情况下等待的时间,超过此时间后,幸存的阵列成员将声明问题主机已死亡。

接下来是 warntime。此设置确定在发出“心跳延迟”警告之前等待多长时间。

有时,当集群的所有成员同时启动时,在 Heartbeat 启动到网络或串行接口准备好发送和接收心跳之间会有一段相当长的时间。可选的 initdead 指令通过设置仅在 Heartbeat 首次启动时应用的初始 deadtime 来解决此问题。

您可以通过串行或以太网链路发送心跳——两者都可以正常工作。对于物理位置靠近的两个服务器集群,我喜欢使用串行,但以太网也同样有效。串行端口的配置很简单;只需指定波特率,然后指定您正在使用的串行设备。串行设备是每个节点上的 ha.cf 文件可能不同的地方之一,因为串行端口在每个主机上的名称可能不同。如果您不知道串行端口分配给哪个 tty,请运行以下命令

setserial -g /dev/ttyS*

如果输出中的任何内容显示“UART: unknown”,则该设备不是真正的串行端口。如果您有多个串行端口,请尝试找出哪个是正确的端口。

如果您决定使用以太网,您有多种配置方式可供选择。对于简单的双服务器集群,ucast(单播)或 bcast(广播)效果良好。

ucast 行的格式为

ucast <device> <peer-ip-address>

这是一个例子

ucast eth1 192.168.1.30

如果我使用交叉电缆将两台主机连接在一起,我只需通过相应的接口广播心跳即可。这是一个 bcast 行的示例

bcast eth3

还有一种更复杂的方法称为 mcast。此方法使用多播来发送心跳消息。有关完整详细信息,请查看 Heartbeat 文档。

现在我们已经解决了 Heartbeat 传输的所有问题,我们可以定义 auto_failback。您可以将 auto_failback 设置为 on 或 off。如果设置为 on 且主节点发生故障,则当主节点返回时,辅助节点将“故障恢复”到其辅助备用状态。如果设置为 off,当主节点返回时,它将成为辅助节点。

使用哪个设置取决于具体情况。我的想法是,只要服务器是相同的,如果我的主节点发生故障,则辅助节点将成为主节点,而当先前的主节点返回时,它将成为辅助节点。但是,如果我的辅助服务器不如主服务器强大,就像我汽车中的备用轮胎不是“真正的”轮胎一样,我希望主服务器在返回后立即再次成为主服务器。

继续说,当 Heartbeat 认为节点已死亡时,这只是一种最佳猜测。“死亡”服务器可能仍在运行。在某些情况下,如果“死亡”服务器仍然部分运行,则对其他节点成员来说后果是灾难性的。有时,只有一种方法可以确定节点是否已死亡,那就是杀死它。这就是 STONITH 的用武之地。

STONITH 代表 Shoot The Other Node In The Head(射杀另一节点)。STONITH 设备通常是某种网络电源控制设备。要查看受支持的 STONITH 设备类型的完整列表,请使用stonith -L命令,并使用stonith -h查看如何配置它们。

接下来,在 ha.cf 文件中,您需要列出您的节点。每行列出一个节点,如下所示

node deimos
node phobos

您使用的名称必须与以下命令的输出匹配uname -n.

我的 ha.cf 示例文件中的最后一项是启用日志记录

use_logd yes

还有许多其他选项在这里无法一一介绍。有关详细信息,请查看文档。

haresources 文件

第三个配置文件是 haresources 文件。在配置它之前,您需要进行一些清理工作。即,您希望 Heartbeat 管理的所有服务都必须从所有初始化级别的系统 init 中删除。

在 Debian 风格的发行版上,命令是

/usr/sbin/update-rc.d -f <service_name> remove

查看您的发行版文档,了解如何在您的节点上执行相同的操作。

现在,您可以将服务放入 haresources 文件中。与 Heartbeat 的其他两个配置文件一样,此文件可能不会很大。与 authkeys 文件类似,haresources 文件必须在每个节点上完全相同。并且,与 ha.cf 文件一样,位置在此文件中非常重要。当控制权转移到某个节点时,haresources 文件中列出的资源将从左到右启动,而当控制权转移到另一个节点时,资源将从右到左停止。以下是基本格式

<node_name> <resource_1> <resource_2> <resource_3> . . .

node_name 是您希望在集群初始启动时成为主节点的节点,如果您启用了 auto_failback,则此服务器始终会在启动时成为主节点。节点名称必须与 ha.cf 文件中列出的节点之一的名称匹配。

资源是位于 /etc/ha.d/resource.d/ 或 /etc/init.d/ 中的脚本,如果您想创建自己的资源脚本,它们应该符合 LSB 风格的 init 脚本,例如 /etc/init.d/ 中的脚本。resource.d 文件夹中的某些脚本可以接受参数,您可以使用资源行上的 :: 传递参数。例如,IPAddr 脚本设置集群 IP 地址,您可以像这样指定它

IPAddr::192.168.1.9/24/eth0

在上面的示例中,IPAddr 资源被告知设置集群 IP 地址为 192.168.1.9,子网掩码为 24 位 (255.255.255.0),并将其绑定到 eth0。您也可以传递其他选项;有关更多信息,请查看 Heartbeat 附带的示例 haresources 文件。

另一个常见的资源是 Filesystem。此资源用于挂载共享文件系统。这是一个例子

Filesystem::/dev/etherd/e1.0::/opt/data::xfs

上面示例中 Filesystem 资源的参数从左到右依次为:设备节点(在本例中为 ATA-over-Ethernet 驱动器)、挂载点 (/opt/data) 和文件系统类型 (xfs)。

对于 /etc/init.d/ 中的常规 init 脚本,只需按名称输入它们即可。只要它们可以用start启动,并用stop停止,它们很有可能可以工作。

列表 4 和 5 是我运行的两个集群的 haresources 文件。它们分别与列表 2 和 3 中的 ha.cf 文件配对。

列表 4. 极简主义的 haresources 文件

stratton 192.168.1.41 apache2

列表 5. 更为实质性的 haresources 文件

deimos \
        IPaddr::192.168.12.1 \
        Filesystem::/dev/etherd/e1.0::/opt/storage::xfs \
        killnfsd \
        nfs-common \
        nfs-kernel-server

列表 2 和 4 中定义的集群非常简单,它只有两个资源——一个集群 IP 地址和 Apache 2 Web 服务器。我将此用于我的个人家庭 Web 服务器集群。服务器本身没有什么特别之处——一台旧的 PIII 塔式机和一台废弃的笔记本电脑。服务器上的内容是静态 HTML,内容通过每小时的 rsync cron 作业保持同步。我不太信任这两个“服务器”,但有了 Heartbeat,我从未遇到过超过半秒的停机时间——对于两个旧的弃用设备来说还不错。

列表 3 和 5 中定义的集群稍微复杂一些。这是我在工作中管理的 NFS 集群。此集群利用共享存储,形式为一对 Coraid SR1521 ATA-over-Ethernet 驱动器阵列、两个 NFS 设备(也来自 Coraid)和一个 STONITH 设备。STONITH 对于此集群非常重要,因为在发生故障时,我需要确保另一个设备确实已死亡,然后才能在另一个节点上挂载共享存储。此集群中管理着五个资源,为了防止 haresources 中的行太长而难以阅读,我使用行继续斜杠将其断开。如果主集群成员遇到问题,则辅助集群会杀死主集群,接管 IP 地址,挂载共享存储,然后启动 NFS。有了这个集群,停机时间现在不会超过一两秒,而不是以前的维护问题或其他持续几分钟到一小时(或更长时间)的停机时间。我可以接受这一点。

故障排除

现在您的集群已全部配置完成,使用以下命令启动它

/etc/init.d/heartbeat start

事情可能会完美运行,也可能根本无法运行。幸运的是,启用日志记录后,故障排除很容易,因为 Heartbeat 会输出信息丰富的日志消息。Heartbeat 甚至会告诉您之前的日志消息是否是不必担心的事情。当启动新的集群时,我通常会打开一个 SSH 终端连接到每个集群成员,并使用以下命令跟踪消息文件

tail -f /var/log/messages

然后,在单独的终端中,我启动 Heartbeat。如果出现任何问题,通常很容易发现它们。

Heartbeat 还附带非常好的文档。每当我遇到问题时,这些文档都非常宝贵。在我的系统上,它位于 /usr/share/doc/ 目录下。

结论

我在这里仅仅触及了 Heartbeat 功能的冰山一角。幸运的是,存在大量资源可以帮助您了解 Heartbeat 的更高级功能。这些功能包括具有 N 个节点的 主/被 和 主/主 集群、DRBD、集群资源管理器等。现在您已经入门了,希望您不会像我刚开始学习 Heartbeat 时那样感到害怕。但是请注意,否则您可能会像我一样最终想要集群化一切。

资源

高可用性 Linux 项目: www.linux-ha.org

Heartbeat 主页: www.linux-ha.org/Heartbeat

Heartbeat 版本 2 入门: www.linux-ha.org/GettingStartedV2

Heartbeat 入门截屏视频: linux-ha.org/Education/Newbie/InstallHeartbeatScreencast

Linux-HA 邮件列表: lists.linux-ha.org/mailman/listinfo/linux-ha

Daniel Bartholomew 自 1980 年代初他的父母购买了一台 Apple IIe 以来就开始使用计算机。在 Mac 和 Windows 机器上工作了一段时间后,他在 1996 年发现了 Linux,并从此一直使用各种发行版。他和妻子及孩子们住在北卡罗来纳州。

加载 Disqus 评论