Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache Web 服务器

阅读更多

维持最长的系统正常运行时间对随需应变计算的成功来说越来越重要。不幸的是,很多现成即用(off-the-shelf)的高可用性(high availability,HA)解决方案 价格昂贵,而且需要专门技术。本系列的 5 篇文章将提供一个使用公开可用软件获得 HA 服务的廉价替代方案。

本系列中的详尽步骤将展示如何在 Linux™ 上构建一个高可用性的 Apache Web 服务器、WebSphere® MQ 队列管理器、LoadLeveler 群集、WebSphere Application Server 群集和 DB2® Universal Database。 系统管理员可以投入最少的时间来学习如何使用和维护这个系统。本系列讲述的技术也适用于 Linux 上的很多服务。

为了最有效地利用本系列,您应该对 WebSphere MQ、WebSphere Application Server、IBM LoadLeveler、 DB2 Universal Database 以及高可用性群集有基本的了解。

简介

在业务关键型或任务关键型环境中使用任何软件产品,都需要考虑 可用性,这是对系统完成其应该完成的任务(甚至是在出现崩溃、设备故障和环境 灾难的情况下)的能力的度量。随着越来越多商业关键型应用程序转移到 Internet 上,提供高可用性服务 变得日趋重要。

本文将重点介绍实现 HA 解决方案时可能会遇到的一些实现问题。我们将回顾 HA 的概念、可用的 HA 软件、要使用的硬件, 以及关于 heartbeat(用于 Linux 的开源 HA 软件)的安装和配置细节,而且我们将查看如何通过 heartbeat 使 Web 服务器变得高度可用。


硬件要求

本系列中描述的测试场景需要以下硬件:

  • 4 个装有以太网网络适配器的、支持 Linux 的系统。
  • 一个共享的外部 SCSI 磁盘驱动器(双硬盘)。
  • 一根 IBM 串口直连线缆(serial null modem cable)。

在我的设置中,我使用的是内存为 1 GB 的 IBM eServer™ xSeries® 335 机器。至于共享磁盘,我将 这些机器中的一台用作 NFS 服务器。完成安装所需要的软件如下所示,尽管对本文来说,只需安装 Red Hat Enterprise Linux 和 heartbeat 即可:

  • Red Hat Enterprise Linux 3.0(2.4.21-15.EL)
  • heartbeat 1.2.2
  • IBM Java 2 SDK 1.4.2
  • 安装了 Fix Pack 7 的 WebSphere MQ for Linux 5.3.0.2
  • LoadLeveler for Linux 3.2
  • 安装了 Cumulative Fix 1 的 WebSphere Base Edition 5.1.1 for Linux
  • 安装了 Fixpack 1 的 WebSphere ND 5.1 for Linux
  • DB2 Universal Database Enterprise Server Edition 8.1 Linux

下载后面 下载部分中列出的代码包,就可以得到该测试场景。表 1 描述了 hahbcode.tar.gz 中的目录。

表 1. 示例代码包中有哪些内容

toptoptoptoptoptoptop

目录            内容
heartbeat heartbeat 的示例配置文件
www 测试用于 Apache Web 服务器的 HA 的 HTML 文件
mq 用于 WebSphere MQ HA 的脚本和代码:
  • mqseries:将 WebSphere MQ 队列管理器和其他进程作为一项 Linux 服务来启动和停止的脚本
  • hascript:创建 HA 队列管理器的脚本
  • send(sh/bat):向队列添加数据的脚本
  • receive(sh/bat):从队列浏览/获得数据的脚本
loadl 将 LoadLeveler 作为一项 Linux 服务来启动和停止的脚本
was 用于 WebSphere 应用服务器 HA 的脚本和文件:
  • wasdmgr:将 WebSphere ND Deployment Manager 作为一项 Linux 服务来启动和停止的脚本
  • wasnode:将 WebSphere Node Agent 作为一项 Linux 服务来启动和停止的脚本
  • wasserver:将 WebSphere Application Server 作为一项 Linux 服务来启动和停止的脚本
  • sample_ver_(1/2/3):包含有用于测试 WebSphere HA 的不同版本的示例企业应用程序
db2 检查数据库可用性、创建表、向表中插入行并从表中选择 行的脚本

高可用性的概念

