在 WebSphere Message Broker V7 中配置和管理多实例代理,实现高可用性,第 2 部分

本文描述了如何同时使用垂直和水平集群来实现高可用性的 “主动-主动” 技术(相对于 “主动-被动” 技术),以及如何在 WebSphere MQ 和 WebSphere Message Broker 中提高持续可用性、性能、流量和伸缩性。

Rahul Gupta, IT 顾问专家, IBM

Rahul Gupta 担任 IBM(印度)的 WebSphere Message Broker Consultant 已经有 5 年时间了。目前,他担任美国 IBM 零售商客户的 IBM 中间件产品技术顾问职务。



Devipriya Selvarajan, 消息传递顾问, IBM

Devipriya Selvarajan 是 WebSphere Lab Services 团队的一名消息传递顾问。她致力于为业务合作伙伴提供 WebSphere Transformation Extender、WebSphere Message Broker、WebSphere MQ 和 WebSphere DataPower SOA Appliances 支持。



2011 年 11 月 14 日

简介

本系列的 第 1 部分 介绍了多实例队列管理器和多实例代理的一些基础知识,描述了 “主动-被动” 高可用性技术和水平集群。本文将描述 IBM® WebSphere® Message Broker 中的新的多实例代理特性,展示如使用它配置一个 “主动-主动” 负载平衡环境。要实现该环境,需要同时以水平方式和垂直方式建立 WebSphere Message Broker 和 WebSphere MQ 组件的集群,如图 1 所示:

水平和垂直集群概览
水平和垂直集群概览

垂直集群

垂直集群通过使用 WebSphere MQ 集群特性设置队列管理器集群实现,垂直集群除了有利于优化处理之外,还提供了以下好处:

  • 更高的队列可用性,因为多个实例被公开为集群队列。
  • 更快的消息流量,因为消息可以在多个队列中传递。
  • 更好的工作负载分布,基于非功能性需求。

水平集群

水平集群通过使用多实例特性设置队列管理器和代理的集群来实现,水平集群提供以下好处:

  • 提供与垂直集群类似的软件冗余。
  • 提供额外的硬件冗余好处。
  • 支持在独立的物理服务器上配置多个队列管理器和代理实例,从而提供高可用性 (HA) 解决方案。
  • 节省商业 HA 解决方案(比如 PowerHA)的管理开销。

结合使用垂直和水平集群,利用单独的物理服务器来提高可用性、伸缩性、流量和性能。WebSphere MQ 和 WebSphere Message Broker 支持单独或同时使用多种集群技术。

系统信息

本文中的示例是在使用 WebSphere MQ V7.0.1.4 和 WebSphere Message Broker V7.0.0.3 的系统上运行的,有 4 个服务器运行在 SUSE Linux 10.0 上。下面是这 4 个服务器上的 “主动-主动” 配置的拓扑:

“主动-主动” HA 拓扑
“主动-主动” HA 拓扑

wmbmi1.in.ibm.com 托管:

  • 多实例队列管理器 IBMESBQM1 的主动实例
  • 多实例队列管理器 IBMESBQM2 的被动实例
  • 多实例代理 IBMESBBRK1 的主动实例
  • 多实例代理 IBMESBBRK2 的被动实例

wmbmi2.in.ibm.com 托管:

  • 多实例队列管理器 IBMESBQM2 的主动实例
  • 多实例队列管理器 IBMESBQM1 的被动实例
  • 多实例代理 IBMESBBRK2 的主动实例
  • 多实例代理 IBMESBBRK1 的被动实例

wmbmi3.in.ibm.com 托管队列管理器 IBMESBQM3,后者充当 WebSphere MQ 集群 IBMESBCLUSTER 的一个网关队列管理器。客户机使用该队列管理器来发送消息。

wmbmi4.in.ibm.com 托管 NSF V4 挂载点,多实例队列管理器和多实例代理使用这些挂载点来存储它们的运行时数据。

