IBM WebSphere MQ消息通道的配置和維護(八)

2.4.7   實現斷網續傳和故障恢復

WebSphere MQ作為一個消息傳輸產品,本身是架構在TCP/IP之上的,因此與操作系統或網絡底層的TCP/IP特性有着密切的關係,很多情況下我們要藉助於修改操作系統的TCP/IP參數,來使它更好地為WebSphere MQ服務,從而更加完善地發揮WebSphere MQ的強大功能。

當我們要在WebSphere MQ的兩個隊列管理器之間建立通訊時,由於WebSphere MQ的通道是單向的,我們必須要建立兩條通道(Chanel),比如建立兩條類型分別為發送(sender)類型和接收(receiver)類型的通道來實現兩個WebSphere MQ Server之間的通訊,在通道的兩端WebSphere MQ利用MCA(消息通道代理)來管理和監控通道的啟停等運行狀態,並對通道兩端的消息系列號(Message Sequence Number)等進行協同管理,以保證WebSphere MQ對消息的”Once and Once Only”的傳輸。對WebSphere MQ而言,在其系統配置配置文件mqs.ini文件中,在mqs.ini文件中,包含了對隊列管理器的日誌大小、通道屬性以及通過XA標準與數據庫協同工作時的有關參數的設置,除此之外,有一節用於控制有關TCP/IP特性的信息,即:

TCP:

KeepAlive=Yes或

KeepAlive=No

它的作用在於:當設置KeepAlive=Yes時,表示操作系統的TCP/IP參數設置對WebSphere MQ生效。

由於WebSphere MQ接收通道的MCA處於通訊的被動方,它一直等待從發送方傳來的消息,因此它不知道什麼時候發送方會停止發送消息,也不知道當網絡出現故障時,發送方什麼時候會從工作狀態變為停止狀態。這時由於出現網絡故障,網絡連接被斷掉,發送方通道狀態會由running狀態變為retrying狀態,發送方會試圖重新建立網絡連接,而這時接收方的通道卻沒有停下來,仍處於一種假”running”的狀態,相應的我們會得到一個”Channel is in use”的錯誤信息,導致發送端想重起卻重起不了。出現這一現象的原因是:當發送方MCA啟動通道並長時間沒有斷開連接,這時出現網絡故障,TCP/IP的socket連接被破壞,當發送停止通道並重新啟動時,它需要建立一個新的socket連接,而接收方仍停留在原來的RECEIVE調用上,它的socket特徵與發送方新的socket特徵不一致,因此新的socket連接建立失敗。

我們可以利用TCP/IP特性來克服這一點,更好地實現斷網續傳。通常,操作系統的TCP/IP參數的缺省設置是2個小時(常見的操作系統平台如:Windows 2000/NT以及AIX,HP-UX,Sun Solaris,Linux等,缺省設定均為2個小時)即發送KeepAlive探測包的時間是2小時,所以需要2個小時的時間它才會獲知網絡連接已經斷開,這對於我們來說無疑是無法接受的。在這種情況下,我們可以通過配置TCP/IP KeepAlive參數來提高TCP/IP的響應速度,從而實現網絡故障時WebSphere MQ能夠迅速斷開通道連接從而重新啟動通道,實現斷網續傳的強大功能。只有這樣,在發送端,MQ的channel才能由running狀態變為retrying狀態,同時,在接收端,MQ的channel才能由running狀態變為not found狀態, 這樣,在網絡或主機重新恢復時,通道才能重新建立起連接,恢復running狀態。

要實現上述功能,我們需要作以下兩方面的工作:

1)修改WebSphere MQ系統配置文件mqs.ini,增加如下一節:

TCP:

KeepAlive=Yes

目的是使系統的TCP/IP設置對WebSphere MQ生效。

2)修改操作系統的TCP/IP參數;

在不同的系統上,修改TCP/IP參數的方法略有不同,現僅以Windows 2000/NT、RISC6000和HP為例作一簡單說明。

  • 在Windows NT平台上, 我們利用regedit來修改系統註冊表,修改HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三個參數:
    KeepAliveInterval,設置其值為1000
    KeepAliveTime,設置其值為300000(單位為毫秒,300000代表5分鐘)
    TcpMaxDataRetransmissions,設置其值為5
  • 在RISC6000平台上, 用no命令修改如下參數:
    tcp_keepidle保持TCP/IP連接的時間,單位為5秒,缺省值為14,400,即兩個小時,我們可將它設為5分鐘;
    tcp_keepinittcp連接初始timeout值,單位為0.5秒,缺省值為150,我們可將它設為50;
    tcp_keepintvl連接間隔,單位為0.5秒,缺省值為150,我們可將它設為50;
    我們也可以修改/etc/rc.net文件,
    /usr/sbin/no -o tcp_keepidle=240
    /usr/sbin/no -o tcp_keepinit=50
    /usr/sbin/no -o tcp_keepintvl=50
    注意:直接使用命令行修改,在機器重啟後,會失效;修改rc.net文件,可以做到永久生效。
  • 在HP平台上,
    對於HP-UNIX V10.20及其在此之前的版本,用/usr/contrib/bin nettune命令來修改有關參數;
    對於HP-UNIX V10.30及其以上版本,用/usr/bin/ndd命令來修改有關參數。
  • 在SUN Solaris平台上,
    用ndd -set /dev/tcptcp_keepalive_interval NNN命令來修改有關參數,tcp_keepalive_interval的單位為毫秒,缺省值為7200000毫秒,即2個小時。
  • 在SCO OpenServer平台上,
    tcp_keepalive 和 tcp_keepidle 相同,其原先默認值為 7200 秒,可設為 600秒。tcp_keepintvl 其原先默認值為 75 秒,可設為15秒。均以”秒”為單位。
    運行命令 ifconfig 命令修改:
    /etc/inconfig tcp_keepidle <value>
    /etc/inconfig tcp_keepintvl <value>
    需要注意的一點是通道兩端的KeepAlive參數要保持協調一致,若發送端的KeepAlive值小於接收端的KeepAlive值,則當網絡出現故障時,發送端的通道停下來之後,接收端的通道會仍然停不下來。

以下文章點擊率最高

Loading…

     

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