高可用性 是在系统、组件或者应用程序发生故障时快速恢复基本服务的系统管理策略。其目的是最大程度地减少服务中断,而不是容错。用来解决关键商务操作的系统执行故障的最常见解决方案是,使用另一个系统来 等待并接管出故障的系统的负载,使商务操作继续进行下去。

术语“群集(cluster)”在不同的计算领域有着不同的含义。除非另外指明,否则本文中的 群集 都是指 heartbeat 群集,它是协作提供运行于群集内的高可用性服务的节点和资源(比如磁盘和网络)的一个集合。 如果这些机器中的一台出了故障,那么保持商业操作所需要的资源会转移到群集中另一台可用机器上。

两种主要的群集配置是:

  • 备份(standby)配置:最基本的群集配置,在这种配置中,由一个节点执行任务,另一个节点只是作为备份。备份 节点不执行任务,被认为是 空闲的(idle);这种配置有时被称为 冷备份(cold standby)。 这样的配置需要高度的硬件冗余。 本系列文章关注的重点是冷备份配置。
  • 接管(Takeover)配置:一种更高级的配置,在这种配置中,所有节点都执行同类任务,在某个节点出现故障时, 关键任务可以被接管。在 单边(one-sided)接管 配置中,备份节点执行一些附加的、不关键的、不可移动的任务。 在 相互接管(mutual takeover) 配置中,所有节点都执行高可用性(可移动的)任务。本系列文章没有介绍接管配置。

在建立一个高可用性群集时,必须为一些关键条目制定计划:

  • 用于存储数据的硬盘必须通过私有互联结构(串行线缆)或者 LAN 连接到构成群集的服务器。
  • 必须有自动检测出故障的资源的方法。这项任务由称为 心跳监控器(heartbeat monitor) 的软件组件来完成。
  • 在出故障时,资源所有者必须能被自动转换为一个或更多正在工作的群集成员。

可用的 HA 软件

很多当前可用的软件都具备心跳监测和资源接管的功能。这里是可以用于不同操作系统的构建高可用性群集的软件列表 (请参阅 参考资料中的链接):

  • heartbeat(Linux)
  • High Availability Cluster Multiprocessing - HACMP(AIX)
  • IBM Tivoli System Automation for Multiplatforms(AIX、Linux)
  • Legato AAM 5.1(AIX、HP-UX、Solaris、Linux 和 Windows)
  • SteelEye LifeKeeper(Linux、Windows)
  • Veritas Cluster Server(AIX、HP-UX、Solaris、Linux 和 Windows)

本系列介绍的是开源 HA 软件 heartbeat。不过,您可以将在这学到的概念应用于上面的任意软件系统。


High-Availability Linux 项目和 heartbeat

名为 High-Availability Linux 的开源项目的目标是,通过社区开发努力提供一个提升 Linux 可靠性(reliability)、 可用性(availability)和可服务性(serviceability)(RAS)的群集解决方案。Linux-HA 项目得到了广泛的应用,是很多有 趣的高可用性解决方案的重要组成部分。

heartbeat 是可以从 Linux-HA 项目 Web 站点公开获得的软件包之一。它提供了所有 HA 系统所需要的基本功能,比如 启动和停止资源、监测群集中系统的可用性、在群集中的节点间转移共享 IP 地址的所有者等。它通过串行线、以太网接口 或者同时使用二者来监测特定服务(或多个服务)的健康状况。当前版本支持两节点配置,使用专门的 heartbeat“pings”来检查 服务的状态和可用性。heartbeat 为比本文中所描述的更复杂的情形提供了基础,比如 active/active 配置,该配置中 两个节点是并行工作的,负责完成负载平衡。

要获得更多关于将 heartbeat 和项目应用在什么地方的资料,请访问 Linux-HA 项目的 Web 站点 (请参阅 参考资料中的链接)。


群集配置

这些文章中测试使用的群集配置如图 1 所示。该设置包括一对构成群集服务器(ha1 和 ha2),两者都可以访问包含多个物理 磁盘的磁盘盒;服务器处于冷备份模式。应用程序数据需要位于两个节点都可访问的共享设备上。该设备可以是一个共享磁盘,或者网络 文件系统。为了防止数据被破坏,设备本身应该被镜像或者具有数据保护。这种配置经常被称作 共享磁盘群集,不过,实际 上,这是一个什么都不共享的体系结构,因为在同一时刻任何磁盘都只能被一个节点访问。

图 1. 产品环境中的 heartbeat 群集配置

Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache Web 服务器_第1张图片

