WebSphere MQ 7.0.1 Linux安装:RPM依赖与队列管理
发布时间:2026/9/15 2:08:09
分类:文化教育
浏览:1234

简介面向 Linux 运维与中间件工程师这份资料围绕 IBM WebSphere MQ V7.0.1 在 x86-64 平台上的安装与运维展开内容覆盖从 RPM 依赖部署、队列管理器配置到服务启动与验证的完整流程并针对监控、安全、高可用性、性能调优给出可落地的操作要点同时穿插了 Java 运行环境、密钥管理、客户端接入等关键组件的说明帮助读者建立从安装到排错的整体认知。压缩包共有 420 个文件体积约 465MB其中包含 27 个 RPM 安装包、39 个 jar 库、64 个动态链接库 so以及大量 properties 配置、readme 说明、字体与安全策略文件便于读者逐一对应学习每类组件的用途。文件列表清晰展示了 MQSeriesServer、MQSeriesConfig、MQSeriesJava、MQSeriesKeyMan 等核心包结合描述中的安装步骤可帮助理解依赖顺序与常见排错方向。目前已有 155 人学习下载适合正在部署企业消息队列或需要维护 WebSphere MQ 的工程技术人员参考使用也能作为离线手册帮助系统梳理 IBM MQ 各组件之间的关系。1. WebSphere MQ V7.0.1 在 Linux x86-64 上的安装与运维先认清那批 RPM 包的层级拿到CZ4VEML(WebSphere MQ V7.0.1 for Linux on x86-64 Multilingual).tar时别急着解压后一把梭rpm -ivh *.rpm。这个包解出来大约有九个目录项里面既有 MQ 服务器本体也有 JRE、Java API、Eclipse SDK、GSKit 安全组件还有一批针对 RedHat/SuSE 的 fontconfig 缓存文件。它们之间不是平级关系而是有严格的依赖层级GSKit 没装好后面的 server 和 keyman 就可能起不来JRE 缺失图形化的 MQ Explorer 也跑不动。这篇文章会把 V7.0.1 在 Linux 上的部署拆成「包依赖、队列管理器定义、通道监听、JMS 客户端接入、日常诊断」五段每个环节都给出可直接复用的命令和参数适合正在做 linux 运维、接手旧版 ibmmq 的服务器管理人员参考。2. 从 gsk7bas 到 MQSeriesServerrpm 依赖关系与安装顺序拆解2.1 包的角色与依赖树解压完整包后按文件清单里的 RPM 名称可以把它们分成三个层级安全底座、运行时主体、配套工具。先看一张包角色表安装时才不会搞混顺序。RPM 包名架构角色安装前提gsk7bas-7.0-4.23.i386.rpmi386IBM GSKit 密码学库32 位系统基础库gsk7bas64-7.0-4.23.x86_64.rpmx86_64GSKit 密码学库64 位SSL/TLS 加密通道依赖它gsk7basMQSeriesRuntime-7.0.1-0.x86_64.rpmx86_64运行时环境MQ 客户端和服务器的公共依赖gsk7bas64MQSeriesConfig-7.0.1-0.x86_64.rpmx86_64配置命令与镜像处理工具crtmqm/dspmq 等命令的支撑MQSeriesRuntimeMQSeriesServer-7.0.1-0.x86_64.rpmx86_64队列管理器核心负责消息的收发与存储MQSeriesRuntime, MQSeriesConfigMQSeriesJava-7.0.1-0.x86_64.rpmx86_64IBM MQ classes for Java 与 JMS 接口包MQSeriesRuntimeMQSeriesJRE-7.0.1-0.x86_64.rpmx86_64MQ 自带 JRE跑 Explorer 和部分管理工具用gsk7bas64MQSeriesKeyMan-7.0.1-0.x86_64.rpmx86_64iKeyman 密钥管理工具管理 SSL 证书库gsk7bas, gsk7bas64MQSeriesEclipseSDK33-7.0.1-0.x86_64.rpmx86_64MQ Explorer 图形界面的 Eclipse 3.3 插件MQSeriesJRE这里要特别解释一下 gsk7bas 的两个包。WebSphere MQ V7.0.1 的加密通道依赖 IBM GSKit 7.0版本号是 7.0-4.23。32 位包不是多余的因为 V7.0.1 的部分管理程序在 x86-64 系统上仍以 32 位方式编译运行时需要加载 32 位libgsk7库。只装 64 位 gsk 的话MQ Explorer 打开 SSL 配置页时经常会报找不到本地密码库的错误。在纯 64 位生产服务器上这两个包都建议装顺手把glibc.i686也确认一下有些精简系统缺 32 位 glibc 会导致 gsk7bas 安装失败。2.2 安装顺序与多语言包处理先解压再分区安装。文件名里带括号和空格直接tar -xvf *.tar在部分 shell 里会解析出错我一般先用ls拿到精确文件名再带引号解包ls | grep -i CZ4VEML tar -xvf CZ4VEML(WebSphere MQ V7.0.1 for Linux on x86-64 Multilingual).tar解压后进入目录按依赖顺序安装# 第一批安全底座 rpm -ivh gsk7bas-7.0-4.23.i386.rpm gsk7bas64-7.0-4.23.x86_64.rpm # 第二批运行时与配置 rpm -ivh MQSeriesRuntime-7.0.1-0.x86_64.rpm MQSeriesConfig-7.0.1-0.x86_64.rpm # 第三批服务器主体与配套开发包 rpm -ivh MQSeriesServer-7.0.1-0.x86_64.rpm \ MQSeriesJava-7.0.1-0.x86_64.rpm \ MQSeriesJRE-7.0.1-0.x86_64.rpm \ MQSeriesKeyMan-7.0.1-0.x86_64.rpm \ MQSeriesEclipseSDK33-7.0.1-0.x86_64.rpm这里用rpm -ivh而不是-uvh区别在于-i只在包未安装时生效重复执行会提示already installed-u则用于已有旧版本时的升级场景。新装系统上-i更安全不会意外覆盖同版本文件。参数-v显示详细安装过程-h用#号打印进度条批量安装时看得出卡在哪个包上。不要加--nodeps强装否则后面启动amqzla守护进程时会因为缺少libgsk7或libmqm_r直接报 AMQ6118排查反而更耗时。装完立刻做两件事第一用dspmqver确认版本和 Fix Pack 号第二注册 MQ 实例到系统/opt/mqm/bin/dspmqver /opt/mqm/bin/setmqinst -p /opt/mqm -idspmqver返回的内容里Version和Fix Pack是后续判断补丁级别的主要依据。setmqinst -p /opt/mqm -i是把安装路径写进系统注册表没有这一步crtmqm在部分环境里会提示AMQ6116: No programmatic directory found。执行后ls -l /var/mqm确认目录结构已经生成默认安装路径下mqm用户和组由 RPM 自动创建不要手动改这两个账户的 UID/GID否则后面权限检查会很痛苦。关于压缩包里那几个fontconfig.RedHat.5.bfc、fontconfig.SuSE.10.bfc文件它们是 RHEL/SuSE 对应版本的 fontconfig 缓存快照。V7.0.1 的 MQ Explorer 在 Linux 上如果没有合适的中文字体菜单和队列管理器状态页会显示成方块。老发行版上把对应的 bfc 文件拷到/usr/share/fonts下可以缓解但在 RHEL 7 及之后的内核上直接fc-cache -f重建缓存比拷 bfc 文件更可靠。这个问题只影响图形界面不影响runmqsc和消息收发。2.3 老版本 init 脚本与当代 systemd 兼容启动材料里写的是用systemctl启动 MQ 服务这在 V7.0.1 发布的年代并不成立——当时官方支持的是 SysV init 脚本和chkconfig。如果跑在 RHEL 7 之后的发行版上RPM 装完可能在/etc/init.d下生成了mqsqmgr链接但 systemd 并不会自动管理它。我在 RHEL 8 上跑 MQ 7.0.1 时习惯用最直接的命令启动队列管理器/opt/mqm/bin/strmqm QM1 /opt/mqm/bin/dspmq -m QM1如果一定要纳入 systemd 托管可以自建一个 unit 文件把strmqm包一层示例如下cat /etc/systemd/system/mqm-qm1.service SVC [Unit] DescriptionIBM MQ Queue Manager QM1 Afternetwork.target [Type] Typeforking Usermqm Groupmqm ExecStart/opt/mqm/bin/strmqm QM1 ExecStop/opt/mqm/bin/endmqm -w QM1 Restarton-failure [Install] WantedBymulti-user.target SVC systemctl daemon-reload systemctl enable --now mqm-qm1Typeforking是因为strmqm会派生后台进程后返回endmqm -w则会让队列管理器等待已接收消息处理完成再停止避免强制 kill 导致消息丢失。这个 unit 的缺点是只绑定 QM1如果一台机器上建了多个队列管理器需要按队列管理器名各写一个。日常 linux 运维里我仍然推荐直接用strmqm/endmqm操作systemd 只负责开机启动减少中间层故障点。3. crtmqm 到 runmqsc队列管理器、队列、通道与监听器的定义顺位3.1 crtmqm 的合理参数与队列管理器目录布局队列管理器是 MQ 的顶层容器消息队列、通道、监听器都挂在它下面。创建前先确认两件事/var/mqm所在分区有足够磁盘空间以及mqm用户能写该目录。V7.0.1 的队列管理器数据默认落在/var/mqm/qmgrs/QMName下日志默认使用循环日志适合绝大多数异步解耦场景。如果业务有 XA 分布式事务要求创建时改成线性日志/opt/mqm/bin/crtmqm -q QM1 # 事务场景请用 # /opt/mqm/bin/crtmqm -ll -ls 50 -lp 20 -q QM1参数含义-q指定死信队列名为SYSTEM.DEAD.LETTER.QUEUE消息无法投递时进这里-ll表示使用线性日志-lp主日志文件数-ls辅助日志文件数。循环日志的文件会被覆盖优点是占用空间小、管理简单线性日志保留完整日志序列数据恢复能力更强代价是磁盘占用更高。没有事务需求的 linux 服务器上默认循环日志就够。创建完先看状态再启动/opt/mqm/bin/dspmq -m QM1 /opt/mqm/bin/strmqm QM1dspmq -m QM1输出中QMNAME(QM1) STATUS(Running)表示启动成功。停止时用endmqm -w QM1优雅停止它会等待在途消息处理完超时可以用-t指定秒数紧急情况下endmqm -i立即强制停止。生产环境不要一上来就-i那会导致队列管理器在没完成 checkpoint 的情况下被终止重启时恢复日志回放时间变长。启动后看一下目录结构ls /var/mqm/qmgrs/QM1/目录中的errors/存放队列管理器自己的错误日志queues/下按队列文件存放消息数据log/是日志文件qm.ini是队列管理器配置文件。后续如果调整日志大小、修改通道相关属性主要就是改qm.ini里的对应 stanza改完要重启队列管理器才生效。3.2 用 runmqsc 定义监听器、本地队列和通道队列管理器启动后默认只有系统对象还不能对外提供服务。需要依次定义三样东西监听器、传输通道、业务队列。监听器负责在指定 TCP 端口上等待客户端连接传输通道是客户端和队列管理器之间的逻辑链路业务队列是消息实际的落脚点。以下脚本可以直接保存执行/opt/mqm/bin/runmqsc QM1 EOF DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1414) CONTROL(QMGR) BACKLOG(512) START LISTENER(LISTENER.TCP) DEFINE CHANNEL(SVRCONN1) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER(mqm) DEFINE QLOCAL(APP.Q) DEFPSIST(YES) MAXDEPTH(200000) DEFINE QMODEL(APPQ.MODEL) DEFTYPE(PREDEFINED) DEFPSIST(YES) END EOF参数逐项说明LISTENER.TCP是监听器名称TRPTYPE(TCP)指定走 TCP 协议PORT(1414)是默认 MQ 端口CONTROL(QMGR)表示监听器随队列管理器自动启动BACKLOG(512)是 TCP 连接等待队列长度。端口占用冲突时改成其他端口客户端连接参数也要同步改。SVRCONN1是服务端连接通道客户端通过它接入。CHLTYPE(SVRCONN)表示这是服务器端专用通道MCAUSER(mqm)是通道关联的用户身份。V7.0.1 里如果MCAUSER留空客户端连接后消息权限判定容易踩 AMQ4036显式指定为mqm是运维上最快的收敛方式。生产环境应把mqm换成实际业务账号并配合通道的SSLCAUTH做证书认证。APP.Q是本地队列DEFPSIST(YES)让消息默认持久化重启队列管理器不丢消息MAXDEPTH(200000)是队列最大深度超过后生产者会被限流。QMODEL是模型队列应用可以用它动态创建临时队列DEFTYPE(PREDEFINED)表示动态队列根据模型定义创建。runmqsc执行完会逐条回显AMQ8006、AMQ8014之类的完成码看到AMQ8006: IBM MQ queue manager created或AMQ8014: Completion code 0基本就是成功。如果哪条命令报AMQ8077通常是对象已存在或参数拼写有误检查对象名大小写和单词拼写后重新执行即可。3.3 用 amqsput/amqsget 做本地回环验证对象定义完先用 IBM MQ 自带的样例程序验证消息通路再接入上层应用。样例程序在/opt/mqm/samp/bin/下直接使用/opt/mqm/samp/bin/amqsput APP.Q QM1 /opt/mqm/samp/bin/amqsget APP.Q QM1amqsput运行后会等待键盘输入输入一行文本回车就向APP.Q写入一条消息CtrlD 结束输入。amqsget是阻塞读取只要队列里有消息就会打印并移除。先在第一个终端跑amqsget再开第二个终端跑amqsput能看到消息从入队到出队的完整链路。这一步能同时验证队列管理器权限、队列定义、日志写入三个环节是后续排查 JMS 连接问题最干净的基线。4. JMS 客户端连 MQ V7.0.1MQQueueConnectionFactory 参数与握手排错4.1 客户端模式与 bindings 模式的区别应用连 MQ 有两种方式bindings 模式和 client 模式。bindings 模式要求应用和队列管理器在同一台机器上通过共享内存直接调用本地接口性能最好但应用进程必须以mqm身份运行JVM 还要加载libmqjbnd05.so本机库。client 模式则是通过 TCP 通道SVRCONN1访问远程队列管理器不要求同机也不限制运行账号是企业里最常见的接入方式。V7.0.1 的 classes for Java 里绑定和客户端两种模式在同一个 jar 包里切换主要靠WMQConstants.WMQ_CM_CLIENT这个常量。常见误用是把它写成WMQConstants.WMQ_CM_BINDINGS结果应用和 MQ 不在同一台机器上时一直报连接失败。判断很简单连接串里写hostname和port就必须用 client 模式写本地绑定就走 bindings 模式。生产环境里 JMS 应用的classpath通常包含/opt/mqm/java/lib/下的这些包com.ibm.mq.jar、com.ibm.mq.jmqi.jar、com.ibm.mqjms.jar、com.ibm.mq.headers.jar等。不需要额外的 Maven 依赖直接引用 IBM 安装路径里的 jar 即可省去版本错配的麻烦。4.2 最小可运行 JMS 生产者代码下面这段代码面向运维验证场景不引入 Spring 等框架用最原始的 JMS API 向APP.Q写入一条文本消息import com.ibm.mq.jms.MQQueueConnectionFactory; import com.ibm.msg.client.wmq.WMQConstants; import javax.jms.Connection; import javax.jms.Session; import javax.jms.Queue; import javax.jms.MessageProducer; import javax.jms.TextMessage; public class MQ7Send { public static void main(String[] args) throws Exception { MQQueueConnectionFactory cf new MQQueueConnectionFactory(); cf.setTransportType(WMQConstants.WMQ_CM_CLIENT); cf.setHostName(192.168.1.10); cf.setPort(1414); cf.setChannel(SVRCONN1); cf.setQueueManager(QM1); Connection conn cf.createConnection(mqm, mqm); Session session conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue session.createQueue(APP.Q); MessageProducer producer session.createProducer(queue); TextMessage msg session.createTextMessage(hello mq7); producer.send(msg); conn.close(); } }代码逻辑说明MQQueueConnectionFactory是 IBM MQ 提供的 JMS 连接工厂设置WMQConstants.WMQ_CM_CLIENT后连接工厂通过 TCP 与192.168.1.10:1414上的SVRCONN1通道握手。createConnection(mqm, mqm)传入的是通道MCAUSER对应的认证身份如果通道配置里没有启用CHLAUTH校验这个用户名密码只是形式一旦服务器端打开通道认证这里必须填真实有效的系统用户。createSession(false, Session.AUTO_ACKNOWLEDGE)表示非事务会话消息发送后自动确认。producer.send(msg)把消息持久化写入APP.Q队列定义中的DEFPSIST(YES)会在此生效。4.3 编译运行与常见 JMS 错误码编译和运行时通过-cp指定依赖 jarjavac -cp /opt/mqm/java/lib/com.ibm.mq.jar:/opt/mqm/java/lib/com.ibm.mqjms.jar:/opt/mqm/java/lib/com.ibm.mq.jmqi.jar MQ7Send.java java -cp .:/opt/mqm/java/lib/* MQ7Send运行结束后到 MQ 服务器上执行amqsget APP.Q QM1如果能读到刚才的hello mq7说明从通道、监听器到队列的整条链路都是通的。如果运行报错优先看两个地方服务器端/var/mqm/qmgrs/QM1/errors/AMQERR01.LOG里的 AMQ 错误码以及 JMS 异常堆栈里的MQJMS编号。常见的几组是MQJMS2011表示连接失败原因通常在服务器端查看AMQERR01.LOG是否出现AMQ9208。AMQ9208 意味着客户端和服务器之间 TCP 握手失败检查监听器是否启动、防火墙是否放行 1414 端口、netstat -anp | grep 1414是否在监听。MQJMS2005或MQRC 2538表示队列管理器未知检查setQueueManager(QM1)里的大小写是否正确dspmq -m QM1是否处于 Running 状态。MQRC 2539表示连接被关闭多半是通道名错误或SVRCONN1没有定义进入runmqsc QM1用DISPLAY CHANNEL(SVRCONN1)确认通道存在。MQRC 2035表示权限不足MCAUSER指定的用户没有APP.Q的写入权限此时把MCAUSER(mqm)临时放开可以快速确认但生产环境要按实际账号做授权。还有一个隐蔽问题V7.0.1 的 classes for Java 在 JVM 8 以上运行时有概率报UnsupportedClassVersionError这不是 MQ 配错了而是 MQ 7.0.1 的 jar 构建年代较早。通常换用 JVM 6 或 7 能解决但如果应用必须跑在 Java 8 上优先打更高版本 Fix Pack而不是反向降级 JVM。5. AMQERR01.LOG、dmpmqcfg 和队列深度一天运维会碰到的诊断入口5.1 日志与常见 AMQ 错误码对照队列管理器运行期间的问题百分之八十能从这两个位置找到线索/var/mqm/qmgrs/QM1/errors/AMQERR01.LOG和/var/mqm/qmgrs/QM1/qm.ini。AMQERR01.LOG是队列管理器的主错误日志追加写入不会自动轮转长期运行容易膨胀到几个 GB。建议用 logrotate 按天切分保留两周。排查问题时按时间戳倒序找AMQ开头的错误码AMQ 错误码含义常见触发场景AMQ9208通道握手失败端口不通、监听器未启动、防火墙拦截AMQ4036用户无权访问MCAUSER未指定或指定账号权限不足AMQ4537队列管理器配置错误qm.ini中日志路径或文件大小参数异常AMQ6118组件无法初始化缺少 GSKit 库或运行时依赖不完整AMQ9507SSL 握手失败证书库密码错误、证书过期、TLS 版本不匹配阅读AMQERR01.LOG时不要只看第一条MQ 的错误往往是多层嵌套的比如客户端报 AMQ9208日志里紧跟的AMQ9999行会给出更底层的 errno 原因那才是真正要处理的系统问题。5.2 队列深度与通道状态的监控命令队列深度是最直观的告警指标APP.Q持续堆积通常意味着消费端宕机或消费能力不足。用一段自动化的runmqsc可以同时拿到关键状态/opt/mqm/bin/runmqsc QM1 EOF DISPLAY QL(APP.Q) CURDEPTH MAXDEPTH DISPLAY CHSTATUS(SVRCONN1) ALL DISPLAY LSSTATUS(LISTENER.TCP) ALL END EOFCURDEPTH是当前堆积消息数MAXDEPTH是队列容量上限。CHSTATUS(SVRCONN1) ALL输出当前连接数和通道状态STATUS(RUNNING)表示通道可用STATUS(STOPPED)则需要重新START CHANNEL(SVRCONN1)。LSSTATUS(LISTENER.TCP)查看监听器的 PID、端口和当前线程数确认监听器没有因资源耗尽而挂掉。5.3 用 dmpmqcfg 导出配置做重装备份V7.0.1 的dmpmqcfg是一个极其实用但容易被忽略的工具它能把队列管理器里所有对象定义导出成标准 MQSC 脚本。重装服务器或迁移环境时先导出再导入比手动敲几百行runmqsc靠谱得多/opt/mqm/bin/dmpmqcfg -m QM1 -o mqsc -a /backup/QM1_full.mqsc-m QM1指定队列管理器-o mqsc导出为 MQSC 格式-a表示导出全部对象类型包括队列、通道、监听器、认证信息、订阅和进程定义。恢复时执行/opt/mqm/bin/runmqsc QM1 /backup/QM1_full.mqsc即可。注意dmpmqcfg导出的是配置快照队列中的存量消息不会被导出迁移前要先用dmpmqmsg或应用侧消费把数据搬走。这一节最后提一个 V7.0.1 的特有技巧在qm.ini的Log段里如果发现LogPrimaryFiles和LogSecondaryFiles设置得太小应用写入高峰会出现AMQ7460等待日志空间。循环日志下这两个值通常不必调大但线性日志配合大事务量时适当增加LogPrimaryFiles能明显减少日志切换带来的 I/O 抖动。改完qm.ini重启队列管理器生效这个动作建议放在低峰期执行。本文还有配套的精品资源点击获取