WebSphere MQ 集群 IBMESBCLUSTER 拥有 3 个成员队列管理器:

  • 队列管理器 IBMESBQM1 充当一个完整存储器队列管理器。
  • 队列管理器 IBMESBQM2 充当一个完整存储库队列管理器。
  • 队列管理器 IBMESBQM3 充当一个部分存储库队列管理器。

使用两个多实例队列管理器以及一个与 WebSphere MQ 集群重叠的多实例代理提供一个持续可用、没有停机的解决方案。当队列管理器的主动实例停用时,会启动被动实例,另一个队列管理器接管全部负载,满足增强系统可用性的目标。

使用 NFS 配置一个共享文件系统

有关配置和导出 wmbmi4.in.ibm.com 上托管的 /mqha 文件系统的详细信息,请参阅 在 WebSphere Message Broker V7 中配置和管理多实例代理,实现高可用性,第 1 部分

将所有系统上的 mqm 组的 uid 和 gid 设置为相同的值。在一个公共的共享文件夹 /mqha 中创建日志和数据目录。确保 mqha 目录由用户和组 mqm 所有,用户和组的访问权限都设置为 rwx。然后以 root 用户身份在 wmbmi4.in.ibm.com 上执行下面的命令:

创建和设置共享目录 /mqha 下面的目录的所有权
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMQ/IBMESBQM1/data
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMQ/IBMESBQM1/logs
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMB/IBMESBBRK1
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMQ/IBMESBQM2/data
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMQ/IBMESBQM2/logs
[root@wmbmi4.in.ibm.com]$ mkdir -p /mqha/WMB/IBMESBBRK2
[root@wmbmi4.in.ibm.com]$ chown -R mqm:mqm /mqha
[root@wmbmi4.in.ibm.com]$ chmod -R ug+rwx /mqha

创建队列管理器

首先在第一个服务器 wmbmi1.in.ibm.com 上创建多实例队列管理器 IBMESBQM1。以用户 mqm 的身份登录并执行以下命令:

在 wmbmi1.in.ibm.com 上创建队列管理器 IBMESBQM1
[mqm@wmbmi1.in.ibm.com]$ crtmqm -md /mqha/WMQ/IBMESBQM1/data -ld 
/mqha/WMQ/IBMESBQM1/logs IBMESBQM1

队列管理器创建后,请使用以下命令来显示队列管理器的属性:

显示队列管理器 IBMESBQM1 的属性
[mqm@wmbmi1.in.ibm.com]$ dspmqinf -o command IBMESBQM1
addmqinf -s QueueManager -v Name=IBMESBQM1 -v Directory=IBMESBQM1 -v Prefix=/var/mqm -v
DataPath=/mqha/WMQ/IBMESBQM1/data/IBMESBQM1

从用户 mqm 的控制台复制 dspmqinf 命令的输出,并将其粘贴到 wmbmi2.in.ibm.com 的命令行上:

在 wmbmi2.in.ibm.com 上创建一个 IBMESBQM1 引用
[mqm@wmbmi2.in.ibm.com]$ addmqinf -s QueueManager  -v Name=IBMESBQM1 -v 
Directory=IBMESBQM1 -v Prefix=/var/mqm -v DataPath=/mqha/WMQ/IBMESBQM1/data/IBMESBQM1
WebSphere MQ configuration information added.

多实例队列管理器 IBMESBQM1 就创建好了。下面在 wmbmi2.in.ibm.com 上创建第二个多实例队列管理器 IBMESBQM2。作为用户 mqm 登录并运行以下命令:

在 wmbmi2.in.ibm.com 上创建队列管理器 IBMESBQM2
[mqm@wmbmi2.in.ibm.com]$ crtmqm -md /mqha/WMQ/IBMESBQM2/data -ld 
/mqha/WMQ/IBMESBQM2/logs IBMESBQM2

队列管理器创建后,运行以下命令,显示队列管理器的属性:

显示队列管理器 IBMESBQM2 的属性
[mqm@wmbmi2.in.ibm.com]$ dspmqinf -o command IBMESBQM2
addmqinf -s QueueManager -v Name=IBMESBQM2 -v Directory=IBMESBQM2 -v Prefix=/var/mqm -v
DataPath=/mqha/WMQ/IBMESBQM2/data/IBMESBQM2

