(八)IBMMQ集羣與集羣外的IBMMQ節點通訊-環境搭建

前言:在現實的場景中,若當前生產環境使用的IBMMQ單點更換爲IBMMQ集羣,則會有這樣一種情況:我們負責的系統使用IBMMQ集羣,須進行對接的一個外部系統使用IBMMQ單點。這裏對這種情況進行模擬,並對使用中的各種場景進行測試。

1.資源準備

IP usage 備註
192.168.137.11 完全存儲庫CCQM1 主網關
192.168.137.12 完全存儲庫CCQM2 備網關
192.168.137.13 部分存儲庫CCQM3
192.168.137.14 部分存儲庫CCQM4
192.168.137.15 部分存儲庫CCQM5
192.168.137.16 外部節點CCQM6

2. 集羣搭建

集羣網關的作用是與外部進行交互,使用隊列管理器別名的方式提供連接名稱,可隱藏真正的隊列管理器名稱與內部細節
這裏爲方便大家測試,將完整集羣搭建腳本放出

2.1 完全存儲庫CCQM1

#! /bin/bash
QmgrName=CCQM1
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
#設置該隊列管理器爲集羣(MYClUSTER)的完全倉儲庫
echo "ALTER QMGR REPOS(CLUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)接收通道
echo "DEFINE CHANNEL(TO.CCQM1) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.137.11(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)發送通道
echo "DEFINE CHANNEL(TO.CCQM2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.137.12(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

######################################創建網關命令#############################################
#定義接收方通道
echo "DEFINE CHANNEL (TO.CLUSTER_CC) CHLTYPE (RCVR) TRPTYPE (TCP)" | runmqsc $QmgrName
#在網關隊列管理器QMGRGW上建立隊列管理器別名ANY.CLUSTER,建立隊列管理器別名的方法是建立一個RNAME屬性爲空的遠程隊列
echo "DEFINE QREMOTE(ClUSTER_CC.GW) RNAME('') RQMNAME('')" | runmqsc $QmgrName

#同理,當我們要做反向通訊時,即我們要藉助網關隊列管理器從總部的QMGRHQ1和 QMGRHQ2向省級的QMGRA發送消息時,我們只需要增加如下配置:
#在QMGRGW上,創建在羣集中共享的遠程隊列定義
#定義本地傳輸隊列
echo "DEFINE QLOCAL(CCQM6) DEFPRTY(9) USAGE(xmitq)" | runmqsc $QmgrName
#定義發送方通道
echo "DEFINE CHANNEL(ClUSTER_CC.CCQM6) CHLTYPE(sdr) CONNAME('192.168.137.16(1417)') XMITQ(CCQM6) TRPTYPE(tcp)" | runmqsc $QmgrName
#啓動發送方通道
echo "START CHANNEL(ClUSTER_CC.CCQM6)" | runmqsc $QmgrName
#定義遠程隊列 ,傳輸回執消息
echo "DEFINE QREMOTE(PROVINCE.RECEIVE) RNAME(PROVINCE.RECEIVE) RQMNAME(CCQM6) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

2.2 完全存儲庫CCQM2

#! /bin/bash
QmgrName=CCQM2
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
#設置該隊列管理器爲集羣(MYClUSTER)的完全倉儲庫
echo "ALTER QMGR REPOS(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)接收通道
echo "DEFINE CHANNEL(TO.CCQM2) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.137.12(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)發送通道
echo "DEFINE CHANNEL(TO.CCQM1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.137.11(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

######################################創建網關命令#############################################
#定義接收方通道
echo "DEFINE CHANNEL (TO.CLUSTER_CC) CHLTYPE (RCVR) TRPTYPE (TCP)" | runmqsc $QmgrName
#在網關隊列管理器QMGRGW上建立隊列管理器別名ANY.CLUSTER,建立隊列管理器別名的方法是建立一個RNAME屬性爲空的遠程隊列
echo "DEFINE QREMOTE(ClUSTER_CC.GW) RNAME('') RQMNAME('')" | runmqsc $QmgrName

#同理,當我們要做反向通訊時,即我們要藉助網關隊列管理器從總部的QMGRHQ1和 QMGRHQ2向省級的QMGRA發送消息時,我們只需要增加如下配置:
#在QMGRGW上,創建在羣集中共享的遠程隊列定義
#定義本地傳輸隊列
echo "DEFINE QLOCAL(CCQM6) DEFPRTY(8) USAGE(xmitq)" | runmqsc $QmgrName
#定義發送方通道
echo "DEFINE CHANNEL(ClUSTER_CC.CCQM6) CHLTYPE(sdr) CONNAME('192.168.137.16(1417)') XMITQ(CCQM6) TRPTYPE(tcp)" | runmqsc $QmgrName
#啓動發送方通道
echo "START CHANNEL(ClUSTER_CC.CCQM6)" | runmqsc $QmgrName
#定義遠程隊列
echo "DEFINE QREMOTE(PROVINCE.RECEIVE) RNAME(PROVINCE.RECEIVE) RQMNAME(CCQM6) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

2.3 部分存儲庫CCQM3

