搭建Websphere MQ 集群實現負載均衡(一)

前天,在某銀行現場,幫客戶搭建一個MQ的集群,實現負載均衡功能,下面就說說MQ 集群,實現負載均衡的原理和搭建方法:

IBM WebSphere MQ (Message Queue) 是目前應用最多的消息中間件產品,它簡化了應用程序之間的數據傳輸,提供了統一的通信標準,確保分佈式網絡環境下可靠的、跨平台的信息傳輸和數據交換。應 用程序只需要將消息發送給 MQ,由 MQ 負責將消息安全可靠地發送出去。
Websphere MQ 支持集群功能。多個隊列管理器可以分佈在不同的機器上。集群功能簡化了系統配置,不需要在每個隊列管理器上創建消息通道、遠程隊列定義和傳輸隊列。使用集群技術可以提高系統的可用性和實現負載均衡。

MQ 集群概述

對於 MQ 兩個隊列管理器之間的通信,需要創建相應的對象。在發送隊列管理器上,要創建一個遠程隊列,這個遠程隊列指向遠程的目的地隊列。還要創建一個傳輸隊列做為 存儲轉發隊列以及一個發送通道指向接收隊列管理器。在接收隊列管理器上,要創建一個本地隊列和一個接收通道。如果一個網絡中有多個隊列管理器,並且兩兩之 間要實現通信時,需要創建多個遠程隊列、傳輸隊列和發送通道。
為了簡化點對點通信的系統配置,通過 MQ 提供的群集功能,減少了集群中隊列管理器上的 MQ 對象數量。群集內的兩個隊列管理器之間的通信,不需要兩兩間建立消息通道,而是使用群集通道與其它成員通信。只需要在每個隊列管理器上創建兩個集群通道。 一個集群接收通道用來從集群中的其他隊列管理器接收消息。一個集群發送通道用來發送消息。
集群的倉儲庫中含有集群的信息,如隊列管理器的位置,通道等信息。倉儲庫分為完整倉儲庫隊列管理器和部分倉儲庫隊列管理器。完整倉儲庫隊列管理器有集群中 所有隊列管理器的信息。而部分倉儲庫隊列管理器中只有自身的和它要通信的隊列管理器的信息。部分隊列管理器通過與完整隊列管理器通信,查詢到相關的集群信 息。
集群中共享的隊列叫做集群隊列。集群中的其他隊列管理器可以向集群隊列發送消息而不需要創建對應的遠程隊列定義。通常會在集群中創建多個同名的集群隊列實 例,分佈在不同隊列管理器上。當消息發送到集群隊列時,MQ 會通過負載平衡算法,決定消息實際發送到哪裡隊列管理器的隊列上。

創建 MQ 集群環境

創建一個簡單的 MQ 集群一般需要兩個完整倉儲庫隊列管理器和兩個部分倉儲庫隊列管理器。其中兩個完整倉儲庫隊列管理器相互形成備份。本文示例中包括,兩個完整倉儲庫隊列管理器和兩個部分倉儲庫隊列管理器,以及在兩個部分倉儲庫隊列管理器上各創建一個集群隊列。

用命令行創建集群

清單 1. 創建隊列管理器

crtmqm -h 1024 -lp 20 -ls 5 -u FULL_QM1.DLQ FULL_QM1
strmqm FULL_QM1
runmqsc FULL_QM1
DEFINE LISTENER (‘LISTENER.TCP’) TRPTYPE (TCP) PORT (5000) CONTROL (QMGR)
START LISTENER (‘LISTENER.TCP’)
DEFINE CHANNEL (‘SYSTEM.ADMIN.SVRCONN’)
CHLTYPE (SVRCONN)
END

在清單 1 中,創建了一個隊列管理器 FULL_QM1。並且指定了這個隊列管理器的監聽端口為 5000。然後用同樣的方法分別創建隊列管理器 FULL_QM2,PART_QM1 和 PART_QM2,指定隊列管理器的監聽端口為 5001,5002 和 5003。
在創建完隊列管理器後,需要將 FULL_QM1 和 FULL_QM2 添加到集群 NEW_CLUSTER 中,作為完整倉儲庫隊列管理器。如清單 2 所示。

清單 2. 添加完整倉儲庫定義

echo 「ALTER QMGR REPOS (‘NEW_CLUSTER’)」 | runmqsc FULL_QM1
echo 「ALTER QMGR REPOS (‘NEW_CLUSTER’)」 | runmqsc FULL_QM2

在集群中,無論一個隊列管理器要連接多少個遠程隊列管理器,最少只要創建一個集群發送通道和一個集群接收通道。
每個隊列管理器都需要一個接收通道指向自己。對於隊列管理器 FULL_QM1,要指定連接名 CONNAME 中的 ip 地址和端口號為 FULL_QM1 自己的 ip 地址和監聽端口號。對於其他的隊列管理器也一樣。在清單 3 中,創建了集群中四個隊列管理器的接收通道。

清單 3. 在隊列管理器上創建接收通道