从用户 mqm 的控制台复制 dspmqinf 命令的输出,并将其粘贴到 wmbmi1.in.ibm.com 的命令行上:

在 wmbmi1.in.ibm.com 上创建一个 IBMESBQM2 引用
[mqm@wmbmi1.in.ibm.com]$ addmqinf -s QueueManager  -v Name=IBMESBQM2 -v 
Directory=IBMESBQM2 -v Prefix=/var/mqm -v DataPath=/mqha/WMQ/IBMESBQM2/data/IBMESBQM2
WebSphere MQ configuration information added.

下面,分别在两个服务器上使用 dspmq 命令来显示队列管理器。结果应该类似于:

在两个服务器上显示队列管理器
[mqm@wmbmi1.in.ibm.com]$ dspmq
QMNAME(IBMESBQM1)                                          STATUS(Ended immediately)
QMNAME(IBMESBQM2)                                          STATUS(Ended immediately)

[mqm@wmbmi2.in.ibm.com]$ dspmq
QMNAME(IBMESBQM1)                                          STATUS(Ended immediately)
QMNAME(IBMESBQM2)                                          STATUS(Ended immediately)

多实例队列管理器 IBMESBQM1 和 IBMESBQM2 已经在服务器 wmbmi1.in.ibm.com 和 wmbmi2.in.ibm.com 上创建好了。请按照下面的顺序启动多实例队列管理器:

启动多实例队列管理器
start IBMESBQM1 on wmbmi1.in.ibm.com using command 'strmqm -x IBMESBQM1'
start IBMESBQM2 on wmbmi2.in.ibm.com using command 'strmqm -x IBMESBQM2'
start IBMESBQM2 on wmbmi1.in.ibm.com using command 'strmqm -x IBMESBQM2'
start IBMESBQM1 on wmbmi2.in.ibm.com using command 'strmqm -x IBMESBQM1'

在 wmbmi3.in.ibm.com 上创建一个网关队列管理器 IBMESBQM3。使用 crtmqm 命令创建一个队列管理器,然后使用 strrmqm 命令启动它。这个队列管理器不是多实例队列管理器。创建和启动两个多实例队列管理器后,将它们添加到一个 WebSphere MQ 集群中,如下所示。

创建 WebSphere MQ 集群

创建并启动队列管理器 IBMESBQM1、IBMESBQM2 和 IBMESBQM3,在每个队列管理器上都创建一些监听器,然后将它们添加到一个 WebSphere MQ 集群中:

从 runmqsc 控制台定义监听器
'define listener(IBMESBLISTENER1) trptype(tcp) port(1414) control(qmgr)' on IBMESBQM1
'define listener(IBMESBLISTENER2) trptype(tcp) port(1415) control(qmgr)' on IBMESBQM2
'define listener(IBMESBLISTENER3) trptype(tcp) port(1416) control(qmgr)' on IBMESBQM3

创建监听器后,请启动它们:

从 runmqsc 控制台启动监听器
'START LISTENER(IBMESBLISTENER1)' on IBMESBQM1
'START LISTENER(IBMESBLISTENER2)' on IBMESBQM2
'START LISTENER(IBMESBLISTENER3)' on IBMESBQM3

创建并启动监听器后,将队列管理器添加到集群中,然后在完整存储器队列管理器之间创建通道。在多实例队列管理器 IBMESBQM1 和 IBMESBQM2 上运行以下命令:

将集群中的多实例队列管理器添加为完整存储库
ALTER QMGR REPOS (IBMESBCLUSTER)

完成上述操作之后,运行以下命令,在完整存储库队列管理器之间创建 CLUSTER 发送器和 CLUSTER 接收器通道:

在完整存储库和部分存储库队列管理器之间创建通道
Command to be issued on IBMESBQM1

DEFINE CHANNEL (TO.IBMESBQM1) CHLTYPE (CLUSRCVR) TRPTYPE (TCP) CONNAME 
('wmbmi1.in.ibm.com (1414), wmbmi2.in.ibm.com (1414)') CLUSTER (IBMESBCLUSTER)

