Websphere mq 集群小结
1. 集群的定义:可以把集群认为是一个队列管理器的网络,或是一个队列管理器的集合,集群中的队列管理器可以是部署在不同的操作系统平台的。
2. 使用集群的优点:
1) 减少系统管理:在集群中建立队列管理网络比在分布式队列建立网络将使用更少的定义,您将能够更快和更容易地建立和改变网络。并且降低了定义错误的风险
2) 增强可用性和实现负载均衡:多个应用服务器之间的集群功能不仅使服务器之间能够共享负载,并且当某一系统或网络出现故障时,能够自动进行负载均衡。
3. 集群的组件:
1) 集群资源库(队列):资源库中存放了集群中队列管理器的信息,包括队列管理器名,以及它们的通道和队列等。这些资源库信息通过一个叫SYSTEM.CLUSTER.COMMAND.QUEUE 的队列进行交换,并存放到一个叫SYSTEM.CLUSTER.REPOSITORY.QUEUE 的固定队列中。资源库可能是完全或部分的。每个队列管理器至少要连接到一个拥有完全资源库的队列管理器。每一个集群队列管理器必须有一个叫SYSTEM.CLUSTER.REPOSITORY.QUEUE 的本地队列,在集群中至少一个集群队列管理器含有完全资源库。对于每个集群队列管理器,必须要预定义一个集群-发送通道连接到资源库队列管理器中。资源库队列管理器之间必须要互连,网络状况要比较好,和具有高可用性。普通队列管理器只包含有部分资源库信息。
2) 集群-发送通道:集群-发送通道的类型为TYPE(CLUSSDR),集群队列管理器使用集群-发送通道可以把消息发送到完全资源库队列管理器中。这个通道被用来通知队列管理器状态的改变,例如,队列的删除和创建。它仅和第一个完全资源库队列管理器联系。
3) 集群-接收通道:集群-接收通道的类型为TYPE(CLUSRCVR),集群队列管理器可以使用它接收集群内的消息。每一个集群队列管理器至少需要一个集群-接收通道。
4) 集群传输队列:从 一个队列管理器发送到其它队列管理器的消息都将被放到SYSTEM.CLUSTER.TRANSMIT.QUEUE 队列中,在每个队列管理器中必须要存在集群传输队列。
4. 集群的创建:
l 每当您在集群中创建一个接收通道或定义一个队列时,则系统将自动在其它队列管理器中创建相应的发送通道和远程队列定义。
l 在集群中您不需要创建传输队列定义,因为WebSphere MQ 在每个队列管理器中已经定义了一个传输队列。这个传输队列可以把消息发送到任何队列管理器中。
l 脚本示例:我们将创建一个名为CLUSTER1的集群,其中包含QMGR1,QMGR2和QMGRI三个队列管理器,其中在QMGR1和QMGR2上创建INPUTQ的接收队列,并使得它们在集群中共享:
1) 分别创建三个队列管理器。
2) 设置QMGR1和QMGR2为集群的两个完全仓储库。在两个队列管理上执行MQSC命令:ALTER QMGR REPOS(CLUSTER1) 。
3) 定义三个队列管理器的集群发送和集群接收通道:
u 在QMGR1上执行MQSC命令:
DEFINE CHANNEL(TO.QMGR1) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('9.68.58.228(1414)') CLUSTER(CLUSTER1)
DEFINE CHANNEL(TO.QMGR2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('9.68.58.228(1415)') CLUSTER(CLUSTER1)
u 在QMGR2上执行MQSC命令:
DEFINE CHANNEL(TO.QMGR2) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('9.68.58.228(1415)') CLUSTER(CLUSTER1)
DEFINE CHANNEL(TO.QMGR1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('9.68.58.228(1414)') CLUSTER(CLUSTER1)
u 在QMGRI上执行MQSC命令:
DEFINE CHANNEL(TO.QMGRI) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('9.68.58.228(1416)') CLUSTER(CLUSTER1)
DEFINE CHANNEL(TO.QMGR1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('9.68.58.228(1414)') CLUSTER(CLUSTER1)
4) 在QMGR1和QMGR2上定义集群共享队列INPUTQ,在QMGR1和QMGR2上,分别执行MQSC命令:DEFINE QLOCAL(INPUTQ) CLUSTER(CLUSTER1)这时,在QMGRI上可以看到这两个被共享出来的队列。
5) 验证配置成功:在QMGRI上向INPUTQ发送消息。测试的结果表明,MQ将以轮巡的方式向QMGR1和QMGR2的INPUTQ发送消息,当我们停止队列管理器QMGR1时,所有的消息都会发送到QMGR2的INPUTQ中。
l 集群与外部队列管理器的通信示例:假设,某用户其总部和各个省公司之间传输数据,由于业务处理量较大,尤其是对总部而言,它是全国的通讯和业务枢纽,为了不让这里产生瓶颈,用户在这里设立多个应用服务器来进行交易处理,这里我们假设为两个。在总部建立三个队列管理器:QMGRHQ1,QMGRHQ2和QMGRGW,将这三个队列管理器组成一个集群CLUSTER1,QMGRA和QMGRB代表两个省的队列管理器,QMGRHQ1,QMGRHQ2位于应用服务器主机上。在这里我们要向大家指出的是:当集群内的队列管理器要和集群外的队列管理器通讯时,必须要设置一个网关队列管理器,利用该网关作为二者之间的桥梁,本例中QMGRWG即为网关队列管理器,它不对应用程序数据做任何处理,而仅仅起到路由的作用。而网关队列管理器和集群外的队列管理器之间的通讯配置必须遵循传统的MQ服务器之间点对点的配置方式,即要建立相应的传输队列、远程队列和消息通道等对象。配置步骤如下:
1) 创建集群CLUSTER1,使QMGRHQ1,QMGRHQ2和QMGRGW成为该集群的成员,创建的方法同前例,在此不再赘述;
2) 在QMGRHQ1,QMGRHQ2上建立集群共享队列INPUTQ,在QMGR1和QMGR2上,分别执行MQSC命令:
DEFINE QLOCAL(INPUTQ) CLUSTER(CLUSTER1)
3) 在网关队列管理器QMGRGW上建立队列管理器别名ANY.CLUSTER,建立队列管理器别名的方法是建立一个RNAME属性为空的远程队列,在QMGRGW上执行MQSC命令:
DEFINE QREMOTE(ANY.CLUSTER) RNAME(' ') RQMNAME(' ')
4) 在QMGRA和QMGRB上建立传输队列和远程队列及通道,分别执行MQSC命令:
DEFINE QLOCAL(QMGRGW) USAGE(XMITQ)
DEFINE QREMOTE(TO.INPUTQ) RNAME(INPUTQ)
RQMNAME(ANY.CLUSTER) XMITQ(QMGRGW)
5) 通过上述配置,我们达到了这样的效果,当省级的队列管理器向总部的应用服务器的队列管理器QMGRHQ1和 QMGRHQ2发送数据时,消息将会首先被发往网关队列管理器QMGRGW,然后通过它被路由到QMGRHQ1和 QMGRHQ2上,从而被应用程序处理。这样一来,我们将业务负载均衡到了总部的多台服务器上,并且随着业务量的增加,我们可以随时增加主机,并且做到了对客户端的省级服务器的透明性,就此提高了整个系统的扩展性。同理,当我们要做反向通讯时,即我们要借助网关队列管理器从总部的QMGRHQ1和 QMGRHQ2向省级的QMGRA发送消息时,我们只需要增加如下配置:在QMGRGW上,创建在集群中共享的远程队列定义,执行MQSC命令:
DEFINE QREMOTE(PROVINCE.RECEIVE) RNAME(PROVINCE.RECEIVE) RQMNAME(QMGRA) CLUSTER(CLUSTER1)
6) 在QMGRA上,创建本地队列定义,执行MQSC命令:
DEFINE QLOCAL((PROVINCE.RECEIVE)
5. 集群的管理:
1) 集群相关的MQ命令:
DISPLAY CLUSQMGR(name):显示集群中所有队列管理器的信息
SUSPEND QMGR CLUSTER(cluster):通知集群中的其他队列管理器,表明该队列管理器暂时不可用,要注意的是,这并不意味着将该队列管理器从集群当中彻底移走。
RESUME QMGR CLUSTER(cluster):对应于SUSPEND命令,在集群中重新恢复对该队列管理器的使用。
REFRESH CLUSTER(cluster):对该命令要特别注意,千万不能从名字上去理解它的作用,它将破坏所有本地保留的与集群相关的信息,包括所有自动定义的集群通道。
RESET CLUSTER(cluster) QMNAME(name) ACTION (FORCEREMOVE):该命令用于仓储库队列管理器。它将通知仓储库某队列管理器被从集群中删除。
以上的几个命令仅仅是集群操作的基本命令,这里,我们进一步举例说明常见的一些有关集群系统管理的处理办法。
2) 从集群中除去队列管理器:
i. 使用SUSPEND命令暂停队列管理器在集群中的角色
ii. 使用stop chl命令停止该队列管理器的CLUSRCVR通道
iii. 利用alter chl(name) chltype(clusrcvr) cluster(' ')命令,通知仓储库该队列管理器离开集群
iv. 使用stop chl命令停止该队列管理器的CLUSSDR通道
v. 删除该队列管理器的CLUSSDR和CLUSRCVR通道
3) 从集群中除去集群共享队列:
i. 使用alter ql(name) put(disabled) 命令停止对该队列的操作
ii. 确保该队列为空以及与此队列相关的发送通道上不存在尚未提交的消息,相关的命令有:
iii. dis ql(name) ipprocs opprocs curdepth
iv. dis chs(*) indoubt
v. 使用delete ql命令删除该队列或使用alter ql(name) cluster(' ')命令将该队列从集群中除去
4) 向集群中增加队列管理器:
i. 为该队列管理器建立通往仓储库的CLUSSDR和CLUSRCVR通道
ii. 启动CLUSSDR通道,这将会使得该队列管理器自动向集群广播它的加入
iii. 更改集群中的仓储库队列管理器 :使用alter qmgr repos(clustername)命令将此队列管理器设置为集群的仓储库
iv. 显式地定义该队列管理器和其他仓储库队列管理器之间的CLUSSDR通道,并且启动这些通道
v. 显式地定义其他仓储库和该队列管理器之间的CLUSSDR通道,并且启动这些通道
vi. 使用alter qmgr repos(' ')命令除去原来的队列管理器的repository属性
vii. 在集群的其他队列管理器上除去那些显式定义的指向原来仓储库队列管理器的CLUSSDR通道
viii. 在集群的其他队列管理器上新建指向新建仓储库队列管理器的CLUSSDR通道