在测试设置中,我使用的共享磁盘机制是 NFS,如图 2 所示,不过,我建议使用如图 1 所示的选项,尤其是在产品环境中时。 两个系统的串口之间的直连线缆用来在两个节点间传输 heartbeat。

图 2. 使用 NFS 作为共享文件系统的 heartbeat 群集配置

Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache Web 服务器_第2张图片

表 2 给出的是我所使用的两个节点的配置。在本例中,可以通过 DNS 或者两个节点上的 /etc/hosts 文件 得到主机名和 IP 地址。

表 2. 测试群集配置

toptoptoptoptoptop

角色 主机名 IP 地址
共享(群集) ha.haw2.ibm.com 9.22.7.46
Node1(主) ha1.haw2.ibm.com 9.22.7.48
Node2(备份) ha2.haw2.ibm.com 9.22.7.49
Node 3(未知) ha3.haw2.ibm.com 9.23.7.50
NFS 服务器 hanfs.haw2.ibm.com 9.2.14.175

建立串行连接

通过两个节点的串口,使用一根直连线缆将它们连接起来。现在测试串行连接,如下所示:

在 ha1(接收者)上输入以下内容:


cat < /dev/ttyS0

在 ha2(发送者)上输入以下内容:


echo "Serial Connection test" > /dev/ttyS0

您应该会在接收者节点(ha1)上看到这些文本。如果成功,那么互换它们的角色,重新再试一次。


建立用作共享文件系统的 NFS

如前所述,在测试设置中,我使用 NFS 在节点间共享数据。

  • 节点 nfsha.haw2.ibm.com 用作 NFS 服务器。
  • 文件系统 /ha 是共享的。

要设置并运行 NFS,需要执行以下操作:

  1. 在 nfsha 节点上创建 /ha 目录。
  2. 编辑 /etc/exports 文件。文件包含一个条目列表;每一个条目都指明一个卷是否是共享的,以及它是如何共享的。 清单 1 展示了我的设置中 exports 文件的相关部分。

    清单 1. exports 文件
    ...
    /ha 9.22.7.48(rw,no_root_squash)
    /ha 9.22.7.46(rw,no_root_squash)
    /ha 9.22.7.35(rw,no_root_squash)
    /ha 9.22.7.49(rw,no_root_squash)
    /ha 9.22.7.50(rw,no_root_squash)
    ...
  3. 启动 NFS 服务。如果 NFS 已经在运行,那么您应该运行 /usr/sbin/exportfs -ra 命令,让 nfsd 重新读取 /etc/exports 文件。
  4. 在两个 HA 节点(ha1 和 ha2)上,像添加本地文件系统那样将文件系统 /ha 添加到 /etc/fstab 文件中。清单 2 展示了在我的设置中 fstab 文件的相关部分:

    清单 2. fstab 文件
    ...
    nfsha.haw2.ibm.com:/ha    /ha    nfs    noauto,rw,hard 0 0
    ...

    稍后,我们将配置 heartbeat 来安装该文件系统。

  5. 使用清单 3 中所示的命令在该文件系统上对代码示例 hahdcode.tar.gz 进行解压缩。 (首先通过下面的 下载部分下载代码示例。)

    清单 3. 解开示例代码
    cd /ha
    tar  xvfz  hahbcode.tar.gz

下载并安装 heartbeat

通过 参考资料中的链接下载 heartbeat,然后输入清单 4 中的命令,在 ha1 和 ha2 这两台 机器上安装它(按照给出的顺序)。

清单 4. 安装 heartbeat 的命令
rpm -ivh heartbeat-pils-1.2.2-8.rh.el.3.0.i386.rpm
rpm -ivh heartbeat-stonith-1.2.2-8.rh.el.3.0.i386.rpm
rpm -ivh heartbeat-1.2.2-8.rh.el.3.0.i386.rpm

配置 heartbeat

要使用 heartbeat,必须配置三个文件:authkeys、ha.cf 和 haresources。我将给出实现中我使用的具体配置; 如果需要更多资料,请参阅 heartbeat Web 站点,并阅读它们的文档(请参阅 参考资料)。

1. 配置 /etc/ha.d/authkeys