DEFINE CHANNEL (TO.IBMESBQM2) CHLTYPE (CLUSSDR) TRPTYPE (TCP) CONNAME 
('wmbmi1.in.ibm.com (1415), wmbmi2.in.ibm.com (1415)') CLUSTER (IBMESBCLUSTER)

Command to be issued on IBMESBQM2

DEFINE CHANNEL (TO.IBMESBQM2) CHLTYPE (CLUSRCVR) TRPTYPE (TCP) CONNAME 
('wmbmi1.in.ibm.com (1415), wmbmi2.in.ibm.com (1415)') CLUSTER (IBMESBCLUSTER)

DEFINE CHANNEL (TO.IBMESBQM1) CHLTYPE (CLUSSDR) TRPTYPE (TCP) CONNAME 
('wmbmi1.in.ibm.com (1414), wmbmi2.in.ibm.com (1414)') CLUSTER (IBMESBCLUSTER)

在这两种多实例队列管理器之间建立通道,以共享 MQ 集群存储库相关信息。下面,将在部分存储库网关 QMGR (IBMESBQM3) 和一个完整存储库队列管理器(比如 IBMESBQM1)之间建立通道。请在队列管理器 IBMESBQM3 上执行以下命令:

部分存储库和完整存储库队列管理器之间的通道
DEFINE CHANNEL (TO.IBMESBQM3) CHLTYPE (CLUSRCVR) TRPTYPE (TCP) CONNAME 
('wmbmi3.in.ibm.com (1416)') CLUSTER (IBMESBCLUSTER)

DEFINE CHANNEL (TO.IBMESBQM1) CHLTYPE (CLUSSDR) TRPTYPE (TCP) CONNAME 
('wmbmi1.in.ibm.com (1414), wmbmi2.in.ibm.com (1414)') CLUSTER (IBMESBCLUSTER)

将这三个队列管理器添加到集群后,WebSphere MQ 集群拓扑应该如下所示:

包含 3 个队列管理器的 IBMESBCLUSTER
包含 3 个队列管理器的 IBMESBCLUSTER

现在,所有队列管理器都已经添加到集群中。接下来,可在完整存储库队列管理器上定义本地查询,并在集群上公开它们,以便进行工作负载平衡。在完整存储库队列管理器 IBMESBQM1 和 IBMESBQM2 上执行以下命令:

定义集群查询
DEFINE QLOCAL (IBM.ESB.IN) DEFBIND (NOTFIXED) CLWLUSEQ (ANY) CLUSTER (IBMESBCLUSTER)

WebSphere Message Broker 流将使用队列 IBM.ESB.IN 来处理消息。在队列 IBMESBQM3 上,为集群队列 IBM.ESB.IN 创建一个 REMOTE QUEUE 定义。然后公开别名队列 INPUT,以便应用程序在队列上放置消息:

集群队列的远程队列定义
DEFINE QREMOTE (IBM.ESB.IN) RNAME (IBM.ESB.IN) RQMNAME (IBMESBQM1)
DEFINE QALIAS (INPUT) TARGQ (IBM.ESB.IN)

配置 WebSphere Message Broker

此时,多实例队列管理器已经创建并添加到 WebSphere MQ 集群。接下来,要创建多实例代理 IBMESBBRK1 和 IBMESBBRK2,然后,将执行组 (DataFlowEngine) 添加到这些代理。以用户 mqm 的身份执行以下命令:

在 wmbmi1.in.ibm.com 上创建多实例代理 IBMESBBRK1
mqsicreatebroker IBMESBBRK1 -q IBMESBQM1 -e /mqha/WMB/IBMESBBRK1
在 wmbmi2.in.ibm.com 上创建多实例代理 IBMESBBRK2
mqsicreatebroker IBMESBBRK2 -q IBMESBQM2 -e /mqha/WMB/IBMESBBRK2
在 wmbmi2.in.ibm.com 上创建 IBMESBBRK1 的其他实例
mqsiaddbrokerinstance IBMESBBRK1 -e /mqha/WMB/IBMESBBRK1
在 wmbmi1.in.ibm.com 上创建 IBMESBBRK2 的其他实例
mqsiaddbrokerinstance IBMESBBRK2 -e /mqha/WMB/IBMESBBRK2

