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…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注