Websphere MQ Cluster
大纲:
- 1、什么是集群
- 2、建立一个基本的集群
- 3、DISPLAY命令
- 4、负载均衡
- 5、高级配置和管理
- 6、答疑
- 7、关于文章、红宝书等
一、 什么是集群
集群就是Websphere MQ 队列管理的逻辑分组,它可以帮助你:
减少了系统管理-由于更少的通道、远程队列、传输队列的定义
增加了高可用性和负载均衡-由于可以在集群中定义同名的队列实例和多个队列管理器以及在他们之间的分布式的消息
二、建立基本的集群
1. 定义集群的组织和它的名字 如果需要获得更多关于集群的信息,请参考-《WebSphere MQ Queue Manager Clusters》
2. 决定那个队列管理器是完全的存储库。你至少需要一个完全存储库,一般来说,最好是两个。完全的存储库包含了在集群中每个队列管理器和对象的 完整的信息。如果你需要多于两个的完全存储库,请参考-《 WebSphere MQ Queue Manager Clusters》中的第7章- Designing clusters。
3. 更改队列管理器的定义,添加存储库定义。
ALTER QMGR REPOS(cluster_name)
对于需要配置为完全存储库的队列管理器都可以用这个命令来定义。
4. 定义集群接受通道:CLUSRCVR
在集群中的每个队列都需要个接受方通道和一个指向它自己的连接名。
DEFINE CHANNEL(channel_name)
CHLTYPE(CLUSRCVR) TRTYPE(TCP)
CONNAME(‘my_ip_name_or_address(port)’)
CLUSTER(cluster_name)
5. 定义集群发送方通道:CLUSSDR
对完全存储库定义发送方通道。通道的名字必须和完全存储库的CLUSRCVR相匹配,不要定义CLUSSDR 指向部分存储库。
DEFINE CHANNEL(channel_name)
CHLTYPE(CLUSSDR) TRPTYP(TCP)
CONNAME(‘remote_ip_name_or_address(port)’)
CLUSTER(cluster_name)
6. 定义集群队列
在集群中的其他队列管理可以发送给它而不需要定义对它的远程队列。
只有本地队列管理器才可以从集群队列实例中读取信息。
DEFINE QLOCAL(qname)
CLUSTER(cluster_name)
7. 验证和测试集群
看下面的 display命令
使用Sample程序放入消息到集群队列中,例如:
- amqsput for distributed platforms
- CSQ4BCK1 or CSQ4BVK1 for z/OS
8. 集群架构图:
9. 架构描述:
- QM1和QM2是完全存储库
- 实线呈现了手工定义的 CLUSRCVR和 CLUSSDR通道
- 两条虚线表示自动创建的集群发送通道
- QM2和QM3主管了一些集群队列,它可以放入在集群中任何其他队列管理器中
- 所有的队列管理器都有 SYSTEM.CLUSTER.TRANSMIT.QUEUE,它可以发送信息给集群中任何其他队列管理器
10. DISPLAY QMGR
DISPLAY QMGR REPOS REPOSNL QMID
AMQ8408: Display Queue Manager details.
QMNAME(QM1) QMID(QM1_2005-07-12_17.14.38)
REPOS(QMCLUS)REPOSNL( )
QMID是一个内在创建的唯一名称,它包含了队列管理器的名字和创建队列管理器的时间。对z/OS ,时间是用16进制来表示:RTPH.BDA2D50C17934846
11. DISPLAY CLUSQMGR
DISPLAY CLUSQMGR(*) ALL
[The following output is partial—it is only for one cluster queue manager of several]
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM2) ALTDATE( )
ALTTIME( ) BATCHHB(0)
BATCHINT(0) BATCHSZ(50)
CHANNEL(TO.QM2) CLUSDATE(2007-01-09)
CLUSTER(QMCLUS) CLUSTIME(13.59.18)
CLWLPRTY(0) CLWLRANK(0)
CLWLWGHT(50) COMPHDR(NONE)
COMPMSG(NONE)
CONNAME(craigbev.dyn.webahead.ibm.com(1516))
CONVERT(NO) DEFTYPE(CLUSSDRB)
DESCR( ) DISCINT(6000)
HBINT(300) KAINT(AUTO)
LOCLADDR( ) LONGRTY(999999999)
LONGTMR(1200) MAXMSGL(4194304)
MCANAME( ) MCATYPE(THREAD)
… (continued on next slide)
(continuation of previous slide)
MCAUSER( ) MODENAME( )
MRDATA( ) MREXIT( )
MRRTY(10) MRTMR(1000)
MSGDATA( ) MSGEXIT( )
NETPRTY(0) NPMSPEED(FAST)
PASSWORD( ) PUTAUT(DEF)
QMID(QM2_2005-07-12_17.22.29) QMTYPE(REPOS)
RCVDATA( ) RCVEXIT( )
SCYDATA( ) SCYEXIT( )
SENDDATA( ) SENDEXIT( )
SEQWRAP(999999999) SHORTRTY(10)
SHORTTMR(60) SSLCAUTH(REQUIRED)
SSLCIPH( ) SSLPEER( )
STATUS(RUNNING) SUSPEND(NO)
TPNAME( ) TRPTYPE(TCP)
USERID( )
…
11. DISPLAY CLUSQMGR 备注
DEFTYPE 可以是以下任意一种类型:
CLUSSDR - 显示定义集群发送通道
CLUSSDRA - 自动定义集群发送通道 (A=auto)
CLUSSDRB - 定义集群发送通道,显示的和自动的 (B=both)
CLUSRCVR - 定义集群接受通道
自动定义的集群发送通道获取它们的属性从那些被指定在接受集群队列管理器上通信的集群接受通道的定义。你 不能直接修改一个自动定义的CLUSSDR,你不能看见它们经过DISPLAY CHANNEL。
QMTYPE 可以是REPOS(完全存储库) 或者 NORMAL(部分存储库),你不可以用DISPLAY CHSTATUS查看CLUSRCVR的状态
12. DISPLAY CHSTATUS
dis chstatus(*) all
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM2) CHLTYPE(CLUSSDR)
CONNAME(craigbev.dyn.webahead.ibm.com(1516))
CURRENT RQMNAME(QM2)
STATUS(RUNNING) SUBSTATE(MQGET)
XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM1) CHLTYPE(CLUSRCVR)
CONNAME( ) CURRENT
RQMNAME(QM3) STATUS(RUNNING)
SUBSTATE(RECEIVE) XMITQ( )
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM3) CHLTYPE(CLUSSDR)
CONNAME(craigbev.dyn.webahead.ibm.com(1517))
CURRENT RQMNAME(QM3)
STATUS(RUNNING) SUBSTATE(MQGET)
XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM1) CHLTYPE(CLUSRCVR)
CONNAME( ) CURRENT
RQMNAME(QM2) STATUS(RUNNING)
SUBSTATE(RECEIVE) XMITQ( )
13. DISPLAY QCLUSTER
DISPLAY QCLUSTER(*) ALL
AMQ8409: Display Queue details.
QUEUE(INQUIRY) TYPE(QCLUSTER)
ALTDATE(2007-01-09) ALTTIME(15.30.25)
CLUSDATE(2007-01-09) CLUSTER(QMCLUS)
CLUSQMGR(QM2) CLUSQT(QLOCAL)
CLUSTIME(15.30.25) CLWLPRTY(0)
CLWLRANK(0) DEFBIND(NOTFIXED)
DEFPRTY(0) DEFPSIST(NO)
DESCR( ) PUT(ENABLED)
QMID(QM2_2005-07-12_17.22.29)
AMQ8409: Display Queue details.
QUEUE(INQUIRY) TYPE(QCLUSTER)
ALTDATE(2007-01-09) ALTTIME(15.30.03)
CLUSDATE(2007-01-09) CLUSTER(QMCLUS)
CLUSQMGR(QM1) CLUSQT(QLOCAL)
CLUSTIME(15.30.03) CLWLPRTY(0)
CLWLRANK(0) DEFBIND(NOTFIXED)
DEFPRTY(0) DEFPSIST(NO)
DESCR( ) PUT(ENABLED)
QMID(QM1_2005-07-12_17.14.38)
14. DISPLAY QCLUSTER 说明
它仅仅显示了关于集群队列的信息。一个集群队列将不能被显示在一个部分存储库,除非应用已经打开了它。DEFBIND(NOTFIXED|OPEN) 选项影响了负载均衡,如果应用使用了MQOPEN选项MQOO_BIND_AS_Q_DEF.
15. DISPLAY QUEUE(*) CLUSINFO
DISPLAY QUEUE(*) CLUSINFO
[The following output is partial]
AMQ8409: Display Queue details.
QUEUE(SYSTEM.CLUSTER.COMMAND.QUEUE) TYPE(QLOCAL)
AMQ8409: Display Queue details.
QUEUE(SYSTEM.CLUSTER.REPOSITORY.QUEUE) TYPE(QLOCAL)
AMQ8409: Display Queue details.
QUEUE(SYSTEM.CLUSTER.TRANSMIT.QUEUE) TYPE(QLOCAL)
AMQ8409: Display Queue details.
QUEUE(TESTCLUS) TYPE(QLOCAL)
AMQ8409: Display Queue details.
QUEUE(INQUIRY) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(INQUIRY) TYPE(QCLUSTER)
这个命令显示了关于集群类型(QCLUSTER)的信息,i.e. 集群队列,此外使用QLOCAL,QALIAS,QREMOTE,和QMODEL类型。
对于集群队列,信息从队列管理器的存储库获得。部分存储库不会知道集群队列直到它已经被队列管理器打开。在z/OS,你不能从CSQINP2处命令。
16. 负载均衡
当一个集群包含一个更多的同名队列实例,负载均衡决定了最佳队列去路由消息。
考虑到:
- 可用通道,队列管理器和队列
- 如何去对了本地队列的复制(CLWLUSEQ 在V6)
在它最简洁模式,负载管理影响循环DNS效果。
MQ V6 有一个额外的参数可以被用来影响运算法则的结果。
- 队列:CLWLPRTY, CLWLRANK, CLWLUSEQ
- 队列管理器: CLWLUSEQ, CLWLMRUC
- 通道: CLWLPRTY, CLWLRANK,CLWLWGHT, NETPRTY
你可以自己编写负载均衡的出口。
当负载均衡发生的时候:
- 打开队列
MQOO_BIND_NOT_FIXED 打开选项,或者
- 使用缺省打开方式MQOO_BIND_AS_Q_DEF 和 DEFBIND(NOTFIXED) 在队列定义中设置. DEFBIND(OPEN) 是默认的。
- 把MQMD.ObjectQMgrName留为空可以允许队列管理器去选择队列实例。为了强制消息给指定的集群队列实例,在ObjectQmgrName中指定队列管理器的名字。
17. 中间配置
队列管理器可以是一个或多个集群的成员。列出这些集群用NAMELIST。你可以有多于一个的namelist去完成交叠的集群。
你可以使用REPOSNL(namelist)去更改一个完全存储库QMGR而不是用REPOS。对于通道和队列,你可以指定CLUSNL(namelist)而不是指定CLUSTER参数。
18. 涉及到的一些高级任务
Queue Manager Clusters手册的第四章描述了你如何去使用队列管理器别名,回复队列别名,队列别名允许更复杂的操作。
你可以从集群外的队列管理器输入或者使用这些配置选项从集群外的队列管理器输入。手册提供了一些示例的定义。
Queue Manager Clusters手册的第九章描述了高级任务,包括:
- 从队列管理器中删除一个集群队列
- 移动完全存储库到另外一个队列管理
- 从一个集群中删除一个队列管理器
- 删除一个集群网络
跟随以下手册的步骤执行这些任务。否则,你可能最后在集群中碰见问题。
19. 解决问题的一些技巧
- 存储库管理器是否在运行?检查AMQERRxx.log或者CHINjoblog
- 通道可以双向运行吗?Display CLUSQMGR和 CHSTATUS信息
- SYSTEM.CLUSTER队列是否可用?命令 DISPLAY QUEUE(SYSTEM.C)ALL
- SYSTEM.CLUSTER.COMMAND.QUEUE 或者SYSTEM.CLUSTER.TRANSMIT.QUEUE 消息在吗?
- 有QMIDs的副本给QMGR吗?命令 DISPLAY CLUSQMGR(*) QMID
20. 解决问题的情况
DISPLAY CLUSQMGR 可以显示 CLUSQMGR使用SYSTEM.TEMP启动的名字。队列管理器仍然没有接受到完全存储库中的所有必要信息。
集群缓存在z/OS上。查看 technote 1240731 针对由于集群分布式队列管理器引起的问题。在MQ V6,你可以设置CLCACHE(DYNAMIC)给动态的增加缓存存储。对于z/OS,CSQXRRMF模块在当前级别上吗?
21. 解决问题-刷新和重设
刷新集群和重设集群不需要在正常环境下命令。当有错误的配置或者缺乏连接性,这个连接性在这样的情况下更坏,它们将不能修复集群。
刷新:
刷新集群移出和重建关于集群的本地信息。
REFRESH CLUSTER(clustername) REPOS(NO)
REFRESH CLUSTER(clustername) REPOS(YES)
同样刷新关于完全存储库管理器的信息,它不能从完全存储库执行命令。
REFRESH CLUSTER(*)
重设:
重设集群是从完全存储库队列管理器执行的。它强制的移出了集群中的队列管理器和指定的QMID。The
- RESET CLUSTER(clustername)
QMNAME(qmname) ACTION(FORCEREMOVE) QUEUES(NO)
- RESET CLUSTER(clustername) QMID(qmid)
ACTION(FORCEREMOVE) QUEUES(NO)
22. Web支持和手册
WebSpere MQ 产品支持页面:
http://www-306.ibm.com/software/integration/wmq/support/.
The MQ Library:
http://www-306.ibm.com/software/integration/wmq/library/
WebSphere MQ Queue Manager Clusters manual:
- SC34-6061-02 for MQ 5.3.x
- SC34-6589-00 for MQ 6.0
- “Appendix A. Troubleshooting” lists common error
symptoms and causes plus some problem scenarios with
their resolutions