先启动多实例代理,然后在这些代理上创建 DataFlowEngine。执行下面的命令启动代理。多实例代理的主动实例将在服务器上实例化,而服务器上的对应多实例队列管理器将以主动状态运行。

启动多实例代理
mqsistart IBMESBBRK1
mqsistart IBMESBBRK2

在服务器上执行下面的命令,对应的多实例代理主动实例在服务器上运行。然后将创建执行组 IBMESBEG:

创建 DataFlowEngine
mqsicreateexecutiongroup IBMESBBRK1 -e IBMESBEG
mqsicreateexecutiongroup IBMESBBRK2 -e IBMESBEG

为 WebSphere Message Broker 创建消息流应用程序

下面是需要创建的一个简单消息流。该信息流将从 WebSphere MQ 集群输入队列读取消息并处理消息。这个数据流包含一个 JMSInput 节点、一个 Compute 节点和一个 JMSOutput 节点:

  1. 输入节点 (JMS.IBM.ESB.IN) 从队列 IBM.ESB.IN 读取消息。
  2. 输出节点 (JMS.IBM.ESB.OUT) 从队列 IBM.ESB.OUT 读取消息。
  3. 计算节点 (AddBrokerName) 读取和复制消息树。

输入队列被标记为持久性队列,一旦遇到失败情况,如果消息已经位于 INPUT 队列 (IBM.ESB.IN) 中,且消息流处理流程还没有读取它,那么该消息不会丢失。JMS 节点上的事务模式被设置为 Local,这意味着会在节点的本地同步点下接收消息,流中的输出节点稍后发送的消息不会放置到本地同步点下,除非某个单独的输出节点规定必须将消息放在本地同步点下。

消息流
消息流
  1. 输入和输出队列(IBM.ESB.IN 和 IBM.ESB.OUT)将它们的持久性属性设置为 Persistent,这意味着到达这些队列的所有消息都将持久化,以防止故障转移过程中出现任何消息丢失。
  2. 输入消息是通过 JmsProducer 实用工具(WebSphere MQ JMS Samples 中提供)发送的。可以修改这个独立 JMS Client 以生成在工作负载中有一个序列号的消息。输入消息是一个简单的 XML 消息。
  3. JMSProducer.java 附加输入消息中的序列号: <TestMsg><Message>Hello World #Seq_Num#</Message></TestMsg>
  4. 代理消息流读取消息,然后将以下两个值添加到消息中:处理消息的代理的名称,处理消息时的时间戳。将这两个值添加到消息中,以便在测试过程中提供帮助。

