ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IBM MQ 7.5开发版安装与配置详解:队列管理器、通道与监听器实战

IBM MQ 7.5开发版安装与配置详解:队列管理器、通道与监听器实战 看到这个标题估计不少人会先问一句都什么年代了还在装 IBM MQ 7.5说实话我在中间件运维这块干了十几年这几年经手的项目里7.5 的存量系统依然不少。银行内部系统、制造业产线数据采集、老 ERP 的外挂模块线上跑的还是 7.1、7.5 的大有人在。新开发环境要对接这些老系统领导往往就一句话和线上版本保持一致装个开发版就行。所以这篇就把我从零开始装 WebSphere MQ 7.5 开发版的完整过程、踩过的坑以及队列管理器、队列、通道、监听器那套配置脚本一次性写清楚。适合刚接手 MQ 的运维、做老系统对接的开发以及准备 MQ 面试想快速补基础的同学。1. 方案选型为什么还在装 7.5以及怎么装最省事1.1 7.5 开发版到底解决什么问题IBM MQ 7.5 官方早已停止服务这是事实但企业存量系统不会因为 EOS 就立刻升级。开发版在 7.5 时代最大的价值是免费且功能完整能满足两类核心需求。第一类是存量系统对接。线上跑的是 7.5本地开发的接口、消息体格式、队列深度策略、通道并发模型都必须和线上版本保持一致。我去过不少客户现场测试环境用 9.x结果线上 7.5开发同学写 JMS 代码时发现部分新 API 在老版本上不可用最后全部返工。第二类是学习验证。mqsc 命令、队列管理器管理、通道配置、JMS 连接方式7.5 和 9.x 高度相似学会老版本的知识完全可以平移到新版本。这里必须提醒一句所谓“开发版”在 IBM 授权体系里主要用于开发和测试不能直接推到生产。我在项目里见过有人为了省许可费把开发版装到生产服务器后来审计被查出来麻烦不小。生产环境如果不想付许可费优先考虑社区版或者干脆规划升级到 9.x LTS 版。别在授权上埋雷。1.2 图形安装还是静默安装我建议的路线7.5 的安装方式主要有图形界面和命令行静默两条路。图形界面适合个人电脑或带桌面的服务器但生产环境大部分是纯命令行要折腾 X11 转发、DISPLAY 变量、xhost麻烦且不稳定。我更推荐纯命令行的 rpm 安装路线整个流程是解压官方 tar.gz 介质运行 mqlicense.sh 接受许可用 rpm 安装需要的 MQSeries 系列包配置环境变量创建队列管理器。这套方式最容易写进自动化脚本也最稳定。后文全部按这条路线走。如果你偏要用图形界面记住一个前提先确认服务器有 GUI 环境否则 runmqsc 都进不去其他一切免谈。1.3 单机部署还是容器化先理清拓扑安装之前先想清楚部署拓扑。开发验证场景一台 Linux 单机完全够用队列管理器、客户端、Java 测试程序都放同一台机器网络传输链路通过本地回环或者局域网验证。如果是给团队做共享开发环境就要规划独立服务器、固定 IP、端口 1414 的放行规则甚至要考虑多租户隔离。最近也常有人问能不能用 Docker 跑 7.5。官方对 9.x 有维护中的容器镜像但对 7.5 这种老版本并没有继续维护的镜像自己封装反而增加工作量而且老版本在容器里的内核参数、共享内存设置都容易出幺蛾子。所以我的判断是为了对齐存量老系统直接物理机或虚拟机装 7.5 是成本最低、最不容易出兼容性问题的方案。2. 安装前的环境检查与介质准备2.1 对 Linux 版本和内核的最低要求安装前先确认操作系统版本。7.5 时代官方支持的是 RHEL 6、CentOS 6/7 这些内核 2.6.32 以上基本都能跑。你现在拿一台 CentOS 7 或者兼容 RHEL 7/8 的发行版问题不大如果系统太新比如接近当前最新发布版本的发行版就可能遇到 glibc、依赖库兼容性问题这部分我在后面常见问题里细说。检查系统版本用最简单两条命令cat /etc/redhat-release uname -a另外确认架构是 x86_64。虽然 IBM 也有 Power 等平台的介质但绝大多数开发环境都是 x86_64下载介质千万别选错选错了解压安装会直接报错。2.2 用 yum 一次性补齐依赖包rpm 安装 MQ 时报“依赖缺失”是最常见的第一次打击。7.5 的 Server 包依赖比较传统但新系统上缺 gcc、glibc-devel、libstdc、X11 库、以及一些基础工具很常见。我在装之前会先跑一轮yum update -y yum install -y gcc-c glibc-devel libstdc libstdc-devel libXext libX11-devel openssl-devel krb5-devel pam-devel nfs-utils这里面的项未必全用上但提前装好可以省掉后面反复补包的痛苦。实际安装时 yum 报缺什么就再补什么这也是经验。有些包在最小化安装的 Linux 上尤其容易被漏掉比如 libXext搞不清依赖关系时先把这串装上后面能少很多折腾。2.3 创建 mqm 用户与目录规划IBM MQ 的管理模型里mqm 用户和 mqm 组是最核心的权限主体。安装包在 rpm 阶段也会自动创建 mqm 组和 mqm 用户但我习惯提前手动创建保证 uid/gid 可控尤其是后面要挂 NFS 或者多机共享 /var/mqm 时groupadd -g 1001 mqm useradd -u 1001 -g mqm -m -d /home/mqm -s /bin/bash mqm echo mqm:yourpassword | chpasswd目录规划上程序安装目录默认在 /opt/mqm数据目录默认在 /var/mqm。队列管理器、消息日志、错误日志都在 /var/mqm 下。建议在安装前用 LVM 单独给 /var/mqm 分一块空间因为消息积压和队列管理器日志会持续增长。我遇到过 /var/mqm 所在分区写满队列管理器直接罢工的事故磁盘规划真的别省。装完后把 /var/mqm 的属主调整为 mqm:mqm权限设 755避免后续权限混乱。2.4 下载 IBM MQ 7.5 安装介质并校验介质来源要稳妥。7.5 老版本现在比较靠谱的来源是 IBM Fix Central 或者 IBM Passport Advantage 的旧介质文件名一般是 WS_MQ_V7.5_linux_x86_64.tar.gz体积大约几百 MB。下载后最好先做完整性校验避免解压到一半才发现损坏sha256sum WS_MQ_V7.5_linux_x86_64.tar.gz把校验值和官方页面比对。这一步虽然麻烦但能帮你避开很多后半程莫名报错。如果官方下载页面已经不方便获取可以在公司内部镜像源或者供应商渠道找但别从来路不明的网站下载精简包安全风险太高尤其是这种企业级中间件谁知道对方改了什么。3. 一步步完成安装接受许可、rpm 包顺序与环境变量3.1 解压介质并接受许可协议先把介质解压到目标目录我一般解到 /opt/src 或 /usr/local/src不要直接解到 /root 下避免后续权限混乱mkdir -p /opt/src tar -zxf WS_MQ_V7.5_linux_x86_64.tar.gz -C /opt/src cd /opt/src解压后能看到 mqlicense.sh、LICENSE 目录、以及一堆 MQSeries*.rpm 文件。先接受许可不接受许可的话 rpm 安装时也会停下来./mqlicense.sh -accept这一步是纯命令行的不需要图形界面。执行后注意观察输出有没有异常有些精简版安装脚本可能提示需要 javac 之类的依赖别忽略。如果 SSH 会话里脚本一直卡住不退出大概率是在等交互确认加 -accept 参数直接接受就是正解。3.2 rpm 包安装顺序和参数选择7.5 的一堆 rpm 包有依赖关系最省心的做法是一次性把所有需要的包一起给 rpmrpm -ivh MQSeriesRuntime-7.5.0-0.x86_64.rpm \ MQSeriesServer-7.5.0-0.x86_64.rpm \ MQSeriesClient-7.5.0-0.x86_64.rpm \ MQSeriesSDK-7.5.0-0.x86_64.rpm \ MQSeriesSamples-7.5.0-0.x86_64.rpm \ MQSeriesJava-7.5.0-0.x86_64.rpm \ MQSeriesJRE-7.5.0-0.x86_64.rpm \ MQSeriesGSKit-7.5.0-0.x86_64.rpm \ MQSeriesMan-7.5.0-0.x86_64.rpm \ MQSeriesMsg_zh_CN-7.5.0-0.x86_64.rpm \ MQSeriesKeyMan-7.5.0-0.x86_64.rpm这里解释一下每个包的作用Runtime 是引擎必需Server 是队列管理器服务端Client 是远程客户端库Java 和 JRE 是 Java 开发验证必备GSKit 是 SSL/TLS 支持Samples 会带 amqsput、amqsget 这些测试工具Man 是帮助文档Msg_zh_CN 是中文消息包KeyMan 是证书管理工具。如果只装 Server后面想用自带测试工具都找不到路径开发体验差很多。依赖问题如果很顽固可以用 yum localinstall MQSeries*.rpm 让 yum 自动解析依赖比 rpm 手动处理省心。3.3 配置环境变量并验证安装结果安装完成后程序默认装在 /opt/mqm。直接敲 dspmqver 会提示找不到命令因为 /opt/mqm/bin 还没进 PATH。把环境变量写进 /etc/profile.d/mqm.sh这样每次登录自动加载export MQ_INSTALL_PATH/opt/mqm export PATH$MQ_INSTALL_PATH/bin:$PATH export MANPATH$MQ_INSTALL_PATH/man:$MANPATH export CLASSPATH$MQ_INSTALL_PATH/java/lib:$CLASSPATH刷新后验证source /etc/profile.d/mqm.sh dspmqver正常会输出 Version: 7.5.0.x 以及 Platform: Linux x86_64 的信息。到这一步程序装好了但队列管理器还没建接下来才是真正干活的环节。3.4 补充多语言包、卸载和版本升级国内使用建议把中文消息包 MQSeriesMsg_zh_CN 一并装上这样报错日志至少可以中英对照着看排查效率高不少。我实际体验是英文日志里不少专业词容易看走眼中文包装了以后老同事接手排查也友好很多。卸载时注意顺序最好先用 rpm -qa | grep MQSeries 把所有包列出来然后从最高层往底层删。直接强删底层包可能导致数据目录残留下次安装容易出莫须有的问题。想干净卸载的话先停队列管理器再 rpm -e 清包最后手动清理 /opt/mqm 和 /var/mqm。升级 7.5 的 Fix Pack 就是把对应修复包 rpm -Uvh同样先停服务再升级。这些操作我在测试环境反复做过生产上务必先备份配置和消息数据。4. 队列管理器、队列、通道与监听器配置4.1 创建并启动队列管理器队列管理器是 MQ 世界里的核心实例所有队列、通道、监听器都挂在它下面。开发环境我习惯加 -q 参数把它设为默认队列管理器这样后续不少工具可以少输一个名字crtmqm -q DEVQM1如果机器内存小还可以用 -lp 和 -ls 限制日志文件大小开发环境日志不用太大。创建完成后启动strmqm DEVQM1用 dspmq 查看状态dspmq -m DEVQM1看到 STATUS( Running ) 就说明队列管理器起来了。这里有个细节crtmqm 之后不要立刻反复启动日志初始化需要几秒钟手太快会看到 AMQ8124 之类的异常稍等再查就行。如果机器负载高首次启动可能要多等一会别急躁。4.2 用 MQSC 脚本完成队列、通道和监听器定义队列管理器起来后用 runmqsc 进入命令行环境定义资源。开发环境最常做的三件事建本地队列、建 SVRCONN 通道、建监听器。下面这段脚本可以直接存文件执行cat /tmp/devqm1.mqsc EOF DEFINE QLOCAL(Q1) MAXDEPTH(5000) DEFINE CHANNEL(SVRCONN) CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER(mqm) DEFINE LISTENER(LISTENER.TCP) TRPTYPE(TCP) PORT(1414) CONTROL(QMGR) START LISTENER(LISTENER.TCP) END EOF runmqsc DEVQM1 /tmp/devqm1.mqscQ1 是测试队列SVRCONN 是接收客户端连接的服务通道LISTENER 监听 1414 端口CONTROL(QMGR) 表示队列管理器启动时监听器自动拉起。MCAUSER(mqm) 很关键它把通道运行身份锁到 mqm避免匿名访问这也是 7.5 这类老版本最容易忽略的安全点。想确认配置生效可以再进 runmqsc 查一遍runmqsc DEVQM1 DISPLAY QLOCAL(Q1) DISPLAY CHANNEL(SVRCONN) DISPLAY LISTENER(LISTENER.TCP) END这里有个习惯值得养把所有定义语句保存成 .mqsc 脚本文件不要交互式一条条敲。后面重建环境、批量部署直接喂脚本就行这是我在生产环境被教训之后养成的习惯。4.3 防火墙放行与队列管理器状态检查队列管理器和监听器都配置好了但远程客户端未必能连上十有八九是防火墙。在 RHEL/CentOS 7 上先确认 firewalld 状态再把 1414 端口放出来firewall-cmd --zonepublic --add-port1414/tcp --permanent firewall-cmd --reload如果用的是 iptables也要对应加规则。验证监听端口已经 LISTENnetstat -tlnp | grep 1414这一步做完本地和局域网客户端才有资格谈连接。别忽略防火墙我见过太多人配置全对最后卡在防火墙上的案例。尤其是云服务器除了系统防火墙安全组规则也要一起确认两头都要放行。4.4 开机自启动设置开发环境重启后不想手工启动队列管理器可以配置服务。7.5 安装后一般会在 /etc/init.d 下放 mqm 服务脚本可以这样配置chkconfig --add mqm chkconfig mqm onCentOS 7 以上系统用 systemd 也能直接管理已有的 init 脚本。需要区分的是chkconfig 管的是系统服务队列管理器本身还是靠 strmqm 启动。不过搭配 CONTROL(QMGR) 的监听器很多时候重启后执行一条 service mqm start 就能把整套带起来。如果你对 systemd 更熟自己写 unit 管理 /opt/mqm/bin/strmqm 也不是不行注意用户和权限别用 root 去跑队列管理器进程。5. 开发验证用自带工具和 Java 连上 MQ5.1 amqsput / amqsget 验证消息收发安装完不把消息发一发、收一收等于没验证过。MQ 自带两个小工具amqsput 写消息amqsget 读消息位置一般在 /opt/mqm/samp/bin 下。先用服务器本地方式发一条/opt/mqm/samp/bin/amqsput Q1 DEVQM1输入几行文本CtrlD 结束。然后读出来/opt/mqm/samp/bin/amqsget Q1 DEVQM1能读到刚才输入的内容说明队列管理器和队列链路通了。还可以用带 c 的版本 amqsputc / amqsgetc 测试客户端连接它们走的是 MQI 客户端通道更能真实模拟应用连接。测试前先确保环境变量、通道、监听器都正常。我第一次用客户端版时忘了开监听器直接连接超时排了半天才发现问题这种低级错误只要链路完整就不会犯。5.2 用 Java 传统 API 写一个最简单的发送程序开发环境最终要接入 Java 应用7.5 时代最常见的是传统 API代码非常简洁。先建一个 MQTest.javaimport com.ibm.mq.*; public class MQTest { public static void main(String[] args) throws Exception { MQEnvironment.hostname 127.0.0.1; MQEnvironment.port 1414; MQEnvironment.channel SVRCONN; MQQueueManager qm new MQQueueManager(DEVQM1); MQQueue q qm.accessQueue(Q1, MQC.MQOO_OUTPUT); MQMessage msg new MQMessage(); msg.writeUTF(hello mq from java); q.put(msg); q.close(); qm.disconnect(); System.out.println(put ok); } }编译运行前要拿到三个 jar7.5 通常位于 /opt/mqm/java/lib 下export CLASSPATH/opt/mqm/java/lib/com.ibm.mq.jar:/opt/mqm/java/lib/com.ibm.mqjms.jar:/opt/mqm/java/lib/jms.jar javac MQTest.java java MQTest这里走的是远程连接模式所以运行时必须保证 SVRCONN 通道存在、MCAUSER 有权限。如果报 MQJMS2013 或 2035基本就是通道或授权的问题回头查通道定义和 mqm 用户权限。这个示例虽短但已经把生产代码里最核心的几步都覆盖了连接、打开队列、写入、关闭、断开。5.3 日常监控dspmq、runmqsc、日志位置开发环境不像生产那么严苛但至少要会看状态和日志。dspmq 查队列管理器状态runmqsc 的 DISPLAY 命令查队列深度和通道状态dspmq -m DEVQM1 runmqsc DEVQM1 DISPLAY QSTATUS(Q1) CURDEPTH DISPLAY CHSTATUS(SVRCONN) END错误日志都在 /var/mqm/qmgrs/DEVQM1/errors/ 下文件名是 AMQERR01.LOG。遇到“起不来”“连不上”一类问题第一件事不是猜而是去 tail 这个日志。太多问题都是日志先告诉你答案我因为没看日志而白折腾的次数太多现在已经养成习惯任何异常先翻日志再动命令。6. 安装配置高频问题与避坑实录6.1 安装阶段 3 个常见报错先说 rpm 阶段最常遇到的三个坑。依赖报错比如缺 libXext.so.6 或 libstdc.so.6解决办法是用 yum 补齐依赖不要直接 rpm --nodeps 强装因为强装后 GSKit 或运行时可能异常后面部署 SSL 时才会发现隐患那时再排查更痛苦。权限问题安装时用了非 root 用户执行 rpm会提示权限不够。安装动作必须以 root 执行运行阶段才切换到 mqm 用户。区分这两个阶段很重要不然容易把 /opt/mqm 的属主搞乱。mqlicense.sh 卡住某些环境由于没有 tty 或 X11脚本会停在交互等待。解决办法就是在纯命令行的 SSH 会话里加 -accept 参数直接接受不要犹豫。这套组合拳打下来绝大多数安装问题都能解决。6.2 队列管理器启动失败怎么查crtmqm 成功但 strmqm 启动失败先看事件日志错误码都会记录在 AMQERR01.LOG 里。常见原因有三个一是 /var/mqm 磁盘空间不足队列管理器目录初始化失败二是 hostname 解析异常导致 MQ 在绑定网络时找不到主机三是之前异常退出队列管理器进入重建日志状态。排查思路并不复杂清磁盘、修 hostname 解析、或者用 dltmqm 删除后重新创建但做删除操作前必须确认没有重要数据。这里唯一要强调的是别一上来就 dltmqm先把日志看完。很多情况只需要 endmqm -i 强制结束或者用重置命令恢复日志就能救回来。我见过不止一个同事手快把测试环境删了最后从备份恢复花了半天。6.3 远程连接不上一条链路拆开排查远程连不上是最常见也最啰嗦的问题我习惯按链路顺序排查每一步都有明确的预期结果排查项命令预期结果队列管理器状态dspmq -m DEVQM1STATUS( Running )监听器状态runmqsc 里 DISPLAY LISTENERLISTENER 已启动端口监听netstat -tlnp | grep 14141414 端口 LISTEN防火墙规则firewall-cmd --list-ports1414/tcp 已放行通道配置runmqsc 里 DISPLAY CHANNEL(SVRCONN)CHLTYPE(SVRCONN)授权校验客户端程序运行日志无 2035 / MQJMS2013任何一环断了表现都是连接超时或 2035 授权失败。建议把每步输出都截下来对比别凭感觉猜。特别是刚接触 MQ 的新人经常从客户端一路查到服务端反复试不如先从服务端顺序往下推效率高很多。6.4 安全与授权开发环境也别裸奔7.5 默认的通道并不像 9.x 那样默认启用 CHLAUTHSVRCONN 通道如果没配 MCAUSER相当于任何人连上来都能以高权限身份操作这在生产上是灾难级别的问题。开发环境即便只在内网使用也建议至少做三件事第一通道加上 MCAUSER 锁定到 mqm第二在防火墙层面把 1414 端口限制在开发网段第三涉及生产的 SSL/TLS 配置要单独规划不要复用开发证书。另一个连带问题就是消息重复消费。客户端在消费后未确认就断线或者消费者侧业务处理异常重启MQ 会根据持久性和会话恢复机制重新投递消息这也是热搜里“消息队列重复消费问题”的现实来源。开发验证时可以故意杀掉消费者观察重投行为生产上必须靠应用侧做幂等设计。别指望 MQ 帮你正好投递一次这做不到。装完这一整套我个人最大的体会是IBM MQ 7.5 虽然老但它的管理思路、队列模型、通道机制至今没有过时学会它就等于掌握了一大批存量系统的钥匙。最后再分享一个小技巧把 mqsc 定义脚本保存到版本库每次建队列、加通道都走脚本执行不要人工一条条敲这样既能回滚也能秒级复现一套环境。如果公司后续预算允许建议尽早规划升级到 9.x LTS 版本迁移时你会发现当年在 7.5 上学到的 mqsc 和 JMS 知识几乎全能平移过去。
返回列表