MQの簡単ヘルスチェック(ローカル)
某社でMQ担当の設定やオペレーションのミスがあまりにも多くて「設定後やサーバの再起動後にヘルスチェックやってないの?」と聞いてみたら「MQにそんな手段は存在しない。プログラムの側で確認して貰うしかない。」と返してきたので「本当かいな?」と思い確認してみた時の記録。
1〜2は環境構築なので、実際に行う手順は3のみ。4は異常時の確認。
1.IBMのDockerイメージから環境構築
作業環境にdockerが入っていないかったので、そこから。
# yum -y install docker-io # service docker start # git clone https://github.com/ibm-messaging/mq-docker
ただそのままだと確認用プログラム(MQSeriesSamples)とリモート確認用ライブラリ(MQSeriesClient)が入っていないので、Dockerfile編集。
# cd mq-docker # vi server/Dockerfile 変更前 ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm" 変更後 ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm MQSeriesSamples*.rpm MQSeriesClient*.rpm" # docker build --tag mq ./server/ # docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --volume /var/example:/var/mqm --publish 1414:1414 --detach mq # docker ps # docker exec -it コンテナのID /bin/bash
2.キュー作成
https://github.com/ibm-messaging/mq-docker の手順そのままで起動したのでMQ1というキューマネージャがあるが、それはそれとして別に作る。
以下はコンテナ内でのコマンドである。念のため。
2.1 キュー・マネージャー作成
以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00237_.htm
# crtmqm QM_ORANGE # strmqm QM_ORANGE
2.2 キュー作成
以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00238_.htm
# runmqsc QM_ORANGE 5724-H72 (C) Copyright IBM Corp. 1994, 2016. Starting MQSC for queue manager QM_ORANGE. define qlocal (QM_APPLE) usage (xmitq) 1 : define qlocal (QM_APPLE) usage (xmitq) AMQ8006: IBM MQ queue created. define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE) 2 : define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE) AMQ8006: IBM MQ queue created.
2.3 メッセージ・チャネル作成、リスナー起動
以下からコピペ。2.2からの続きで "runmqsc QM_ORANGE" 実行中なので注意。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00239_.htm
define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP) 3 : define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP) AMQ8014: IBM MQ channel created. alter listener(system.default.listener.tcp) trptype(tcp) port(1414) 4 : alter listener(system.default.listener.tcp) trptype(tcp) port(1414) AMQ8623: IBM MQ listener changed. start listener(system.default.listener.tcp) 5 : start listener(system.default.listener.tcp) AMQ8021: Request to start IBM MQ listener accepted. end 6 : end
3.サンプルプログラムで動作確認
MQに付帯しているサンプルプログラムを実行することで、キューマネージャ、リスナーが起動しているか確認。
3.1 PUT
とりあえず"UNKO"ってメッセージ入れてみた。リターンキーを二回打つとリクエストを終了させる。
# /opt/mqm/samp/bin/amqsput QM_APPLE QM_ORANGE Sample AMQSPUT0 start target queue is QM_APPLE UNKO Sample AMQSPUT0 end
3.2 キューの中身確認
入ってますな。
# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE AMQSBCG0 - starts here ********************** MQOPEN - 'QM_APPLE' MQGET of message number 1, CompCode:0 Reason:0 ****Message descriptor**** StrucId : 'MD ' Version : 2 Report : 0 MsgType : 8 Expiry : -1 Feedback : 0 Encoding : 546 CodedCharSetId : 819 Format : 'MQSTR ' Priority : 0 Persistence : 0 MsgId : X'414D5120514D5F4F52414E47452020205AF1C458BEB37F25' CorrelId : X'000000000000000000000000000000000000000000000000' BackoutCount : 0 ReplyToQ : ' ' ReplyToQMgr : 'QM_ORANGE ' ** Identity Context UserIdentifier : 'root ' AccountingToken : X'0130000000000000000000000000000000000000000000000000000000000006' ApplIdentityData : ' ' ** Origin Context PutApplType : '6' PutApplName : 'amqsput ' PutDate : '20170312' PutTime : '07110730' ApplOriginData : ' ' GroupId : X'000000000000000000000000000000000000000000000000' MsgSeqNumber : '1' Offset : '0' MsgFlags : '0' OriginalLength : '-1' **** Message **** length - 4 of 4 bytes 00000000: 554E 4B4F 'UNKO ' No more messages MQCLOSE MQDISC
3.3 GET
取れてますな。15秒ほど待つとタイムアウトで接続が切れる。
# /opt/mqm/samp/bin/amqsget QM_APPLE QM_ORANGE Sample AMQSGET0 start message <UNKO> no more messages
3.4 もう一度キューの中身確認
GETで取得したので、残ってませんな。
# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE AMQSBCG0 - starts here ********************** MQOPEN - 'QM_APPLE' No more messages MQCLOSE MQDISC
4.異常時
4.1 キュー・マネージャーを落としてみる
# endmqm QM_ORANGE Quiesce request accepted. The queue manager will stop when all outstanding work is complete. # dspmq QMNAME(QM1) STATUS(Running) QMNAME(QM_ORANGE) STATUS(Ended normally)
4.2確認してみる。
接続エラー出た。
# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE AMQSBCG0 - starts here ********************** MQCONNX failed with CompCode:2, Reason:2059
4.3 エラーコード確認
上で出たエラーコード 2059を確認。キュー・マネージャーが落ちていることが確認できる。
# /opt/mqm/bin/mqrc 2059 2059 0x0000080b MQRC_Q_MGR_NOT_AVAILABLE
アプリ側に頼らなくとも、MQの付属品で十分確認出来ますな。
以上。