设置消息流

  1. 按照上面的 “消息流” 示意图所示创建一个消息流。将下面的 ESQL 添加到 Compute 节点:
    Compute 节点 ESQL
    Compute 节点 ESQL
  2. 配置 JMSInput 节点以拥有以下属性:
    • Source Queue = IBM.ESB.IN
    • Local JNDI bindings = file:///home/mqm/qcf/QCF1
    • Connection factory name = QCF
  3. 配置 JMSOutput 节点以拥有以下属性:
    • Source Queue = IBM.ESB.OUT
    • Local JNDI bindings = file:///home/mqm/qcf/QCF1
    • Connection factory name = QCF
  4. Local JNDI bindings 更改为流中的 file:///home/mqm/qcf/QCF2,并将其部署到第二个代理 IBMESBBRK2 中。这两个代理都将拥有自己的连接工厂副本。
  5. 使用队列管理器 IBMESBQM1 的 JMSAdmin 工具为 JMS 队列创建绑定。流中的 JMSInput 节点和 JMSOutput 节点使用了用于测试的 Linux 机器的 /home/mqm/qcf/QCF1/ 目录下的绑定文件。要生成绑定文件,请先在一个名为 JMSobjectsdef 的文件中定义 JMS 对象:
    JMS 对象定义
     DEF QCF(QCF1) + TRANSPORT(CLIENT) + QMANAGER(IBMESBQM1) 
       + HOSTNAME(127.0.0.1) + PORT(1414)	
     DEF Q(IBM.ESB.IN) + QUEUE(IBM.ESB.IN) + QMANAGER(IBMESBQM1)
     DEF Q(IBM.ESB.OUT) + QUEUE(IBM.ESB.OUT) + QMANAGER(IBMESBQM1)
  6. 编辑 /opt/mqm/java/bin 目录中的 JMSAdmin.config 文件,添加下面的条目,这是将生成绑定文件的位置:
    提供者 URL
    PROVIDER_URL=file:/home/mqm/qcf/QCF1
  7. 运行 JMSAdmin 命令,创建上面的 JMS 对象:
    运行 JMSAdmin
    mqm@wmbmi1:/opt/mqm/java/bin>./JMSAdmin < /home/mqm/JMSobjectsdef

    .bindings 文件现在位于 /home/mqm/qcf/QCF1/ 目录中。您还可以使用 MQ Explorer 完成 JMS 配置。有关详细信息,请参见 WebSphere MQ V7 信息中心中的 使用 WebSphere MQ JMS 管理工具

  8. 重复上面的步骤,为队列管理器 IBMESBQM2 生成绑定,并将其放置到 /home/mqm/qcf/QCF2 目录中。
  9. 将代理 IBMESBBRK1 和 IBMESBBRK2 上的流部署到集群中。
  10. 使用下面展示的 JmsProducer 实用工具将消息发送到网关队列管理器,然后后者会将消息发送到消息流的输入队列:
    运行 JMSProducer 实用工具
     java JmsProducer -m IBMESBQM3 -d IBM.ESB.IN -p 1416 -i "<TestMsg>
     <Message>Hello World</Message></TestMsg>"

您可以通过 JmsConsumer(WebSphere MQ JMS Samples 中提供)使用给定的消息流生成的消息。将流 (IBM.ESB.OUT) 的输出队列配置为只要队列上一收到消息,就会立即触发 JmsConsumer 实用工具。一旦触 JmsConsumer 工具,它就会使用来自 IBM.ESB.OUT 队列的消息,并将消息写入 /mqha/logs 目录中的一个名为 ConsumerLog.txt 的公共平面文件中。集群中的每个队列管理器都会触发一个 JmsConsumer 工具实例。将 runmqtrm 添加为一个 WebSphere MQ 服务,使它在启动队列管理器时启动触发器监控器。

将 JmsConsumer.java 定制为读取消息并将信息记录到共享文件系统上的一个文件中。日志文件中添加的条目如下所示。您可以在测试场景中使用这个日志文件来评估故障转移结果。每次读取 JMSConsumer.java,都会将下面的条目添加到 ConsumerLog.txt 中:

<Queue Manager Name> - 
<Queue Name> - 
< Server name on which multi-instance QM is running > - 
<Message Payload with #Seq Number>

测试 MQ 集群中的故障转移场景

场景 1. 受控制的 WebSphere MQ 故障转移

