2015-08-19 56 views
1

我创建了一个包含3个QMgr的WMQ集群。 2完整存储库和1个部分存储库。下面是使用mqscWebsphere MQ集群工作负载平衡:邮件进入死信队列

crtmqm GW 
strmqm GW 
runmqsc GW 
alter qmgr deadq('SYSTEM.DEAD.LETTER.QUEUE') 
define listener(gw.listener) trptype(TCP) port(1416) ipaddr(xx.xx.xx.xx) 
start listener(gw.listener) 
define channel(SYSTEM.ADMIN.SVRCONN) chltype(svrconn) 
ALTER QMGR CHLAUTH(DISABLED) 
end 

runmqsc QM01 
alter qmgr repos('DEVELOPMENT.CLUSTER') 
end 

runmqsc QM02 
alter qmgr repos('DEVELOPMENT.CLUSTER') 
end 

runmqsc QM01 
define chl(to.QM01) chltype(clusrcvr) trptype(tcp) + 
     conname('xx.xx.xx.xx(1414)') cluster(DEVELOPMENT.CLUSTER) 
end 

runmqsc QM02 
define chl(to.QM02) chltype(clusrcvr) trptype(tcp) + 
     conname('xx.xx.xx.xx(1415)') cluster(DEVELOPMENT.CLUSTER) 
end 

runmqsc GW 
define chl(to.GW) chltype(clusrcvr) trptype(tcp) + 
     conname('xx.xx.xx.xx(1416)') cluster(DEVELOPMENT.CLUSTER) 
end 

runmqsc QM01 
DEFINE CHANNEL(TO.QM02) CHLTYPE(CLUSSDR) TRPTYPE(TCP) + 
     CONNAME('xx.xx.xx.xx(1415)') CLUSTER(DEVELOPMENT.CLUSTER) 
end 

runmqsc QM02 
DEFINE CHANNEL(TO.QM01) CHLTYPE(CLUSSDR) TRPTYPE(TCP) + 
     CONNAME('xx.xx.xx.xx(1414)') CLUSTER(DEVELOPMENT.CLUSTER) 
end 

runmqsc GW 
DEFINE CHANNEL(TO.QM01) CHLTYPE(CLUSSDR) TRPTYPE(TCP) + 
     CONNAME('xx.xx.xx.xx(1414)') CLUSTER(DEVELOPMENT.CLUSTER) 
DEFINE CHANNEL(TO.QM02) CHLTYPE(CLUSSDR) TRPTYPE(TCP) + 
     CONNAME('xx.xx.xx.xx(1415)') CLUSTER(DEVELOPMENT.CLUSTER) 
end 

runmqsc QM02 
define qlocal('BACKUP') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('PROVIDER') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('RESPONSE') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('STORE') CLUSTER(DEVELOPMENT.CLUSTER) 
REFRESH CLUSTER(DEVELOPMENT.CLUSTER) REPOS(YES) 
end 

runmqsc QM01 
define qlocal('BACKUP') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('PROVIDER') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('RESPONSE') CLUSTER(DEVELOPMENT.CLUSTER) 
define qlocal('STORE') CLUSTER(DEVELOPMENT.CLUSTER) 
REFRESH CLUSTER(DEVELOPMENT.CLUSTER) REPOS(YES) 
end 

现在我把消息QMGR GW队列PROVIDER。请注意,GW不承载此队列。它是由QM01QM02

amqsput PROVIDER GW 

可悲的是所有的消息都将在QMGR GW的死信队列主持。

请帮助解决此问题。任何有关调试的建议都会有所帮助。

回答

2

这里有几个可能的问题。

通道没有相同的定义。有些是混合大小写的名称,有些则全是大写字母。这个可能工作,如果你指望缺乏报价,以确保他们都被QMgr折叠成大写。但是,这些命令显然已被编辑,至少就CONNAME值而言,所以我并不假定结果对象是匹配的。

创建群集后,您是否检查所有通道显示为AUTO-EXPLICIT?这就是您知道集群正确启动的方式。

命令REFRESH CLUSTER也可能导致停机。定义新对象时这不是必需的,事实上这是相当具有破坏性的。它会等待通道重新启动,并且在运行该命令的时间点,用于通告新对象的命令已发送到存储库,但不会返回。 REFRESH CLUSTER然后请求通道停止(可能在批处理中),将群集的命令排队以删除刚收到但尚未回复的信息,然后向群集发送新命令,以通告它刚刚删除的对象。如果这听起来令人困惑,请考虑存储库上的集群命令服务器的感受。

从队列定义脚本中删除REFRESH CLUSTER命令。

一旦确定通道全部前进到AUTO-EXPLICIT并删除了REFRESH CLUSTER,您就可以开始实际的调试。在这些情况下,真正有助于查看死信息的DLQ标题,以找出代码列出的原因。这通常提供足够的信息来找到问题。您还可以启用各种QMgr诊断事件并使用其中一种事件查看工具查看它们,或查看通道任一端的QMgrs上的错误日志。


这些未来的建议无关,与你的诊断,除QMGR其他使用最佳实践建成后将一般是不容易出错,更容易调试。这里有一些未经请求的MQ集群最佳实践建议。

  • 放弃TO.[QMGR]频道名称!改为使用[cluster].[qmgr]名称,例如DEVCLUS.QM01。这可确保即使您有重叠的群集,您也将始终拥有专用于每个群集的通道。但是,它确实意味着群集名称中不能有.,并且必须是< 10个字符。
  • 对于不是完整存储库的事情,请仅为其中一个存储库定义明确的CLUSSDR。如果您拥有两个以上的存储库(例如在迁移期间),群集成员将能够以这种方式找到它。
  • 请务必在您的定义中使用引号。如果您在解决问题时遇到问题,那么只有一种可能解释的定义是解决问题的一条较短路径。
  • 定义一个新的群集通道时给通道一段时间以确定通道,并确认它启动并进入正确的状态。
  • 使用AMQSPUT可打开新定义的远程托管群集队列以进行输出,但不实际向其发送消息。确保在打开期间没有错误(即队列解析),然后确保群集通道已启动。 然后执行amqsput并发送消息。
  • REFRESH CLUSTER是用于部分存储库的命令,而RESET CLUSTER是要在完整存储库上使用的命令。在这种情况下,该命令正在被错误地使用,并且集群节点类型错误。预计会出现问题。
  • 希望在现实生活中没有托管在完整存储库QMgrs上的应用程序队列。您可以为集群做的最好的事情是在专用QMgrs上托管完整的存储库 - 即使这些是与应用程序QMgrs在同一主机上的额外QMgr。将它们分开可确保群集操作流量和应用程序流量永远不会遍历相同的通道。它还可以在应用程序QMgrs之前修补或升级存储库。