该文件确定了为群集所使用的认证密钥;两个节点上的密钥必须相同。有三种认证模式可以选择:crc、md5 或 sha1。 如果您的 heartbeat 运行在一个安全的网络上,比如例子中的交叉线缆,那么应该使用 crc。从资源的角度看,该方法的花费最低。如果您的网络不够安全,但您不是特别多疑,或者不是很关心最小化 CPU 资源的使用,那么应该使用 md5。 最后,如果您想要得到最好的认证,而不考虑 CPU 资源的使用,那么请使用 sha1,因为它最难破解。

文件的格式如下:


auth


[]

在测试设置中,我选择的是 crc 模式。清单 5 给出了 /etc/ha.d/authkeys 文件。要确保其许可是安全的, 比如 600。

清单 5. authkeys 文件
auth 2
2 crc

2. 配置 /etc/ha.d/ha.cf

这个文件将位于安装后创建的 /etc/ha.d 目录中。它告诉 heartbeat 使用哪些类型的媒体路径以及 如何配置它们。该文件还定义了群集中的节点,以及 heartbeat 用来确认系统是否在运行的接口。 清单 6 给出了我的设置中 /etc/ha.d/ha.cf 文件的相关部分。

清单 6. ha.cf 文件
...
#	File to write debug messages to
debugfile /var/log/ha-debug
#
#
# 	File to write other messages to
#
logfile	/var/log/ha-log
#
#
#	Facility to use for syslog()/logger
#
logfacility	local0
#
#
#	keepalive: how long between heartbeats?
#
keepalive 2
#
#	deadtime: how long-to-declare-host-dead?
#
deadtime 60
#
#	warntime: how long before issuing "late heartbeat" warning?
#
warntime 10
#
#
#	Very first dead time (initdead)
#
initdead 120
#
...
#	Baud rate for serial ports...
#
baud	19200
#
#	serial	serialportname ...
serial	/dev/ttyS0
#	auto_failback:  determines whether a resource will
#	automatically fail back to its "primary" node, or remain
#	on whatever node is serving it until that node fails, or
#	an administrator intervenes.
#
auto_failback on
#
...
#
#	Tell what machines are in the cluster
#	node	nodename ...	-- must match uname -n
node	ha1.haw2.ibm.com
node	ha2.haw2.ibm.com
#
#	Less common options...
#
#	Treats 10.10.10.254 as a pseudo-cluster-member
#	Used together with ipfail below...
#
ping 9.22.7.1
#	Processes started and stopped with heartbeat.  Restarted unless
#		they exit with rc=100
#
respawn hacluster /usr/lib/heartbeat/ipfail
...

3. 配置 /etc/ha.d/haresources

该文件描述的是 heartbeat 管理的资源。这些资源本质上只是一些 start/stop 脚本,非常类似于在 /etc/rc.d/init.d 中用来启动和停止资源的那些脚本。注意,heartbeat 会在 /etc/rc.d/init.d 和 /etc/ha.d/resource.d 中去寻找脚本。脚本文件 httpd 是 heartbeat 自带的。清单 7 给出了我的 /etc/ha.d/haresources 文件:

清单 7. haresources 文件
ha1.haw2.ibm.com 9.22.7.46 Filesystem::nfsha.haw2.ibm.com:/ha::/ha::nfs::rw,hard httpd

该文件在两个节点上必须相同。

这一行指出,在启动时,要实现以下操作:

  • 令 ha1 为 IP 9.22.7.46 服务。
  • 安装 NFS 共享文件系统 /ha。
  • 启动 Apache Web 服务器。

在后面的文章中,我将向这个文件中添加更多的资源。 在关闭时,heartbeat 将执行以下操作:

  • 停止 Apache 服务器。
  • 卸载共享文件系统。
  • 释放 IP。

这假定 uname -n 命令会显示 ha1.haw2.ibm.com;您的配置中可能只显示 ha1, 如果是那样的话,请使用 ha1。


配置 Apache HTTP 服务器的 HA