在场景 1 中,大量消息被发送到数据流并通过集群中的两个队列管理器进行处理。然后使用 endmqm 命令关闭其中一个多实例队列管理器 (IBMESBQM1)。在队列管理器 IBMESBQM1 的主动实例关闭后、另一台机器上的被动实例启动前,消息由集群中的另一个队列管理器 IBMESBQM2 处理。要验证这一点,可以检查输出队列 IBM.ESB.OUT 的消息中的时间戳和代理名称。在启动 IBMESBQM1 的被动队列管理器后,集群中的两个队列管理器将继续处理消息。

  1. 按照 设置消息流 中的描述将消息流部署到代理 IBMESBBRK1(wmbmi1.in.ibm.com) 和 IBMESBBRK2 (wmbmi2.in.ibm.com)。
  2. 在第三个服务器 wmbmi3.in.ibm.com 上运行 JMSProducer 实用工具(如下所示),开始向网关队列管理器 IBMESBQM3 发布消息:
    运行 JMSProducer 实用工具
     java JmsProducer -m IBMESBQM3 -d IBM.ESB.IN -p 1416 -i "<TestMsg>
     <Message>Hello World</Message></TestMsg>"
  3. 随着消息被处理,您可以观察到,已触发的 JmsConsumer JMS Client 正在向 /mqha/logs 目录中的 ConsumerLog.txt 写入数据:
    ConsumerLog.txt 样例输出
    IBMESBQM1 - IBM.ESB.OUT - wmbmi1 - 
       <TestMsg><Message>Hello World1</Message><Timestamp>
    2011-06-02T19:40:49.576381</Timestamp> <BrokerName>IBMESBBRK1</BrokerName></TestMsg>
    IBMESBQM2 - IBM.ESB.OUT - wmbmi2 - 
       <TestMsg><Message>Hello World2</Message><Timestamp>
    2011-06-02T19:39:51.703341</Timestamp> <BrokerName>IBMESBBRK2</BrokerName></TestMsg>
  4. 在 wmbmi1.in.ibm.com 机器中执行以下命令,停止 IBMESBQM1 队列管理器:
    停止 IBMESBQM1
    endmqm -s IBMESBQM1
  5. 当 IBMESBQM1 的主动实例关闭时,wmbmi2.in.ibm.com 机器中的被动实例将启动。但与此同时,入站消息通过集群中共享的队列管理器 IBMESBQM2 上的多实例代理 IBMESBBRK2 处理(这些消息在下面的输出中以红色突出显示)。被动实例启动后,消息再次由两个集群成员处理,以便系统绝对不会出现停用。场景 1 的结果如下所示:
    受控故障转移测试的输出
    受控故障转移测试的输出

场景 2. WebSphere MQ 的立即故障转移

场景 2 与场景 1 基本相同,但 MQ 进程是通过 kill 命令终止的,而不是使用 endmqm 命令关闭队列管理器。

  1. 按照 设置消息流 中的描述,将消息流部署到代理 IBMESBBRK1(wmbmi1.in.ibm.com) 和 IBMESBBRK2 (wmbmi2.in.ibm.com)。
  2. 在第三个服务器 wmbmi3.in.ibm.com 上运行 JMSProducer 实用工具(如下所示),开始向网关队列管理器 IBMESBQM3 发布消息:
    运行 JMSProducer 实用工具
     java JmsProducer -m IBMESBQM3 -d IBM.ESB.IN -p 1416 -i "<TestMsg>
     <Message>Hello World</Message></TestMsg>"
  3. 在处理消息的时候,您可以观察到,已触发的 JmsConsumer JMS Client 正在向 /mqha/logs 目录中的 ConsumerLog.txt 写入数据:
    ConsumerLog.txt 样例输出
    IBMESBQM1 - IBM.ESB.OUT - winmb1 - 
       <TestMsg><Message>Hello World 1</Message><Timestamp>
    2011-06-02T19:40:49.576381</Timestamp><BrokerName>IBMESBBRK1</BrokerName></TestMsg>
    IBMESBQM2 - IBM.ESB.OUT - winmb2 - 
        <TestMsg><Message>Hello World 2</Message><Timestamp>
    2011-06-02T19:39:51.703341</Timestamp><BrokerName>IBMESBBRK2</BrokerName></TestMsg>
  4. 通过终止队列管理器 IBMESBQM2 的执行控制器进程 amqzxma0 来停止 IBMESBQM2 队列管理器:
    立即停止 IBMESBQM2
    mqm@wmbmi2:~> ps -ef | grep amqzx
    mqm      24632     1  0 18:10 ?        00:00:00 amqzxma0 -m IBMESBQM2 -x
    mqm      13112     1  0 19:31 ?        00:00:00 amqzxma0 -m IBMESBQM1 -x
    mqm@wmbmi2:~> kill -9 24632
  5. 在关闭 IBMESBQM2 的主动实例后,会启用 wmbmi1.in.ibm.com 机器中的被动实例。但与此同时,入站消息是通过集群中共享的队列管理器 IBMESBQM1 上的多实例代理 IBMESBBRK1 来处理的(这些消息在下面的输出中以红色突出显示)。启动被动实例后,消息再次由两个集群成员处理,以防止系统中出现停用。场景 2 的结果如下所示:
    立即故障转移测试的输出
    立即故障转移测试的输出

