MQ 集群概述
使用集群队列时需要注意的几点
结束语
使用示例应用程序演示 MQ 集群的负载平衡效果
用 MQ explorer 创建集群
创建 MQ 集群环境
用命令行创建集群
清单 1. 创建队列管理器
crtmqm -h 1024 -lp 20 -ls 5 -u FULL_QM1.DLQ FULL_QM1
strmqm FULL_QM1
runmqsc FULL_QM1
DEFINE LISTENER ('LISTENER.TCP') TRPTYPE (TCP) PORT (5000) CONTROL (QMGR)
START LISTENER ('LISTENER.TCP')
DEFINE CHANNEL ('SYSTEM.ADMIN.SVRCONN') CHLTYPE (SVRCONN)
END
在清单 1 中,创建了一个队列管理器 FULL_QM1。并且指定了这个队列管理器的监听端口为 5000。然后用同样的方法分别创建队列管理器 FULL_QM2,PART_QM1 和 PART_QM2,指定队列管理器的监听端口为 5001,5002 和 5003。
在创建完队列管理器后,需要将 FULL_QM1 和 FULL_QM2 添加到集群 NEW_CLUSTER 中,作为完整仓储库队列管理器。如清单 2 所示。
清单 2. 添加完整仓储库定义
echo “ALTER QMGR REPOS ('NEW_CLUSTER')” | runmqsc FULL_QM1
echo “ALTER QMGR REPOS ('NEW_CLUSTER')” | runmqsc FULL_QM2
在集群中,无论一个队列管理器要连接多少个远程队列管理器,最少只要创建一个集群发送通道和一个集群接收通道。
每个队列管理器都需要一个接收通道指向自己。对于队列管理器 FULL_QM1,要指定连接名 CONNAME 中的 ip 地址和端口号为 FULL_QM1 自己的 ip 地址和监听端口号。对于其他的队列管理器也一样。在清单 3 中,创建了集群中四个队列管理器的接收通道。
清单 3. 在队列管理器上创建接收通道
echo “DEFINE CHANNEL ('TO.FULL_QM1') CHLTYPE (CLUSRCVR) TRPTYPE (TCP) CONNAME
('127.0.0.1(5000)') CLUSTER ('NEW_CLUSTER')” | runmqsc FULL_QM1
echo “DEFINE CHANNEL ('TO.FULL_QM2') CHLTYPE (CLUSRCVR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5001)') CLUSTER ('NEW_CLUSTER')” | runmqsc FULL_QM2
echo “DEFINE CHANNEL ('TO.PART_QM1') CHLTYPE (CLUSRCVR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5002)') CLUSTER ('NEW_CLUSTER')” | runmqsc PART_QM1
echo “DEFINE CHANNEL ('TO.PART_QM2') CHLTYPE (CLUSRCVR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5003)') CLUSTER ('NEW_CLUSTER')” | runmqsc PART_QM2
每个队列管理器需要一个发送通道。在清单 4 中,定义了集群中四个队列管理器的发送通道。需要注意的是,对于两个完整仓储库队列管理器,需要建立相互间的发送通道。如对于完整仓储库队列管理器 FULL_QM1,需要建立到 FULL_QM2 的发送通道,发送通道的名字要和 FULL_QM2 的接收通道名字相同。并且要指定连接名 CONNAME 中的 ip 地址和端口号为 FULL_QM2 的 ip 地址和端口号。
而对于部分仓储库队列管理器,需要建立与某个或多个完整仓储库队列管理器的发送通道。对于 PART_QM1,这里建立了到完整仓储库队列管理器 FULL_QM1 的发送通道,并且发送通道的名字要和 FULL_QM1 的接收通道名字相同。连接名 CONNAME 也要指定为 FULL_QM1 的 ip 地址和端口号。另外,不需要定义 PART_QM1 指向另一个部分仓储库队列管理器 PART_QM2 的发送通道。
清单 4. 在队列管理器上创建发送通道
echo “DEFINE CHANNEL ('TO.FULL_QM2') CHLTYPE (CLUSSDR) TRPTYPE
(TCP) CONNAME ('127.0.0.1(5001)') CLUSTER ('NEW_CLUSTER')” | runmqsc FULL_QM1
echo “DEFINE CHANNEL ('TO.FULL_QM1') CHLTYPE (CLUSSDR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5000)') CLUSTER ('NEW_CLUSTER') ” | runmqsc FULL_QM2
echo “DEFINE CHANNEL ('TO.FULL_QM1') CHLTYPE (CLUSSDR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5000)') CLUSTER ('NEW_CLUSTER') ” | runmqsc PART_QM1
echo “DEFINE CHANNEL ('TO.FULL_QM2') CHLTYPE (CLUSSDR)
TRPTYPE (TCP) CONNAME ('127.0.0.1(5001)') CLUSTER ('NEW_CLUSTER') ” | runmqsc PART_QM2
集群的负载均衡是通过在集群内的不同队列管理器上建立同名的队列,即创建同一个队列的多个实例来实现的。每个队列实例都可以作为消息的目的地,MQ 使用负载平衡算法决定消息实际发送到哪个队列管理器。清单 5 中,在两个部分仓储库队列管理器上分别定义了一个集群队列 TEST_QUEUE,并且指定其 Cluster 属性值为 NEW_CLUSTER,这样这两个同名队列就可以在集群中共享了。
清单 5. 在两个部分仓储库队列管理器上定义集群队列
echo “DEFINE QLOCAL ('TEST_QUEUE') CLUSTER ('NEW_CLUSTER')” | runmqsc PART_QM1
echo “DEFINE QLOCAL ('TEST_QUEUE') CLUSTER ('NEW_CLUSTER')” | runmqsc PART_QM2
至此,已创建完一个简单的集群。可以通过 DISPLAY CLUSQMGR 命令来显示集群中的队列管理器的相关信息。清单 6 中列出了部分的信息。连接到完整仓储库队列管理器 FULL_QM1,在结果中共显示了四条通道。其中 TO.FULL_QM1 类型为 CLUSRCVR,指向 FULL_QM1,是接收通道。TO.FULL_QM2 为发送通道,指向 FULL_QM2,类型 CLUSSDRB 说明是显示创建的。TO.PART_QM1 和 TO.PART_QM2 是发送通道,分别指向 PART_QM1 和 PART_QM2,类型都为 CLUSSDRA,是集群自动生成的。
清单 6. 集群中队列管理器的信息
echo “DISPLAY CLUSQMGR(*) CLUSTER('NEW_CLUSTER') ALL” | runmqsc FULL_QM1
CLUSQMGR(FULL_QM1)
CHANNEL(TO.FULL_QM1)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5000))
DEFTYPE(CLUSRCVR)
CLUSQMGR(FULL_QM2)
CHANNEL(TO.FULL_QM2)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5001))
DEFTYPE(CLUSSDRB)
CLUSQMGR(PART_QM1)
CHANNEL(TO.PART_QM1)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5002))
DEFTYPE(CLUSSDRA)
CLUSQMGR(PART_QM2)
CHANNEL(TO.PART_QM2)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5003))
DEFTYPE(CLUSSDRA)
通过 DISPLAY QUEUE 命令显示集群中队列的相关信息,如清单 7 所示。连接到完整仓储库队列管理器 FULL_QM1 上,在结果中共显示了两个集群队列实例 TEST_QUEUE。
清单 7. 集群队列的信息
echo “DISPLAY QUEUE(*) CLUSINFO” | runmqsc FULL_QM1
QUEUE(TEST_QUEUE) TYPE(QCLUSTER)
QUEUE(TEST_QUEUE) TYPE(QCLUSTER)
通过这些命令,可以了解集群的具体结构。图 1 是当前显示创建的集群 NEW_CLUSTER 的拓扑图。对于 PART_QM1,我们只是显示创建了 PART_QM1 到 FULL_QM1 的发送通道,之后集群会自动创建 PART_QM1 到 FULL_QM2 的发送通道。同样集群也会自动创建 PART_QM2 到 FULL_QM1 的发送通道。最后形成的集群拓扑图如图 2 所示。
图 1. 显示创建的集群 NEW_CLUSTER 的拓扑图
图 2. 集群 NEW_CLUSTER 的拓扑图