IBMMQ(集群高可用) 学习随笔-多实例队列管理器

1. 多实例管理器的作用

  在两台或多台计算机上配置的同一队列管理器的实例。通过启动多个实例,一个实例将成为活动实例,而其他实例将成为备用实例。如果活动实例失败,则在另一台计算机上运行的备用实例将自动接管。您可以使用多实例队列管理器来基于IBM MQ配置自己的高可用性消息传递系统

2. 多实例管理器结构

IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第1张图片
  如图显示了队列管理器QM1的多实例配置的示例,IBMMQ安装在两台服务器上,其中一台为备用服务器。服务器上已创建队列管理器QM1。QM1的一个实例处于活动状态,并且在一台服务器上运行。QM1的另一个实例在另一台服务器上处于待机状态,不做任何活动处理,当活动的实例发生故障时,当前的任务会由备用实例接管。两个队列管理器实例的数据和日志保存在一个共享的网络存储中

  当您打算将队列管理器用作多实例队列管理器时,请使用crtmqm命令在其中一台服务器上创建一个队列管理器,并将其队列管理器数据和日志存储在共享网络存储中。在另一台服务器上,而不是再次创建队列管理器,请使用addmqinf命令创建对队列管理器数据的引用并登录网络存储。

  现在,您可以从任一服务器运行队列管理器。每个服务器都引用相同的队列管理器数据和日志。只有一个队列管理器,并且一次仅在一台服务器上处于活动状态。

  队列管理器既可以作为单个实例队列管理器运行,也可以作为多实例队列管理器运行。在这两种情况下,只有一个队列管理器实例正在运行,正在处理请求。区别在于,当作为多实例队列管理器运行时,未运行队列管理器活动实例的服务器将作为备用实例运行,如果活动服务器发生故障,则可以自动从活动实例接管。

  您对哪个实例首先变为活动状态的唯一控制权是在两个服务器上启动队列管理器的顺序。第一个获取对队列管理器数据的读/写锁定的实例成为活动实例

  一旦启动了活动实例,就可以使用切换选项将活动实例停止以将控制权转移到备用服务器,从而将活动实例交换到其他服务器。

  QM1的活动实例在运行时具有对共享队列管理器数据和日志文件夹的独占访问权。QM1的备用实例检测活动实例何时发生故障,并成为活动实例。它接管QM1数据,并记录它们由活动实例留下的状态,并接受来自客户端和通道的重新连接。

  活动实例可能由于各种原因而失败,导致备用实例接管:

  • 托管活动队列管理器实例的服务器发生故障。
  • 托管活动队列管理器实例的服务器与文件系统之间的连接失败。
  • IBM MQ检测到队列管理器进程无响应,然后关闭队列管理器。

  您可以将队列管理器配置信息添加到多个服务器,然后选择任意两个服务器作为主/备用对运行。总共有两个实例的限制。您不能有两个备用实例和一个活动实例。

3.创建一个多实例队列管理器

本人使用linux环境,不再在win环境上进行搭建测试,win环境请移步windows创建多实例队列管理器

3.1 网络文件系统

3.1.1 为什么要创建网络文件系统

  多实例队列管理器使用网络文件系统来管理队列管理器实例。

3.1.2 多实例队列管理器高可用原理

  多实例队列管理器使用文件系统锁以及共享队列管理器数据和日志的组合来自动执行故障转移。队列管理器只有一个实例可以对共享的队列管理器数据和日志具有独占访问权。当它获得访问权限时,它将成为活动实例。未能成功获得排他访问的另一个实例将作为备用实例等待,直到队列管理器数据和日志变得可用为止。
  联网文件系统负责释放它为活动队列管理器实例持有的锁。如果活动实例以某种方式失败,则网络文件系统将释放它为活动实例持有的锁。排他锁释放后,等待该锁的备用队列管理器将尝试获取它。如果成功,它将成为活动实例,并且具有对队列管理器数据的独占访问权,并登录到共享文件系统上。然后它继续开始。

3.1.3 安装并启用网络文件系统

  在linux系统中,安装rpcbind与nfs来实现网络文件系统

3.1.3.1 服务划分

IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第2张图片
  如图所示,我准备了三台机器,FIle Server做网络文件系统,MQ Server1和MQ Server2 做多实例队列管理器