#! /bin/bash
QmgrName=CCQM3
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)接收通道
echo "DEFINE CHANNEL(TO.CCQM3) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.137.13(1417)') CLUSTER(CLUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)發送通道
echo "DEFINE CHANNEL(TO.CCQM1) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.137.11(1417)') CLUSTER(CLUSTER_CC)" | runmqsc $QmgrName
#定義集羣共享隊列
echo "DEFINE QLOCAL(CQ1) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
echo "DEFINE QLOCAL(CQ2) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

2.4 部分存儲庫CCQM4

#! /bin/bash
QmgrName=CCQM4
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)接收通道
echo "DEFINE CHANNEL(TO.CCQM4) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.137.14(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)發送通道
echo "DEFINE CHANNEL(TO.CCQM2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.137.12(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣共享隊列
echo "DEFINE QLOCAL(CQ1) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
echo "DEFINE QLOCAL(CQ2) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

2.5 部分存儲庫CCQM5

#! /bin/bash
QmgrName=CCQM5
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)接收通道
echo "DEFINE CHANNEL(TO.CCQM5) CHLTYPE(CLUSRCVR) TRPTYPE(TCP) CONNAME('192.168.137.15(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣(MYClUSTER)發送通道
echo "DEFINE CHANNEL(TO.CCQM2) CHLTYPE(CLUSSDR) TRPTYPE(TCP) CONNAME('192.168.137.12(1417)') CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
#定義集羣共享隊列
echo "DEFINE QLOCAL(CQ1) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName
echo "DEFINE QLOCAL(CQ2) CLUSTER(ClUSTER_CC)" | runmqsc $QmgrName

3.集羣外部節點的搭建

3.1 外部節點CCQM6

#! /bin/bash
QmgrName=CCQM6
#創建隊列管理器
crtmqm $QmgrName
#啓動隊列管理器
strmqm $QmgrName
#定義一個服務器連接通道
echo "DEFINE CHANNEL(TESTCHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')" | runmqsc $QmgrName
#定義監聽器
echo "DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1417)" | runmqsc $QmgrName
#隊列管理器權限,禁用認證
echo "SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)" | runmqsc $QmgrName
echo "ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)" | runmqsc $QmgrName
#啓動監聽器
echo "START LISTENER(LISTENER.TCP)" | runmqsc $QmgrName
#禁用通道驗證
echo "alter qmgr chlauth(disabled)" | runmqsc $QmgrName
#刷新安全策略
echo "REFRESH SECURITY TYPE(CONNAUTH)" | runmqsc $QmgrName
##############################建立傳輸隊列                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ###############################
#建立傳輸隊列
echo "DEFINE QLOCAL(CLUSTER_CC.GW) USAGE(XMITQ)" | runmqsc $QmgrName
#建立遠程隊列
echo "DEFINE QREMOTE(CQ1) RNAME(CQ1) RQMNAME(CLUSTER_CC.GW) XMITQ(CLUSTER_CC.GW)" | runmqsc $QmgrName
echo "DEFINE QREMOTE(CQ2) RNAME(CQ2) RQMNAME(CLUSTER_CC.GW) XMITQ(CLUSTER_CC.GW)" | runmqsc $QmgrName
#建立發送方通道(填入主備網關的連接地址,出現問題時會自行切換)
echo "DEFINE CHANNEL(TO.CLUSTER_CC) CHLTYPE(sdr) CONNAME('192.168.137.11(1417),192.168.137.12(1417)') XMITQ(CLUSTER_CC.GW) TRPTYPE(tcp)" | runmqsc $QmgrName
#定義接收方通道
echo "DEFINE CHANNEL(CLUSTER_CC.CCQM6) CHLTYPE(RCVR) TRPTYPE(TCP)" | runmqsc $QmgrName
#創建本地隊列,接收回執消息
echo "DEFINE QLOCAL(PROVINCE.RECEIVE)" | runmqsc $QmgrName

4. 環境測試

描述:向隊列管理器CCQM6中的遠程隊列CQ1,CQ2發送消息,查看集羣中CCQM3-CCQM5節點中的隊列CQ1,CQ2是否收到消息。

4.1 向隊列管理器CCQM6中的遠程隊列CQ1,CQ2發送消息

在這裏插入圖片描述

4.2 在集羣中的負載節點取消息

4.2.1 從節點CCQM3取消息

在這裏插入圖片描述

4.2.2 從節點CCQM4取消息

在這裏插入圖片描述

4.2.3 從節點CCQM5取消息

在這裏插入圖片描述

4.3 從集羣負載節點向回執隊列寫入消息

4.3.1 從節點CCQM3寫入回執消息

在這裏插入圖片描述

4.3.2 從節點CCQM4寫入回執消息

在這裏插入圖片描述

4.3.3 從節點CCQM5寫入回執消息

在這裏插入圖片描述

4.4 從集羣外部節點CCQM6中讀取回執隊列的消息

在這裏插入圖片描述

4.5 結論

由以上幾步驗證證明,消息從集羣外部節點向集羣發送消息時能夠正常發送,並且集羣能夠對消息負載均衡,集羣內部對回執隊列寫的消息在外部節點也能夠正常讀取。說明此次環境搭建無問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章