MQ多實例隊列管理器高可用架構(二)

1.   多實例隊列管理器架構考慮

通道和客戶機重新連接是備用隊列管理器實例進入活動狀態後進行的消息恢復處理的關鍵部分。

多實例隊列管理器實例安裝在具有不同網絡地址的服務器上。需要對 WebSphere MQ 通道和客戶機(具有所有隊列管理器實例的連接信息)進行配置。備用隊列管理器實例進行接管時,客戶機和通道將自動地重新連接到新網絡地址處的新進入活動狀態的隊列管理器實例。用於 Java 的 WebSphere MQ 類不支持客戶機自動重新連接。

多實例隊列管理器架構與高可用性環境(如 HACMP)為集群提供虛擬 IP 地址以及將該地址傳遞到活動服務器的方式不同。WebSphere MQ 重新連接功能不會更改或重新路由 IP 地址。它的工作方式是,使用通道定義和客戶機連接中定義的網絡地址進行重新連接。

4.1 集群通道

通常,不需要進行附加的配置即可使多實例隊列管理器在集群中工作。

如果隊列管理器連接至倉儲庫隊列管理器,該倉儲庫將從該隊列管理器上 CLUSRCVR 通道的 CONNAME 中發現該隊列管理器的網絡地址。對於 TCPIP 而言,如果省略 CONNAME 或者將其配置為空,那麼隊列管理器將自動設置此參數。備用實例進行接管時,它的 IP 地址將作為 CONNAME 而替換先前活動實例的 IP 地址。

4.2 非集群通道

通道的 CONNAME 屬性是逗號分隔的連接名稱列表;例如 CONNAME(‘92.46.1.1(1415), 85.42.3.8(2423)’)。系統會按照連接列表中指定的順序來嘗試那些連接,直到成功地建立一個連接為止。如果未能成功建立連接,那麼通道將嘗試重新連接。

4.3 客戶端應用程序

客戶機連接可以使用連接列表或隊列管理器組來選擇備用連接。需要強調,用於 Java 的 WebSphere MQ 類不支持客戶機自動重新連接。

隊列管理器組是在客戶機通道定義表(CCDT)中定義的連接集合。客戶機連接通道定義存儲在與服務器上運行的隊列管理器相關聯的客戶機通道定義表中。 包含表的文件稱為 AMQCLCHL.TAB,並且是一個無法直接編輯的二進制文件。可以使用 DEFINE CHANNEL 命令在表中添加客戶機連接通道,使用 ALTER CHANNEL 命令改變表中已有條目的通道的屬性。

連接列表是指通道定義中CONNAME以逗號分隔的機器名稱列表,按照連接列表中指定的順序嘗試建立連接,直到成功建立為止。如果未成功建立連接,那麼通道將啟動重試處理過程。

通過配置多個組件,可以使客戶機應用程序自動進行重新連接,而不必編寫任何其他代碼。自動重新連接可以在客戶機應用程序中的任意位置自動恢復連接,並且恢復所有用於打開對象的句柄。相反,手動重新連接要求客戶機應用程序使用 MQCONN 或 MQCONNX 來重新創建連接並重新打開對象。

自動重新連接具有下列配置要求:

組件 要求 對不符合要求的返回
WebSphere MQ 客戶機安裝 級別 7.0.1 MQRC_OPTIONS_ERROR
WebSphere MQ 服務器安裝 級別 7.0.1 MQRC_OPTIONS_ERROR
通道 SHARECNV > 0 MQRC_ENVIRONMENT_ERROR
應用程序環境 必須線程化 MQRC_ENVIRONMENT_ERROR
MQI 將 MQCONNX 的 MQCNO Option 設置為 MQCNO_RECONNECT 或 MQCNO_RECONNECT_Q_MGR MQCC_FAILED(在連接中斷或者隊列管理器結束)

需要注意的是,MQCNO Option 參數僅MQCONNX需要設置,MQCONN不需要設置。另外,MQCNO Option 參數與mqclient.ini 配置文件的 Channels 節中設置 DefRecon 屬性配合使用。DefRecon 選項的解釋決於 MQCNO_RECONNECT_* 值是否仍在客戶機程序中設置以及設置為何值。如果客戶機程序使用 MQCONN 進行連接,或使用 MQCONNX 設置 MQCNO_RECONNECT_AS_DEF 選項,那麼 DefRecon 設置的重新連接值將會生效。如果程序中沒有設置重新連接值,或 DefRecon 選項沒有設置重新連接值,那麼客戶機程序不會自動重新連接。具體情況如下:

DefRecon=NO|YES|QMGR|DISABLED

  • NO

除非 MQCONNX 覆蓋此選項,否則客戶機不會自動重新連接。

  • YES