3.1.3.2 File Server 安装rpcbind和nfs
  1. 查看是否安装了nfs和rpcbind
    rpm -aq | grep nfs
    rpm -aq | grep rpcbind
    在这里插入图片描述
  2. 若没有安装nfs与rpcbind,则安装两个服务
    yum install nfs-utils rpcbind
  3. 创建共享文件夹
    mkdir -p /share/HQM1
    在这里插入图片描述
  4. 将共享文件夹给出权限777
    chmod 777 /share/HQM1
    本以为给出666读写权限即可,但是实际测试中不行,在MQ Server1中无法创建目录,哪位大神知道原因的可以指导一下
  5. 修改NFS配置文件,添加共享信息
    vim /etc/exports
    添加
    /share/HQM1 192.168.137.0/24(rw,sync,no_wdelay,fsid=0)
    rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第3张图片
  6. 读取配置文件,并检测配置是否正确
    exportfs -rv
    在这里插入图片描述
  7. 启动rpcbind与nfs服务(先启动rpcbind,nfs须在rpcbing上进行注册)
    systemctl start rpcbind
    systemctl start nfs
  8. 查看服务状态
    systemctl status rpcbind
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第4张图片
    systemctl status nfs
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第5张图片
  9. 查看自己共享的服务
    showmount -e 在这里插入图片描述
  10. 查看rpc服务的注册情况
    rpcinfo -p localhost
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第6张图片
  11. 固定端口
    在NFS提供服务时,111端口与2049端口是固定的,但是其他端口的不固定给我们在服务器上开发端口带来很大的麻烦,服务器直接管理防火墙又会带来安全性的问题,所以对其他端口进行固定(重启系统后生效)
    vim /etc/sysconfig/nfs
    添加以下内容:
    RQUOTAD_PORT=30001
    LOCKD_TCPPORT=30002
    LOCKD_UDPPORT=30002
    MOUNTD_PORT=30003
    STATD_PORT=30004
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第7张图片
  12. 重新查看rpc绑定情况,可看出端口均已改变
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第8张图片
  13. 重启nfs和rpcbind
    systemctl restart rpcbind
    systemctl restart nfs
  14. 防火墙开放端口
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
3.1.3.3 MQ Server1 挂载网络文件系统并创建队列管理器
  1. 创建挂载目录
    mkdir -p /share/HQM1
    注:如果只是使用网络文件系统,则创建的挂载目录可以不与File Server上的共享目录一致,但是这里使用网络文件系统创建队列管理器,挂载目录与File Server上的共享目录须一致。
  2. 查看FileServer共享的文件
    showmount -e 192.168.137.12
    在这里插入图片描述
    若遇到‘Port mapper failure - Unable to receive: errno 113 (No route to host)’错误,则为端口未开放的错误,请检查端口开放操作是否成功。
  3. 挂载网络文件系统目录
    mount 192.168.137.12:/share/HQM1 /share/HQM1在这里插入图片描述
  4. 创建IBMMQ日志目录和队列管理器数据目录
    mkdir /share/HQM1/logs
    mkdir /share/HQM1/qmgrs
    在这里插入图片描述
  5. 验证共享网络系统中的文件是否真正进行了共享,在File Server中打开共享目录,查看是否存在了logs和qmgrs文件夹 在这里插入图片描述
  6. File Server上修改文件夹归属于用户mqm,并将访问权限设置为用户和组可以读写
    chown mqm:mqm -R /share/HQM1
    chmod -R ug+rwx /share/HQM1
  7. 回到MQ Server1,切换到mqm用户下,创建队列管理器HQM1
    crtmqm -ld /share/HQM1/logs -md /share/HQM1/qmgrs HQM1IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第9张图片
  8. 获取在MQ Server2创建队列管理器HQM1的命令
    dspmqinf -o command HQM1在这里插入图片描述
    记录输出的内容备用
3.1.3.4 MQ Server2 挂载网络文件系统并创建队列管理器
  1. 创建挂载目录
    mkdir -p /share/HQM1在这里插入图片描述
  2. 查看共享的文件
    showmount -e 192.168.137.12
  3. 挂载网络文件系统
    mount 192.168.137.12:/share/HQM1 /share/HQM1
  4. 切换用户为mqm,输入3.1.3.3最后一步记录的命令,创建备用队列管理器
    addmqinf -s QueueManager -v Name=HQM1 -v Directory=HQM1 -v Prefix=/var/mqm -v DataPath=/share/HQM1/qmgrs/HQM1在这里插入图片描述
    到这里,队列管理器创建完毕
3.1.3.5 启动队列管理器
  1. 使用-x参数以任一顺序启动队列管理器实例
    strmqm -x HQM1
    在两个MQ Server上都要云翔
  2. 查看两个MQ Server中的服务状态(两个MQ Server中都要执行)
    dspmq
    MQ Server2 中的结果在这里插入图片描述
    MQ Server1中的结果
    在这里插入图片描述
    服务启动完成后,两个队列管理器会呈现一个运行状态(running),一个备用状态(running as standby)
3.1.3.6 验证搭建的多实例队列管理器

  我们在队列管理器HQM1上创建队列Q1通道TESTCHANNEL,监听TCP.LISTENER,并保证端口为1418,然后使用客户端工具向Q1上发送消息,发送消息中间停止当前运行的队列管理器,查看备用管理器是否会接管当前队列管理器的任务。

  1. 创建队列,通道与监听,并关闭用户安全检测
    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
  1. MQ Server1,MQ Server2 开放端口 1418 (须在root用户下执行)
    firewall-cmd --add-port=1418/tcp --permanent
    systemctl restart firewalld

  2. 使用客户端连接工具连接队列管理器IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第10张图片
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第11张图片

  3. 使用endmqm -s HQM1命令,主动发起停止正在运行的队列管理器并切换的操作
    endmqm -s HQM1在队列管理器状态为running的服务器上运行,本人的是MQ Server2服务器。
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第12张图片
    提示当所用工作完成后,将切换为备用队列管理器
    在当前服务器上执行dspmq命令,查看队列管理器状态,当HQM1状态变为running elsewhere时,说明切换成功,然后去之前的备用队列管理器所在的服务器执行dspmq命令,查看队列管理器状态。
    MQ Server2 状态IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第13张图片
    MQ Server1状态在这里插入图片描述
    结论:在主动切换的情况下,主备队列管理器切换成功

  4. 服务器宕机的情况下,测试主备管理器切换情况
    将队列管理器恢复为一个正在运行,一个备用的状态。
    在这里插入图片描述
    然后切断正在运行的服务器的电源,查看切换情况。
    IBMMQ(集群高可用) 学习随笔-多实例队列管理器_第14张图片
    本人这里关闭的时MQ Server1,一段事件之后查看MQ Server2的队列管理器状态,发现队列管理器状态已变为running
    在这里插入图片描述
    说明主备切换成功。(本人在这个地方等待了将近有半个小时,虽说最后的结果是切换成功了,但是切换时间超出了预期太多)

你可能感兴趣的:(IBM,MQ)