场景 3. 关闭服务器 wmbmi2.in.ibm.com

在场景 3 中,重启了服务器 wmbmi2.in.ibm.com,而 wmbmi1.in.ibm.com 中运行的 IBMESBQM2 的被动实例会收到主动实例已经关闭的通知,然后启动被动实例。与此同时,入站消息是通过 wmbmi1.in.ibm.com 上的集群队列管理器 IBMESBQM1 来处理。

  1. 按照 设置消息流 中的描述,将消息流部署到代理 IBMESBBRK1(wmbmi1.in.ibm.com) 和 IBMESBBRK2 (wmbmi2.in.ibm.com)。
  2. 在第三个服务器 wmbmi3.in.ibm.com 上运行 JMSProducer 实用工具(如下所示),开始向网关队列管理器 IBMESBQM3 发布消息:
    运行 JMSProducer 实用工具
    java JmsProducer -m IBMESBQM3 -d IBM.ESB.IN -p 1416 -i "<TestMsg>
    <Message>Hello World</Message></TestMsg>"
  3. 在处理消息时,您可以观察到,已触发的 JmsConsumer JMS Client 正在向 /mqha/logs 目录中的 ConsumerLog.txt 写入数据:
    ConsumerLog.txt 样例输出
    IBMESBQM1 - IBM.ESB.OUT - winmb1 - 
       <TestMsg><Message>Hello World 2</Message><Timestamp>
    2011-06-06T17:03:51.838884</Timestamp><BrokerName>IBMESBBRK1</BrokerName></TestMsg>
    IBMESBQM2 - IBM.ESB.OUT - winmb2 - 
       <TestMsg><Message>Hello World 1</Message><Timestamp>
    2011-06-06T17:29:04.264681</Timestamp><BrokerName>IBMESBBRK2</BrokerName></TestMsg>
  4. 以 root 用户身份运行以下命令,然后重启服务器 wmbmi2.in.ibm.com:
    重启 wmbmi2.in.ibm.com
    wmbmi2:/home/mqm # reboot
    Broadcast message from root (pts/2) (Mon Jun  6 17:30:22 2011):
    The system is going down for reboot NOW!
    wmbmi2:/home/mqm # date
    Mon Jun  6 17:30:40 IST 2011
  5. 在关闭 IBMESBQM2 的主动实例后,会启用 wmbmi1.in.ibm.com 机器中的被动实例。但与此同时,入站消息是通过集群中共享的队列管理器 IBMESBQM1 上的多实例代理 IBMESBBRK1 来处理的(这些消息在下面的输出中以红色突出显示)。启动被动实例后,消息再次由两个集群成员处理,以防止系统出现停用。场景 3 的结果如下所示:
    系统关闭测试的输出
    系统关闭测试的输出

结束语

本文描述如何集成两种强大技术,即 WebSphere MQ 集群以及 WebSphere MQ 和 WebSphere Message Broker 多实例特性,用它们来改进关键生产系统中的队列管理器和代理的可用性。在这种配置中,WebSphere MQ 和 WebSphere Message Broker 的主动实例在故障转移后运行在同一个物理服务器上,这使得该服务器成为单个故障点。因此,拥有硬件冗余变得至关重要,而且 WebSphere MQ 和 WebSphere Message Broker 组件应位于单独的服务器上。

致谢

本文作者衷心感谢 WebSphere 高级技术架构师 Regina L. Manuel 和 WebSphere Message Broker 软件工程师 Martin R. Naish 的宝贵建议和反馈!

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=774238
ArticleTitle=在 WebSphere Message Broker V7 中配置和管理多实例代理,实现高可用性,第 2 部分
publish-date=11142011