在两台或多台计算机上配置的同一队列管理器的实例。通过启动多个实例,一个实例将成为活动实例,而其他实例将成为备用实例。如果活动实例失败,则在另一台计算机上运行的备用实例将自动接管。您可以使用多实例队列管理器来基于IBM MQ配置自己的高可用性消息传递系统
如图显示了队列管理器QM1的多实例配置的示例,IBMMQ安装在两台服务器上,其中一台为备用服务器。服务器上已创建队列管理器QM1。QM1的一个实例处于活动状态,并且在一台服务器上运行。QM1的另一个实例在另一台服务器上处于待机状态,不做任何活动处理,当活动的实例发生故障时,当前的任务会由备用实例接管。两个队列管理器实例的数据和日志保存在一个共享的网络存储中
当您打算将队列管理器用作多实例队列管理器时,请使用crtmqm命令在其中一台服务器上创建一个队列管理器,并将其队列管理器数据和日志存储在共享网络存储中。在另一台服务器上,而不是再次创建队列管理器,请使用addmqinf命令创建对队列管理器数据的引用并登录网络存储。
现在,您可以从任一服务器运行队列管理器。每个服务器都引用相同的队列管理器数据和日志。只有一个队列管理器,并且一次仅在一台服务器上处于活动状态。
队列管理器既可以作为单个实例队列管理器运行,也可以作为多实例队列管理器运行。在这两种情况下,只有一个队列管理器实例正在运行,正在处理请求。区别在于,当作为多实例队列管理器运行时,未运行队列管理器活动实例的服务器将作为备用实例运行,如果活动服务器发生故障,则可以自动从活动实例接管。
您对哪个实例首先变为活动状态的唯一控制权是在两个服务器上启动队列管理器的顺序。第一个获取对队列管理器数据的读/写锁定的实例成为活动实例。
一旦启动了活动实例,就可以使用切换选项将活动实例停止以将控制权转移到备用服务器,从而将活动实例交换到其他服务器。
QM1的活动实例在运行时具有对共享队列管理器数据和日志文件夹的独占访问权。QM1的备用实例检测活动实例何时发生故障,并成为活动实例。它接管QM1数据,并记录它们由活动实例留下的状态,并接受来自客户端和通道的重新连接。
活动实例可能由于各种原因而失败,导致备用实例接管:
您可以将队列管理器配置信息添加到多个服务器,然后选择任意两个服务器作为主/备用对运行。总共有两个实例的限制。您不能有两个备用实例和一个活动实例。
本人使用linux环境,不再在win环境上进行搭建测试,win环境请移步windows创建多实例队列管理器
多实例队列管理器使用网络文件系统来管理队列管理器实例。
多实例队列管理器使用文件系统锁以及共享队列管理器数据和日志的组合来自动执行故障转移。队列管理器只有一个实例可以对共享的队列管理器数据和日志具有独占访问权。当它获得访问权限时,它将成为活动实例。未能成功获得排他访问的另一个实例将作为备用实例等待,直到队列管理器数据和日志变得可用为止。
联网文件系统负责释放它为活动队列管理器实例持有的锁。如果活动实例以某种方式失败,则网络文件系统将释放它为活动实例持有的锁。排他锁释放后,等待该锁的备用队列管理器将尝试获取它。如果成功,它将成为活动实例,并且具有对队列管理器数据的独占访问权,并登录到共享文件系统上。然后它继续开始。
在linux系统中,安装rpcbind与nfs来实现网络文件系统
如图所示,我准备了三台机器,FIle Server做网络文件系统,MQ Server1和MQ Server2 做多实例队列管理器
rpm -aq | grep nfs
rpm -aq | grep rpcbind
yum install nfs-utils rpcbind
mkdir -p /share/HQM1
chmod 777 /share/HQM1
vim /etc/exports
/share/HQM1 192.168.137.0/24(rw,sync,no_wdelay,fsid=0)
exportfs -rv
systemctl start rpcbind
systemctl start nfs
systemctl status rpcbind
systemctl status nfs
showmount -e
rpcinfo -p localhost
vim /etc/sysconfig/nfs
systemctl restart rpcbind
systemctl restart nfs
firewall-cmd --add-port=111/tcp --permanent
firewall-cmd --add-port=111/udp --permanent
firewall-cmd --add-port=2049/tcp --permanent
firewall-cmd --add-port=2049/udp --permanent
firewall-cmd --add-port=30001/tcp --permanent
firewall-cmd --add-port=30001/udp --permanent
firewall-cmd --add-port=30002/tcp --permanent
firewall-cmd --add-port=30002/udp --permanent
firewall-cmd --add-port=30003/tcp --permanent
firewall-cmd --add-port=30003/udp --permanent
firewall-cmd --add-port=30004/tcp --permanent
firewall-cmd --add-port=30004/udp --permanent
systemctl restart firewalld
mkdir -p /share/HQM1
showmount -e 192.168.137.12
mount 192.168.137.12:/share/HQM1 /share/HQM1
mkdir /share/HQM1/logs
mkdir /share/HQM1/qmgrs
chown mqm:mqm -R /share/HQM1
chmod -R ug+rwx /share/HQM1
crtmqm -ld /share/HQM1/logs -md /share/HQM1/qmgrs HQM1
dspmqinf -o command HQM1
mkdir -p /share/HQM1
showmount -e 192.168.137.12
mount 192.168.137.12:/share/HQM1 /share/HQM1
addmqinf -s QueueManager -v Name=HQM1 -v Directory=HQM1 -v Prefix=/var/mqm -v DataPath=/share/HQM1/qmgrs/HQM1
strmqm -x HQM1
dspmq
我们在队列管理器HQM1上创建队列Q1,通道TESTCHANNEL,监听TCP.LISTENER,并保证端口为1418,然后使用客户端工具向Q1上发送消息,发送消息中间停止当前运行的队列管理器,查看备用管理器是否会接管当前队列管理器的任务。
runmqsc HQM1
进入管理器,输入以下内容(不要完全复制,注释部分在管理器中会报错)#定义一个服务器连接通道
DEFINE CHANNEL('TESTCHANNEL') CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER('mqm')
#定义监听
DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1418)
#队列管理器权限,禁用认证
SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST(*MQADMIN) ACTION(REMOVE)
SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)
SET CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)
ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
#启动监听器
START LISTENER(LISTENER.TCP)
#禁用通道验证
alter qmgr chlauth(disabled)
#刷新安全策略
REFRESH SECURITY TYPE(CONNAUTH)
#创建队列Q1
DEFINE QLOCAL(CQ1)
end
MQ Server1,MQ Server2 开放端口 1418 (须在root用户下执行)
firewall-cmd --add-port=1418/tcp --permanent
systemctl restart firewalld
使用endmqm -s HQM1命令,主动发起停止正在运行的队列管理器并切换的操作
endmqm -s HQM1
在队列管理器状态为running的服务器上运行,本人的是MQ Server2服务器。
提示当所用工作完成后,将切换为备用队列管理器
在当前服务器上执行dspmq
命令,查看队列管理器状态,当HQM1状态变为running elsewhere时,说明切换成功,然后去之前的备用队列管理器所在的服务器执行dspmq
命令,查看队列管理器状态。
MQ Server2 状态
MQ Server1状态
结论:在主动切换的情况下,主备队列管理器切换成功
服务器宕机的情况下,测试主备管理器切换情况
将队列管理器恢复为一个正在运行,一个备用的状态。
然后切断正在运行的服务器的电源,查看切换情况。
本人这里关闭的时MQ Server1,一段事件之后查看MQ Server2的队列管理器状态,发现队列管理器状态已变为running
说明主备切换成功。(本人在这个地方等待了将近有半个小时,虽说最后的结果是切换成功了,但是切换时间超出了预期太多)