在这个步骤中,我将对 Apache Web 服务器的设置进行一些修改,使得它可以为共享系统上的文件提供服务,并为机器 ha1 和 ha2 的本地文件系统中的文件提供服务。index.html 文件(包含于代码示例中)将从共享的磁盘获得服务,而 hostname.html 文件 将从机器 ha1 和 ha2 上的本地文件系统获得服务。要实现 Apache Web 服务器的 HA,请执行以下操作:

  1. 以 root 身份登录。
  2. 在共享磁盘(/ha)上创建以下目录:

    /ha/www
    /ha/www/html
  3. 在节点 ha1 上使用下面所示的命令为共享的目录设置适当的权限:


    chmod 775 /ha/www


    chmod 775 /ha/www/html

    Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache Web 服务器

  4. 在主节点机和备份节点机上,重命名 Apache Web 服务器的 html 目录:


    mv /var/www/html /var/www/htmllocal
  5. 在两台机器上使用下面的命令创建指向共享目录的符号连接:


    ln -s /ha/www/html /var/www/html
  6. 将 index.html 文件复制到节点 ha1 上的 /ha/www/html 目录:


    cp /ha/hahbcode/www/index.html /var/www/html

    必须修改文件中的群集名称。

  7. 将 hostname.html 文件复制到两台机器上的 /ha/www/htmllocal 目录:


    cp /ha/hahbcode/www/hostname.html /var/www/html

    修改这个文件中的群集名称和节点名称。

  8. 在两台机器上创建指向 hostname.html 文件的符号链接:


    ln -s /var/www/htmllocal/hostname.html /ha/www/html/hostname.html

现在您就已经准备好测试 HA 实现了。


测试 Apaceh HTTP 服务器的 HA

要测试 Web 服务器的高可用性,请执行以下操作:

  1. 使用下面的命令启动主节点上的 heartbeat 服务,然后启动备份节点上的服务:


    /etc/rc.d/init.d/heartbeat start

    如果该命令失败,那么去查看 /var/log/messages,以确定原因并进行改正。heartbeat 成功启动后,您应该看到一个新的网络接口,其 IP 地址是您在 ha.cf 文件中配置的那个 IP 地址。启动 heartbeat 之后,查看一下 主节点上的日志文件(默认是 /var/log/ha-log),确保它正在进行 IP 接管并启动 Apache Web 服务器。使用 ps 命令来确保 Web 服务器后台进程正在主节点上运行。heartbeat 将不会在备份 节点上启动任何 Web 服务进程。只是在主节点失败时才会在备份节点上启动 Web 服务进程。

  2. 将浏览器指向下面的 URL,以确认正确地为两个 Web 页提供了服务(如果使用了不同的主机名,那么 URL 应该有所不同):

    http://ha.haw2.ibm.com/index.html
    http://ha.haw2.ibm.com/hostname.html

    注意,在上面我使用的是群集地址,而不是主节点的地址。

    对于第一个 URL,浏览器将显示下面的文本:


    Hello!!! I am being served from a High Availability Cluster ha.haw2.ibm.com

    对于第二个 URL,浏览器将显示下面的文本:


    Hello!!! I am being served from a node ha1.haw2.ibm.com in a High Availability Cluster ha.haw2.ibm.com
  3. 在主节点上使用下面的命令仅仅停止 heartbeat 来模拟故障转移(failover):


    /etc/rc.d/init.d/heartbeat stop

    您应该会看到,在一分钟之内,第二个节点上的所有 Web 服务器进程都会启动。如果不是那样,那么去查看 /var/log/messages 来确定问题所在并改正它。

  4. 将浏览器指向下面的 URL,以确认在 ha2 上正确提供了两个 Web 页的服务:

    http://ha.haw2.ibm.com/index.html
    http://ha.haw2.ibm.com/hostname.html

    对于第一个 URL,浏览器将显示下面的文本:


    Hello!!! I am being served from a High Availability Cluster ha.haw2.ibm.com

    对于第二个 URL,浏览器将显示下面的文本:


    Hello!!! I am being served from a node ha2.haw2.ibm.com in a High Availability Cluster ha.haw2.ibm.com

    注意,现在正在为该页提供服务的节点是 ha2。

  5. 重新启动主节点上的 heartbeat 服务。这样应该会停止第二节点上的 Apache 服务器进程,并在主节点上启动它们。 主节点应该同时接管群集 IP。

这样,通过将 Web 页放置在共享磁盘上,当主节点机器发生故障时,第二节点机器就可以向客户机提供其服务。故障转移 对访问 Web 页的客户机来说是透明的。该技术同样适用于提供 CGI 脚本服务。


结束语

我希望您尝试使用该技术,用廉价的硬件和立即可用的软件建立一个可用性非常高的 Web 服务器。在本系列的 下一篇文章中,您将看到如何使用 WebSphere MQ 来构建一个高可用性的消息队列服务器。

你可能感兴趣的:(heartbeat,中间件)