echo 「DEFINE CHANNEL (‘TO.FULL_QM1’) CHLTYPE (CLUSRCVR) TRPTYPE (TCP) CONNAME  (‘127.0.0.1(5000)’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc FULL_QM1

echo 「DEFINE CHANNEL (‘TO.FULL_QM2’) CHLTYPE (CLUSRCVR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5001)’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc FULL_QM2

echo 「DEFINE CHANNEL (‘TO.PART_QM1’) CHLTYPE (CLUSRCVR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5002)’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc PART_QM1

echo 「DEFINE CHANNEL (‘TO.PART_QM2’) CHLTYPE (CLUSRCVR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5003)’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc PART_QM2

每個隊列管理器需要一個發送通道。在清單 4 中,定義了集群中四個隊列管理器的發送通道。需要注意的是,對於兩個完整倉儲庫隊列管理器,需要建立相互間的發送通道。如對於完整倉儲庫隊列管理器 FULL_QM1,需要建立到 FULL_QM2 的發送通道,發送通道的名字要和 FULL_QM2 的接收通道名字相同。並且要指定連接名 CONNAME 中的 ip 地址和端口號為 FULL_QM2 的 ip 地址和端口號。
而對於部分倉儲庫隊列管理器,需要建立與某個或多個完整倉儲庫隊列管理器的發送通道。對於 PART_QM1,這裡建立了到完整倉儲庫隊列管理器 FULL_QM1 的發送通道,並且發送通道的名字要和 FULL_QM1 的接收通道名字相同。連接名 CONNAME 也要指定為 FULL_QM1 的 ip 地址和端口號。另外,不需要定義 PART_QM1 指向另一個部分倉儲庫隊列管理器 PART_QM2 的發送通道。

清單 4. 在隊列管理器上創建發送通道

echo 「DEFINE CHANNEL (‘TO.FULL_QM2’) CHLTYPE (CLUSSDR) TRPTYPE  (TCP) CONNAME (‘127.0.0.1(5001)’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc FULL_QM1

echo 「DEFINE CHANNEL (‘TO.FULL_QM1’) CHLTYPE (CLUSSDR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5000)’) CLUSTER (‘NEW_CLUSTER’) 」 | runmqsc FULL_QM2

echo 「DEFINE CHANNEL (‘TO.FULL_QM1’) CHLTYPE (CLUSSDR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5000)’) CLUSTER (‘NEW_CLUSTER’) 」 | runmqsc PART_QM1

echo 「DEFINE CHANNEL (‘TO.FULL_QM2’) CHLTYPE (CLUSSDR)  TRPTYPE (TCP) CONNAME (‘127.0.0.1(5001)’) CLUSTER (‘NEW_CLUSTER’) 」 | runmqsc PART_QM2

集群的負載均衡是通過在集群內的不同隊列管理器上建立同名的隊列,即創建同一個隊列的多個實例來實現的。每個隊列實例都可以作為消息的目的地,MQ 使用負載平衡算法決定消息實際發送到哪個隊列管理器。清單 5 中,在兩個部分倉儲庫隊列管理器上分別定義了一個集群隊列 TEST_QUEUE,並且指定其 Cluster 屬性值為 NEW_CLUSTER,這樣這兩個同名隊列就可以在集群中共享了。

清單 5. 在兩個部分倉儲庫隊列管理器上定義集群隊列

echo 「DEFINE QLOCAL (‘TEST_QUEUE’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc PART_QM1

echo 「DEFINE QLOCAL (‘TEST_QUEUE’) CLUSTER (‘NEW_CLUSTER’)」 | runmqsc PART_QM2

至此,已創建完一個簡單的集群。可以通過 DISPLAY CLUSQMGR 命令來顯示集群中的隊列管理器的相關信息。清單 6 中列出了部分的信息。連接到完整倉儲庫隊列管理器 FULL_QM1,在結果中共顯示了四條通道。其中 TO.FULL_QM1 類型為 CLUSRCVR,指向 FULL_QM1,是接收通道。TO.FULL_QM2 為發送通道,指向 FULL_QM2,類型 CLUSSDRB 說明是顯示創建的。TO.PART_QM1 和 TO.PART_QM2 是發送通道,分別指向 PART_QM1 和 PART_QM2,類型都為 CLUSSDRA,是集群自動生成的。

清單 6. 集群中隊列管理器的信息

echo 「DISPLAY CLUSQMGR(*) CLUSTER(‘NEW_CLUSTER’) ALL」 | runmqsc FULL_QM1

CLUSQMGR(FULL_QM1)
CHANNEL(TO.FULL_QM1)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5000))
DEFTYPE(CLUSRCVR)

CLUSQMGR(FULL_QM2)
CHANNEL(TO.FULL_QM2)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5001))
DEFTYPE(CLUSSDRB)

CLUSQMGR(PART_QM1)
CHANNEL(TO.PART_QM1)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5002))
DEFTYPE(CLUSSDRA)

CLUSQMGR(PART_QM2)
CHANNEL(TO.PART_QM2)
CLUSTER(NEW_CLUSTER)
CONNAME(127.0.0.1(5003))
DEFTYPE(CLUSSDRA)

通過 DISPLAY QUEUE 命令顯示集群中隊列的相關信息,如清單 7 所示。連接到完整倉儲庫隊列管理器 FULL_QM1 上,在結果中共顯示了兩個集群隊列實例 TEST_QUEUE。

清單 7. 集群隊列的信息

echo 「DISPLAY QUEUE(*) CLUSINFO」 | runmqsc FULL_QM1

QUEUE(TEST_QUEUE)  TYPE(QCLUSTER)
QUEUE(TEST_QUEUE)  TYPE(QCLUSTER)

通過這些命令,可以了解集群的具體結構。圖 1 是當前顯示創建的集群 NEW_CLUSTER 的拓撲圖。對於 PART_QM1,我們只是顯示創建了 PART_QM1 到 FULL_QM1 的發送通道,之後集群會自動創建 PART_QM1 到 FULL_QM2 的發送通道。同樣集群也會自動創建 PART_QM2 到 FULL_QM1 的發送通道。最後形成的集群拓撲圖如圖 2 所示。

1. 顯示創建的集群 NEW_CLUSTER 的拓撲圖

2. 集群 NEW_CLUSTER 的拓撲圖

以下文章點擊率最高

Loading…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營

發表評論

您的電子郵箱地址不會被公開。 必填項已用*標註