对随需应变计算的成功而言,维持最大限度的系统运行时间变得越来越重要。WebSphere MQ 是一个重要的消息中间件, 可以帮助企业加快向随需应变商务的转型。架构师需要考虑如何将 WebSphere MQ 引入到高可用配置的重要性。本文 讲述了如何在硬件级上使用开源软件,让使用所提供集群的 WebSphere MQ 具备高可用性。
简介
WebSphere MQ 具备异步消息和排队能力,可以确保仅发送一次消息。通过同时使用 WebSphere MQ 和 heartbeat,有可能进一步提高 WebSphere MQ 队列管理器的可用性。
在本系列的 第 1 部分 中,我向您介绍了高可用性(HA)概念,以及如何安装和配置 heartbeat。在本文中,我将讨论如何使用 heartbeat 在冷备份配置中获得 WebSphere MQ 的 HA 实现。在这个实现中,heartbeat 会检测到主节点出现的问题。这个问题可以是硬件或者软件问题。备份机器将:
- 接管 IP 地址。
- 接管存储了队列管理器的队列和日志文件的共享磁盘。
- 启动队列管理器和相关进程。
为了最大限度地理解并使用本文,您应该对 WebSphere MQ 和高可用集群有基本的了解。还应该熟悉本系列的第一篇文章, Linux 上的高可用中间件,第 1 部分:heartbeat 与 Apache Web 服务器。
为 WebSphere MQ 实现 HA
将要用于 heartbeat 集群中的队列管理器需要将它的日志和数据存储在共享的磁盘上,以便在某个节点失败时,仍可以在运行的节点上访问到它们。运行队列管理器的节点还必须在内部磁盘上维持许多文件。这些文件包括 与节点上所有队列管理器相关的文件,比如 /var/mqm/mqs.ini,以及用来生成内部控制信息的队列管理器 特有的文件。因此,与队列管理器相关的文件分开存放在内部的和共享的磁盘上。
关于存储在共享磁盘上的队列管理器文件,可以为所有与队列管理器相关的恢复数据(日志和数据)使用一个 单一的共享磁盘。不过,为了产品环境中的性能优化,建议将日志和数据存放在分开的文件系统中,这样可以 分别对它们进行磁盘 I/O 调优。
图 1 展示了我们的设置中文件系统的组织。显示的链接线是使用 shell 脚本自动生成的,下面将对它们进行解释。
图 1. 队列管理器 — ha.queue.manager 的文件系统组织
在下面的章节中,我将向您详细介绍安装 WebSphere MQ 以及创建和测试高可用队列管理器配置的步骤。
安装 WebSphere MQ
遵循这一节中列出的步骤,在主节点和备份节点上安装 WebSphere MQ 5.3.0.2 和 Fixpack 7。有关的更多资料,请参考 WebSphere MQ for Linux for Intel and Linux for zSeries Quick Beginnings 文档 (参阅 参考资料中的链接):
- 使用下面的命令对 WebSphere MQ 5.3.0.2 RPM 进行解压缩:
rm -rf /tmp/mq5.3.0.2-install
mkdir /tmp/mq5.3.0.2-install
tar xzf C48UBML.tar.gz -C /tmp/mq5.3.0.2-install
tar xf /tmp/mq5.3.0.2-install/MQ53Server_LinuxIntel.tar -C /tmp/mq5.3.0.2-install在这里,C48UBML.tar.gz 是 WebSphere MQ 的安装图像文件。
- 设置内核版本:
export LD_ASSUME_KERNEL=2.4.19 - 使用 IBM 1.4.2 JDK JRE 替换 WebSphere MQ 附带的 Java 运行时环境(JRE):
mv /tmp/mq5.3.0.2-install/lap/jre /tmp/mq5.3.0.2-install/lap/jre.mq
ln -s /opt/IBMJava2-142/jre /tmp/mq5.3.0.2-install/lap/jre - 接受许可:
/tmp/mq5.3.0.2-install/mqlicense.sh -accept -text_only - 安装 WebSphere MQ RPM:
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesRuntime-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesSDK-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesServer-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesClient-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesSamples-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesJava-5.3.0-2.i386.rpm
rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesMan-5.3.0-2.i386.rpm - 清除以下内容:
rm -rf /tmp/mq5.3.0.2-install/ - 解压缩 fixpack 7 RPM:
rm -rf /tmp/mq5.3.0.7-install/
mkdir /tmp/mq5.3.0.7-install/
tar xzf U496732.nogskit.tar.gz -C /tmp/mq5.3.0.7-install/ - 安装 fixpack 7 RPM:
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesRuntime-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesSDK-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesServer-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesClient-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesSamples-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesJava-U496732-5.3.0-7.i386.rpm
rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesMan-U496732-5.3.0-7.i386.rpm - 再次清除:
rm -rf /tmp/mq5.3.0.7-install/
创建高可用 MQ 管理器和队列
在某些平台上,高可用队列管理器的创建是由 WebSphere MQ HA Support Packs 中的脚本自动完成的, 比如 MC63 和 IC61。不过,这些支持包(support pack)不能用于 Linux。
这一节中使用的脚本是 MC63 支持包中的脚本的修改版本,具有下列限制:
- 日志和数据只能用一个文件系统(/ha)。
- 每次一个队列。
遵循下面列出的步骤来创建高可用队列管理器 ha.queue.manager
:
- 在共享磁盘(/ha)上创建下面的目录:
- /ha/ha.queue.manager
- /ha/ha.queue.manager/data
- /ha/ha.queue.manager/log
- 在主节点(ha1)上使用下面的命令创建一个高可用的队列管理器(以 root 身份):
/ha/hacode/mq/hascripts/hacrtmqm ha.queue.managerhacrtmqm
命令将创建队列管理器,并将确保它的目录安排考虑到了 HA 操作。 本文附带了hacrtmqm
脚本的源代码(请参阅 下载 中的链接)。 - 在两个节点上的
mqm
用户的 .bashrc(启动脚本)中添加下面两行。
LD_ASSUME_KERNEL=2.4.19
export LD_ASSUME_KERNEL - 运行
setmqcap
命令,输入您所购买的处理器数目。在 ha1 上运行以下命令:
/opt/mqm/bin/setmqcap 4 - 以用户
mqm
的身份使用strmqm
命令启动队列管理器 ha.queue.manager。
/opt/mqm/bin/strmqm ha.queue.manager - 启动 MQSC 命令,输入以下内容:
/opt/mqm/bin/runmqsc ha.queue.manager出现一条消息,告诉您已经启动了一个 MQSC 会话。MQSC 没有命令提示符。
- 创建一个本地队列 HA.QUEUE,输入下面的命令:
define qlocal (HA.QUEUE) - 创建一个通道 HA.CHANNEL,输入下面的命令:
define channel(HA.CHANNEL) chltype(svrconn) trptype(tcp) mcauser('mqm') - 输入
end
来停止 MQSC。出现一些消息,并且命令提示符会重新 显示出来。 - 使用
endmqm
命令手工停止队列管理器 ha.queue.manager:
/opt/mqm/bin/endmqm ha.queue.manager - 在备份节点(ha2)上,以用户
mqm
身份创建队列管理器。 可以使用下面给出的命令,不过要写在同一行上。您可能需要以 root 身份挂载 /ha:
cd /ha/hacode/mq/hascripts/
./halinkmqm ha.queue.manager ha\!queue\!manager
/ha/ha.queue.manager/data standby在内部,
hacrtmqm
使用一个称为halinkmqm
的脚本来重新链接用作 IPC 的子目录,并创建一个指向 /ha/$qmgr/data/qmgrs/$qmgr 目录的符号链接 /var/mqm/qmgrs/$qmgr。不要在使用 hacrtmqm 创建队列管理器的节点上运行halinkmqm
— 它已经在那里运行了。本文附带了halinkmqm
脚本的源代码 (在可从 下载 获得的文件中)。 - 运行
setmqcap
命令,输入您所购买的处理器数目:
/opt/mqm/bin/setmqcap 4 - 在备份节点上,使用
strmqm
命令启动队列管理器ha.queue.manager
。 确认它已启动。 - 停止备份节点上的队列管理器。
配置 heartbeat 来管理 WebSphere MQ 服务器
在下面列出了配置 heartbeat 来管理 WebSphere MQ 服务器所需要的步骤:
-
如前所述,heartbeat 所管理的资源基本上只是 start/stop 脚本。您需要创建启动和停止 WebSphere MQ 队列管理器和 相关进程的脚本。清单 1 中给出了一个非常基本的脚本。您可以通过进一步对这个脚本进行定制来满足您的需要。这个脚本必须放置在 /etc/rc.d/init.d 目录中。
清单 1. mqseries 脚本
#!/bin/bash # # /etc/rc.d/init.d/mqseries # # Starts the MQ Server # # chkconfig: 345 88 57 # description: Runs MQ . /etc/init.d/functions # Source function library. PATH=/usr/bin:/bin:/opt/mqm/bin QMGRS="ha.queue.manager" PS=/bin/ps GREP=/bin/grep SED=/bin/sed #====================================================================== SU="sh" if [ "`whoami`" = "root" ]; then SU="su - mqm" fi #====================================================================== killproc() { # kill the named process(es) pid=`$PS -e | $GREP -w $1 | $SED -e 's/^ *//' -e 's/ .*//'` [ "$pid" != "" ] && kill -9 $pid } #====================================================================== start() { for qmgr in $QMGRS ; do export qmgr echo "$0: starting $qmgr" $SU -c "strmqm $qmgr" $SU -c "nohup runmqlsr -m $qmgr -t tcp -p 1414 >> /dev/null 2&t;&1 < /dev/null &" done } #====================================================================== stop() { for qmgr in $QMGRS ; do export qmgr echo ending $qmgr killproc runmqlsr $SU -c "endmqm -w $qmgr &" sleep 30 done } case $1 in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; *) echo "usage: $0 {start|stop|restart}" ;; esac
- 现在需要配置 /etc/ha.d/haresources(在两个节点上),使它们包含上面的
mqseries
脚本,如下所示:
ha1.haw2.ibm.com 9.22.7.46
Filesystem::hanfs.haw2.ibm.com:/ha::/ha::nfs::rw,hard mqseries这表示,在 heartbeat 启动时,它将使 ha1 服务集群 IP 地址,挂载共享文件系统 /ha,然后启动 WebSphere MQ 进程。在关闭时,heartbeat 将首先停止 WebSphere MQ 进程,然后卸载文件系统, 最后释放 IP 地址。
测试用于 WebSphere MQ 的 HA
本节列出了测试队列管理器 ha.queue.manager
的高可用性所需要的步骤。
- 启动主节点上的 heartbeat 服务,然后在备份节点上执行以下命令:
/etc/rc.d/init.d/heartbeat start如果失败,那么可查看 /var/log/messages 中的消息来确定其原因,并纠正它。当 heartbeat 成功启动后,您应该看到一个新的接口,其地址是您在 ha.cf 文件中配置的地址。可以通过运行
ifconfig
来显示它。清单 2 给出了与设置的输出相关的部分:清单 2. 用于集群 IP 地址的接口
... eth0:0 Link encap:Ethernet HWaddr 00:D0:59:DA:01:50 inet addr: 9.22.7.46 Bcast:9.22.7.127 Mask:255.255.255.128 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:76541 errors:0 dropped:0 overruns:0 frame:0 TX packets:61411 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:8830515 (8.4 Mb) TX bytes:6755709 (6.4 Mb) Interrupt:11 Base address:0x6400 Memory:c0200000-c0200038 ...
一旦启动了 heartbeat,在测试它之前,要先看一下日志文件(默认情况下是 /var/log/ha-log)。 如果一切顺利,那么主机器的日志(本例中的 ha1)内容应该类似于清单 3 所示 (出于版面方面考虑,省略了一些行)。
清单 3. ha-log 文件的内容
... heartbeat: 2004/09/01_11:17:13 info: ************************** heartbeat: 2004/09/01_11:17:13 info: Configuration validated. Starting heartbeat 1.2.2 heartbeat: 2004/09/01_11:17:13 info: heartbeat: version 1.2.2 heartbeat: 2004/09/01_11:17:13 info: Heartbeat generation: 10 heartbeat: 2004/09/01_11:17:13 info: Starting serial heartbeat on tty /dev/ttyS0 (19200 baud) heartbeat: 2004/09/01_11:17:13 info: ping heartbeat started. heartbeat: 2004/09/01_11:17:13 info: pid 9226 locked in memory. heartbeat: 2004/09/01_11:17:13 info: Local status now set to: 'up' heartbeat: 2004/09/01_11:17:14 info: pid 9229 locked in memory. heartbeat: 2004/09/01_11:17:14 info: pid 9230 locked in memory. heartbeat: 2004/09/01_11:17:14 info: pid 9231 locked in memory. heartbeat: 2004/09/01_11:17:14 info: pid 9232 locked in memory. heartbeat: 2004/09/01_11:17:14 info: pid 9233 locked in memory. heartbeat: 2004/09/01_11:17:14 info: Link 9.22.7.1:9.22.7.1 up. heartbeat: 2004/09/01_11:17:14 info: Status update for node 9.22.7.1: status ping ... heartbeat: 2004/09/01_11:19:18 info: Acquiring resource group: ha1.haw2.ibm.com 9.22.7.46 mqseries heartbeat: 2004/09/01_11:19:18 info: Running /etc/ha.d/resource.d/IPaddr 9.22.7.46 start heartbeat: 2004/09/01_11:19:18 info: /sbin/ifconfig eth0:0 9.22.7.46 netmask 255.255.255.128 broadcast 9.22.7.127 heartbeat: 2004/09/01_11:19:18 info: Sending Gratuitous Arp for 9.22.7.46 on eth0:0 [eth0] ... heartbeat: 2004/09/01_11:19:49 info: Running /etc/init.d/mqseries start ...
您可以看到它正在进行 IP 接管,并随后启动 WebSphere MQ 进程。可以使用
ps
命令来确认 WebSphere MQ 正在主节点上运行。 -
向 BGQUEUE 添加一些持久存储消息。可以通过运行 MQ Sender 程序 send.bat 或者 send.sh(视您的操作系统而定)来完成这项操作。 您应该在一台安装了 MQ Client 的机器上运行这个程序。清单 4 展示了在节点 ha1 上运行这个程序的输出。
清单 4. 向 HA 队列添加持久存储消息
[root@ha1 mq]# ./send.sh MSender is running Hostname = ha.haw2.ibm.com QManager = ha.queue.manager Channel Name = HA.CHANNEL Channel Port = 1414 Q = HA.QUEUE Enter a message: Hello This is a test Done Sending Message [root@ha1 mq]#
-
浏览并获得这些消息。然后使用 MQ Browse 程序 receive.bat 或者 receive.sh(视您的操作系统而定)。 除了最后一个“test”消息之外,您将得到先前添加到队列中的所有消息。您将在进行故障恢复后得到这些消息。清单 5 给出了在节点 ha1 上运行的输出。
清单 5. 从 HA 队列获得持久存储消息
[root@ha1 mq]# ./receive.sh MBrowse is running Hostname = ha.haw2.ibm.com QManager = ha.queue.manager Channel Name = HA.CHANNEL Channel Port = 1414 Q = HA.QUEUE Browsed message: Hello Actually get message?y Actually getting the message Browsed message: This Actually get message?y Actually getting the message Browsed message: is Actually get message?y Actually getting the message Browsed message: a Actually get message?y Actually getting the message Browsed message: test Actually get message?n MQJE001: Completion Code 2, Reason 2033 MQ exception: CC = 2 RC = 2033
忽略结尾带有原因代码 2033 的 MQ Exception。出现这种异常是因为无法再从队列中获得消息。
- 模拟故障恢复。只需在主系统上使用以下命令停止 heartbeat 即可:
/etc/rc.d/init.d/heartbeat stop您应该观察到,在不到一分钟时间内,第二台机器上的所有服务都启动起来。如果没有, 那么可以去查看 /var/log/messages 中的消息来确定其原因,并纠正它。通过再次启动 heartbeat,您 可以自动恢复至主节点。heartbeat 总是优先选择主系统,只要有可能,就先从那里开始运行。 在备份机器上检查 /var/log/ha-log 文件和
ps
命令,以此确认 WebSphere MQ 正在运行。 -
浏览并获得最后一条消息。运行 MQ Browse 程序 receive.bat 或者 receive.sh(视您的操作系统而定)。 这一次您将得到最后一条消息。 清单 6 给出了在 ha2 上运行的输出。
清单 6. 从 HA 队列获得持久存储消息
[root@ha2 mq]# ./receive.sh MBrowse is running Hostname = ha.haw2.ibm.com QManager = ha.queue.manager Channel Name = HA.CHANNEL Channel Port = 1414 Q = HA.QUEUE Browsed message: test Actually get message?y Actually getting the message MQJE001: Completion Code 2, Reason 2033 MQ exception: CC = 2 RC = 2033
- 重新在主节点上启动 heartbeat 服务。这应该会停止备份节点上的 WebSphere MQ 服务器进程,并 在主节点上启动它们。主节点还应该接管集群 IP。
现在您已经了解了如何通过使用共享磁盘,使得在故障恢复之前添加到某个队列中的消息可以在以后被恢复。
结束语
在这一期中,您已经了解了如何在 Linux 操作系统上使用开源软件实现 WebSphere MQ 的高可用性。 在下一期中,我们将讨论 IBM LoadLeveler 调度程序的 HA 实现。
致谢
感谢 Mike Burr 为 WebSphere MQ 的安装所提供的技术指导。
相关推荐
- **平台兼容性**:WebSphere MQ支持多种操作系统,包括Windows、Linux、Unix、IBM AIX等,使得跨平台的通信变得简单。 - **高可用性**:通过集群、复制和故障切换等功能,保证了服务的连续性和可靠性。 - **安全...
IBM WebSphere MQ for Linux V6.0 是一款高级消息传递中间件,用于在分布式系统环境中实现可靠的消息传递服务。该版本针对Linux环境进行了优化,旨在提供高性能、高可用性和安全性。 #### 二、版权与版本信息 - **...
3. **高可用性**:通过集群和镜像队列技术,WebSphere MQ可以提供高可用性和故障切换能力,确保服务的连续性。 4. **安全性**:WebSphere MQ支持用户身份验证和访问控制,能对消息传输进行加密,保护数据安全。 5....
8. **高可用性与集群**:探讨MQ在集群环境下的工作,包括队列镜像、群集配置,以确保服务的高可用性和容错性。 9. **集成与互操作性**:学习如何将MQ与其他系统(如数据库、ERP等)集成,以及与其他消息中间件的互...
Websphere MQ,又称为IBM WebSphere Message Broker,是IBM公司推出的一款强大的消息中间件产品。它是企业级应用集成(EAI)中的关键组件,负责在不同系统、应用程序之间安全、可靠地传输数据,实现异构环境下的通信...
通过为重要的消息和事务提供可靠的、一次且仅一次的传递,Websphere MQ 可以处理复杂的通信协议,并动态地将消息传递工作负载分配给可用的资源。 IBM 消息中间件MQ以其独特的安全机制、简便快速的编程风格、卓越不凡...
### WebSphere MQ Primer – 消息传递与WebSphere MQ...综上所述,WebSphere MQ是一款功能强大且成熟的消息中间件产品,它不仅支持多种消息传递方式,还具有高度的可靠性和安全性,是构建现代企业级应用的理想选择。
《精通WebSphere MQ》一书深入探讨了IBM WebSphere MQ这一强大的消息中间件技术,旨在为读者提供全面、深入的理解和实践经验。以下是基于该书标题、描述、标签以及部分内容提炼的关键知识点: ### 1. 消息中间件...
IBM WebSphere MQ,通常简称为MQ,是IBM提供的一款企业级的消息中间件产品。它允许应用程序之间通过异步消息传递来通信,无论这些应用程序是在同一台计算机上还是在不同的网络环境中。这种通信方式增强了系统的可...
- **介绍**:WebSphere MQ 是 IBM 开发的一款高性能、可靠的消息中间件解决方案。 - **特点**: - 支持多种操作系统平台。 - 提供高级别的安全性、可靠性和可扩展性。 - 能够处理大量的并发连接和消息。 **1.1.3...
综上所述,IBM WebSphere MQ v6.0是一款强大而全面的消息中间件,它以其稳定、高效和安全的特性,成为企业构建分布式、跨平台应用的首选。通过使用v6.0,企业能够实现更灵活、可靠的系统间通信,提高整体业务流程的...
这包括了对 Java Message Service (JMS) 的支持,使开发者能够利用 JMS API 来构建高可用性、高可扩展性的消息驱动的应用程序。 #### 二、WMQ for Java 的应用场景 - **不同系统间通信**:WMQ 可以让不同的系统...
**WebSphere MQ** 是由 IBM 开发的一款消息中间件产品,主要用于实现不同应用程序、服务器、系统之间的消息传递与数据交换。它支持多种消息传递模型,如点对点 (Point-to-Point) 和发布/订阅 (Publish/Subscribe) ...
WebSphere MQ,原名MQSeries,是IBM提供的一款企业级的消息中间件产品,它允许不同应用程序、系统和网络之间的安全、可靠、高效的数据交换。在WebSphere MQ中,消息是数据传输的基本单元,通过消息队列进行存储和...
WebSphere MQ,简称IBM MQ,是IBM公司开发的一种中间件,用于在不同的应用之间传递消息,提供可靠的消息传输服务,确保数据的高可用性和安全性。在本教程中,我们将详细探讨如何在基于x86-64架构的Linux系统上安装和...
8. **MQSeriesFTService-7.5.0-1.x86_64.rpm**: 该组件可能与MQSeriesFTBase一起工作,提供具体的故障转移服务,确保WebSphere MQ服务的高可用性和容错能力。 9. **copyright**: 这可能包含了软件的版权和许可信息...
集群提供高可用性和负载均衡,通过将多个队列管理器组织成一个集群,确保即使部分节点失效,服务仍然可用。集群中的节点可以共享队列,提高系统整体性能。 **WebSphere MQ分布式队列管理**: 分布式队列管理允许在...
- **定义**: IBM WebSphere MQ是一种高性能的消息中间件,用于支持分布式系统中的异步消息传递。 - **特点**: - 支持多种操作系统。 - 提供了丰富的API接口。 - 支持跨平台通信。 **1.4 WebSphere MQ的重要特点*...
IBM WebSphere MQ,通常简称为IBM MQ,是IBM提供的一款企业级消息中间件产品。它允许应用程序在不同的网络环境、操作系统和应用架构之间可靠地交换数据,无需关心底层网络的复杂性。WebSphere MQ提供了一种高效、...