2015-08-19 67 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之前修補或升級存儲庫。