除非 MQCONNX 覆蓋此選項,否則客戶機將自動重新連接。

  • QMGR

除非 MQCONNX 覆蓋此選項,否則客戶機將自動重新連接,但僅至同一隊列管理器。QMGR 選項與 MQCNO_RECONNECT_Q_MGR 的作用相同。

  • DISABLED

禁用重新連接,即使客戶機程序使用 MQCONNX MQI 調用進行請求。

 

4.4 客戶機自動重新連接後

WebSphere MQ 客戶機環境會注意故障轉移本身,並在重新連接之後通過在客戶機中存儲某些狀態信息以及代表客戶機應用程序發出其他 MQI 調用以恢復它的 WebSphere MQ 狀態,來恢復儘可能多的上下文。例如,將恢複發生故障時已打開的對象的句柄,並且將打開同名的臨時動態隊列。但是,有一些更改不可避免,您需要進行設計以處理這些更改。這些更改可以分為 5 類:

  • MQI 調用將返回新的或者先前未診斷的錯誤,直到應用程序恢復一致的新上下文狀態為止。
  • 非持續性消息可能會丟失。
  • 事務將被回滾。
  • 在同步點外部使用的 MQGET 或 MQPUT 調用可能被中斷,且有可能丟失消息。
  • 計時引起的錯誤(由於在 MQI 調用中長時間等待所致)。

關於丟失的上下文的一些詳細信息列示在下列部分中。

  • 除非通過 NPMCLASS(HIGH) 選項將非持久消息放入一個隊列,並且隊列管理器故障未中斷「關閉時存儲非持久消息」這一選項,否則將廢棄那些消息。
  • 連接中斷時,非持久預訂將丟失。在重新連接時,將重新建立非持久預訂。考慮使用持久預訂。
  • 將重新計算獲取等待時間間隔;如果超出其限制,那麼將返回 MQRC_NO_MSG_AVAILABLE。同樣,將重新計算預訂到期時間,以給出相同的整體到期時間。
  • 瀏覽游標在隊列中的位置將丟失;此位置通常在第一條消息前重新確定。

指定了 MQGMO_BROWSE_MSG_UNDER_CURSOR 或 MQGMO_MSG_UNDER_CURSOR 的 MQGET 調用失敗,原因碼為 MQRC_NO_MSG_AVAILABLE。

供瀏覽的已鎖定消息將被解鎖。

瀏覽所標記的具有句柄作用域的消息將被取消標記,並可以被再次瀏覽。

在大多數情況下,將取消標記協同瀏覽所標記的消息。

  • 安全上下文丟失。嘗試使用保存的消息上下文(例如,在指定了 MQPMO_PASS_ALL_CONTEXT 的情況下放置消息)失敗,原因碼為 MQRC_CONTEXT_NOT_AVAILABLE。
  • 消息標記丟失。使用消息標記執行的 MQGET 返回原因碼 MQRC_NO_MSG_AVAILABLE。

註: 作為消息組成部分的 MsgId 和 CorrelId 在故障轉移期間將與消息一起保留下來,因此,使用 MsgId 或 CorrelId 執行的 MQGET 將以預期方式工作。

  • 在未落實事務中同步點下的隊列上所放置的消息不再可用。
  • 以邏輯順序處理消息或者處理消息組中的消息將導致重新連接後發出返回碼 MQRC_RECONNECT_INCOMPATIBLE。
  • MQI 調用可能會返回 MQRC_RECONNECT_FAILED,而不是返回目前客戶機通常接收的更一般的 MQRC_CONNECTION_BROKEN。
  • 如果 WebSphere MQ 客戶機收不到隊列管理器的響應,那麼重新連接成功後將返回 MQRC_CALL_INTERRUPTED,以指示下列操作的成功或失敗:

在同步點外部使用 MQPUT 調用來傳遞持久消息。

在同步點外部使用 MQPUT1 調用來傳遞持久消息或具有缺省持久性的消息。

使用 MQCMIT 調用落實事務。

  • 通道作為新實例重新啟動(它們也可能是不同的通道),因此不保留通道出口狀態。
  • 恢復臨時動態隊列,以作為恢復可重新連接的客戶機(已打開臨時動態隊列)這一進程的一部分。未在臨時動態隊列上恢復任何消息,但已打開隊列或已記住隊列名稱的應用程序能夠繼續進行處理。這存在一種可能性,如果該隊列正被應用程序使用而不是創建該隊列的應用程序使用,那麼它在下一次引用時可能不能快速地恢復。例如,如果客戶機會創建作為應答隊列的臨時動態隊列,並通過通道將應答消息放到該隊列,那麼該隊列不可能及時進行恢復。在這種情況下,通道通常可以將應答消息放到死信隊列。

以下文章點擊率最高

Loading…

     

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