...

チャネル接続 トピック 機能と構成 WebSphere

by user

on
Category: Documents
1328

views

Report

Comments

Transcript

チャネル接続 トピック 機能と構成 WebSphere
WebSphere MQ v7.0 機能と構成
チャネル接続
ISE エンタープライズ・ミドルウェア
2009年07月
トピック
チャネル接続
MQクライアント
MQシステムの構成
リモート・システムとの通信
MQクライアント接続
接続情報の与え方
チャネル数の制御
非同期メッセージ送信
メッセージ先読み
キュー・マネージャー間接続
キュー・マネージャー間接続の構成要素
リモートのキューへの送信
リモート・キューの定義
チャネルのトリガリング
転送メッセージのバッチ化
チャネルのバッチ・インターバル
FASTチャネル
文字コード変換
チャネルEXIT
チャネルのハートビート
メッセージの暗号化
チャネルのメッセージ圧縮
ローカル・アドレスの指定
MQクラスター
MQクラスターとは
MQクラスターの利点
MQクラスターの構成要素
MQクラスター関連コマンド
クラスター・キューへの送信方法
ワークロード・バランシングの制御
MQクラスター構成での考慮点
2
チャネル接続
3
MQシステムの構成
サーバー環境 / クライアント環境
MQは2種類のコードを提供
サーバー・フィーチャー、クライアント・フィーチャー
サーバー環境
サーバー・フィーチャーを導入した環境
キュー・マネージャーを作成し、稼働させることが可能
クライアント環境
クライアント・フィーチャーを導入した環境
リモートのキュー・マネージャーに接続してキューを読み書きするアプリケーションを稼働させることが可能
– MQクライアント接続
キュー・マネージャーを作成することはできない
– 前提H/Wスペックの緩和、システム管理 / 運用コストが小さい
キュー・マネージャー
プログラムA
(MQクライアント接続)
プログラムB
(ローカル接続)
チャネル
ローカル・キュー
ローカル・キュー
システムA(クライアント環境)
4
システムB(サーバー環境)
リモート・システムとの通信
キュー・マネージャー間接続
アプリケーションは同一マシンのキュー・マネージャーとローカル接続してキューにメッセージを読み書きする
チャネルがキュー・マネージャー間のメッセージの転送を保証
非同期通信
リモートのキュー・マネージャーが稼働していなくても、アプリケーションはメッセージの送信が可能
キュー・マネージャーA
プログラムA
(ローカル接続)
キュー・マネージャーB
チャネル
ローカル・キュー
トランスミッション・キュー
システムA
システムB
キュー・マネージャー間接続
MQクライアント接続
アプリケーションはリモートのキュー・マネージャーとMQクライアント接続してキューにメッセージを読み書きする
同期通信
リモートのキュー・マネージャーが稼働していないと、アプリケーションはメッセージを送信できない
キュー・マネージャーB
プログラムB
(MQクライアント接続)
チャネル
ローカル・キュー
システムA
システムB
MQクライアント接続
5
リモート・システムとの通信
MQクラスター
キュー・マネージャー間接続の1つ
論理的に関連付けられたキュー・マネージャーの集まりのこと
MQクラスター内に複数存在するクラスター・キューへのメッセージ自動振り分けが可能
プログラムA
(ローカル接続)
キュー・マネージャーA
キュー・マネージャーB
チャネル
ローカル・キュー
トランスミッション・キュー
システムA
システムB
ラウンド・ロビン
チャネル
キュー・マネージャーC
MQクラスター
ローカル・キュー
システムC
6
キュー・マネージャー間接続
7
キュー・マネージャー間接続の構成要素
構成要素
キュー・マネージャー
キュー、チャネルなどの管理
基本的に1筐体毎に1つ作成
–パフォーマンス / 運用要件により追加を検討
キュー
メッセージを保持する論理的な箱
1キュー・マネージャーに複数作成
メッセージ・チャネル
キュー・マネージャー間のコミュニケーション・リンク
両端でMCA(メッセージ・チャネル・エージェント)が稼働
–MCAはキューにメッセージを読み書きする通信プログラム
キュー・マネージャー間上り下りで1対
プログラムA
プログラムB
プログラムC
MQPUT
MQGET
MQGET
MQI
リモート・キュー
MCA
チャネル
MCA
ローカル・キューA
トランスミッション・キュー
キュー・マネージャーA
8
キュー・マネージャーB
ローカル・キューB
キュー
キューの種類
ローカル・キュー
実体があり、メッセージを保持することができるキュー
トランスミッション・キュー
宛先キュー・マネージャーへの転送メッセージをローカルで一時的に保持する転送用のキュー
–特殊な属性をもつローカル・キュー
宛先キュー・マネージャー毎に作成
リモート・キュー
リモートのキュー・マネージャーのキューを指し示す定義
–宛先キュー・マネージャー名、宛先キュー名、トランスミッション・キュー名の情報をもつ
メッセージを書き込むと、トランスミッション・キューにメッセージが書き込まれる
プログラムA
MQPUT
プログラムB
リモート・キュー:AAA
MQGET
MCA
チャネル
MCA
ローカル・キュー:BBB
トランスミッション・キュー:QM2
キュー・マネージャー:QM1
キュー・マネージャー:QM2
9
メッセージ・チャネル
キュー・マネージャー間のコミュニケーション・リンク
送信側、受信側のそれぞれでチャネル定義を作成(定義名を同じにすること)
単一方向のメッセージ転送
キュー・マネージャー間に双方向のメッセージ転送があれば、2対のチャネル定義が必要
受信側ではリスナーを起動
リスナーは送信チャネルから受信チャネルの起動要求を受け取って、受信チャネルを起動
MQ提供のリスナー・プログラムかinetdでの起動の2種類(UNIXの場合)
チャネルの両端ではMCA(メッセージ・チャネル・エージェント)が稼動
MCAはメッセージをキューに読み書きする通信プログラム
送信側のMCAはトランスミッション・キューからメッセージを読み取り、ネットワークに送信
受信側のMCAは受信したメッセージを宛先キューに書き込む
宛先キューにメッセージが書き込めないとデッド・レター・キューに書き込む
デッド・レター・キューにも書き込めないとメッセージを破棄、または、チャネル異常終了
起動要求
プログラムA
リモート・キュー
MCA
(送信チャネル)
MQPUT
チャネル
リスナー
MCA
(受信チャネル)
デッド・レター・キュー
プログラムB
トランスミッション・キュー
宛先キュー
チャネル定義
10
チャネル定義
MQGET
メッセージ・チャネル
チャネルの起動と停止
チャネルが起動している時のみメッセージ送信が行われる
アプリケーションはチャネルの起動
/ 停止に関わらず、メッセージの書き込みが可能
コマンドにより操作
START
CHANNEL / STOP CHANNEL
チャネルの自動起動 / 自動停止
トランスミッション・キューにメッセージが入るとチャネルを起動(後述)
指定時間トランスミッション・キューにメッセージがなければ自動的に停止
メッセージ・チャネルのタイプ
SENDERチャネル(送信側チャネル)
メッセージの送信を行ない、チャネルの起動、停止が可能
SERVERチャネル(サーバーチャネル)
メッセージの送信を行ない、チャネルの起動(フル定義時)、停止が可能
RECEIVERチャネル(受信側チャネル)
メッセージの受信を行い、チャネルの停止が可能(※)
REQUESTERチャネル(要求側チャネル)
メッセージの受信を行い、チャネルの起動、停止が可能(※)
※ 自分だけ停止。送信側がSENDER、フル定義のSERVERの場合、送信側は接続再試行状態になる
11
<参考> メッセージ・チャネル
メッセージ・チャネルのタイプと組み合わせ
SENDER – RECEIVER
最も一般的な組み合わせ
START チャネル
MCA
[SENDERチャネル]
トランスミッション・キュー
メッセージ
MCA
[RECEIVERチャネル]
宛先ローカル・キュー
SENDER – REQUESTER
両方向からの起動が可能
ただし、前回停止したチャネルから起動する必要があり、運用上の考慮が必要
START チャネル
MCA
[SENDERチャネル]
トランスミッション・キュー
START チャネル(コールバック)
MCA
[REQUESTERチャネル]
宛先ローカル・キュー
メッセージ
SERVER – REQUESTER
START チャネル
MCA
[SERVERチャネル]
トランスミッション・キュー
メッセージ
12
MCA
[REQUESTERチャネル]
宛先ローカル・キュー
<参考> メッセージ・チャネル
メッセージ・チャネルのタイプと組み合わせ(続き)
SERVER(フル定義) – RECEIVER
トランスミッション・キュー
MCA
[SERVERチャネル]
(フル定義)
START チャネル
メッセージ
MCA
[RECEIVERチャネル]
宛先ローカル・キュー
SERVER(フル定義) – REQUESTER
両方からの起動が可能
ただし、前回停止したチャネルから起動する必要があり、運用上の考慮が必要
トランスミッション・キュー
MCA
[SERVERチャネル]
(フル定義)
START チャネル
メッセージ
MCA
[REQUESTERチャネル]
宛先ローカル・キュー
※ フル定義のSERVERチャネル定義とは、チャネルの開始可能に十分な属性定義(コネクション名)を定義したもの
13
リモートのキューへの送信
リモート・キューを経由した送信
MQOPEN(MQPUT1)時にMQODにローカル・システムのリモート・キュー名を指定
ローカル・キューマネージャー上にリモート・キューを定義
アプリケーションは宛先のキュー・マネージャー名とローカル・キュー名を意識しない
定義のみで宛先キューの変更が可能
⇒ 柔軟性が高い
アプリケーションは宛先のキュー・マネージャーやキューを意識する必要はない
宛先変更に対する柔軟性が高い
アプリケーション
アプリケーション
MQOPEN QR2
MQPUT
MQGET
<ローカル・システム>
DEFINE QREMOTE(QR2)
RNAME(QL2)
RQMNAME(QM2)
XMITQ(QM2)
<リモート・システム>
リモート・キュー : QR2
MCA
(送信チャネル)
MCA
(受信チャネル)
ローカル・キュー : QL2
チャネル
トランスミッション・キュー : QM2
キュー・マネージャー : QM1
14
キュー・マネージャー : QM2
リモートのキューへの送信
宛先のキュー・マネージャー / キュー名を直接指定した送信
MQOPEN(MQPUT1)時に、MQODに宛先システムの情報を指定
ObjectQMgrNameフィールドに宛先システムのキュー・マネージャー名を指定
ObjectNameフィールドに宛先システムのキュー名を指定
ローカル・キュー・マネージャー上にリモート・キューの定義は不要
宛先のキュー・マネージャー名と同一名のトランスミッション・キュー定義が必要
アプリケーションは宛先のキュー・マネージャー名とキュー名を意識
アプリケーション
MQOPEN
MQPUT
アプリケーション
MQOD:
ObjectName = QL2
ObjectQMgrName = QM2
MQGET
<ローカル・システム>
<リモート・システム>
MCA
(送信チャネル)
MCA
(受信チャネル)
ローカル・キュー : QL2
チャネル
トランスミッション・キュー : QM2
キュー・マネージャー : QM1
キュー・マネージャー : QM2
15
リモート・キューの定義
リモート・キュー定義により、アプリケーションは宛先のキュー・マネージャーやキューを意
識する必要はない
宛先変更に対する柔軟性が高い
リモート・キューに対する別名定義も可能
アプリケーション単位の別名定義により、アプリケーション単位でMQPUTの抑制ができる
MQOD
ObjectType
: MQOT_Q
ObjectName
: QR2
ObjectQMgrName : <ブランク>
リモート・キュー定義
QNAME
RNAME
RQMNAME
XMITQ
:
:
:
:
アプリケーション
MQOPEN QR2
MQPUT
QR2
QL2
QM2
QM2
MQXQH
RemoteQName
: QL2
RemoteQMgrName : QM2
MsgDesc
: MQMD
アプリケーション
MQGET
<ローカル・システム>
<リモート・システム>
リモート・キュー : QR2
MCA
(送信チャネル)
MCA
(受信チャネル)
ローカル・キュー : QL2
チャネル
トランスミッション・キュー : QM2
キュー・マネージャー : QM1
16
キュー・マネージャー : QM2
<参考> マルチ・ホップ(ステージング) 1対1方式
キューの定義によって宛先のキュー・マネージャーへの転送も可能
宛先のキュー・マネージャー名と同一のトランスミッション・キューを最終宛先のキュー・マネージャー以外に作成
アプリケーション
MQOPEN QR2 リモート・キュー定義
MQPUT
QREMOTE : QR2
RNAME
: QL2
RQMNAME : QM2
XMITQ
: QM2
リモート・キュー:
QR2
アプリケーション
MQOPEN QR3 リモート・キュー定義
MQPUT
QREMOTE : QR3
RNAME
: QL3
RQMNAME : QM3
XMITQ
: QM3
リモート・キュー:
QR3
アプリケーション
MQOPEN QR4 リモート・キュー定義
MQPUT
QREMOTE : QR4
RNAME
: QL4
RQMNAME : QM4
XMITQ
: QM4
リモート・キュー:
QR4
トランスミッション・キュー:
QM2
MCA(送信チャネル)
トランスミッション・キュー:
QM3
MCA(送信チャネル)
トランスミッション・キュー:
QM4
MCA(送信チャネル)
キュー・マネージャー:QM1
チャネル
チャネル
MCA(受信チャネル)
MCA(受信チャネル)
MCA(受信チャネル)
トランスミッション・キュー:
QM2
MCA(送信チャネル)
トランスミッション・キュー:
QM3
MCA(送信チャネル)
トランスミッション・キュー:
QM4
MCA(送信チャネル)
チャネル
チャネル
MCA(受信チャネル)
MCA(受信チャネル)
宛先ローカル・キュー:
QL2
宛先ローカル・キュー:
QL3
キュー・マネージャー:QM2
キュー・マネージャー:QM3
チャネル
チャネル
キュー・マネージャー:QMM
MCA(受信チャネル)
宛先ローカル・キュー:
QL4
キュー・マネージャー:QM4
17
<参考> マルチ・ホップ(ステージング) ハブ方式
中間のキュー・マネージャー(ハブ)を経由した宛先キュー・マネージャーへの転送も可能
チャネル・パスの最適化、資源管理の最適化
アプリケーション
MQOPEN QR2 リモート・キュー定義
MQPUT
QREMOTE : QR2
RNAME
: QL2
RQMNAME : QM2
XMITQ
: QMM
リモート・キュー:
QR2
アプリケーション
MQOPEN QR3 リモート・キュー定義
MQPUT
QREMOTE : QR3
RNAME
: QL3
RQMNAME : QM3
XMITQ
: QMM
リモート・キュー:
QR3
アプリケーション
MQOPEN QR4 リモート・キュー定義
MQPUT
QREMOTE : QR4
RNAME
: QL4
RQMNAME : QM4
XMITQ
: QMM
リモート・キュー:
QR4
トランスミッション・キュー:
QMM
MCA(送信チャネル)
キュー・マネージャー:QM1
チャネル
MCA(受信チャネル)
トランスミッション・キュー:
QM2
MCA(送信チャネル)
トランスミッション・キュー:
QM3
MCA(送信チャネル)
チャネル
チャネル
MCA(受信チャネル)
MCA(受信チャネル)
宛先ローカル・キュー:
QL2
宛先ローカル・キュー:
QL3
キュー・マネージャー:QM2
キュー・マネージャー:QM3
18
トランスミッション・キュー:
QM4
MCA(送信チャネル)
チャネル
キュー・マネージャー:QMM
MCA(受信チャネル)
宛先ローカル・キュー:
QL4
キュー・マネージャー:QM4
<参考> マルチ・ホップ(ステージング) ハブ応用方式
中間のキュー・マネージャー(ハブ)での集中キュー管理
アプリケーション
MQOPEN QR2 リモート・キュー定義
MQPUT
QREMOTE : QR2
RNAME
: QR21
RQMNAME : QMM
XMITQ
: QMM
リモート・キュー:
QR2
アプリケーション
MQOPEN QR3 リモート・キュー定義
MQPUT
QREMOTE : QR3
RNAME
: QR31
RQMNAME : QMM
XMITQ
: QMM
リモート・キュー:
QR3
アプリケーション
MQOPEN QR4 リモート・キュー定義
MQPUT
QREMOTE : QR4
RNAME
: QR41
RQMNAME : QMM
XMITQ
: QMM
リモート・キュー:
QR4
トランスミッション・キュー:
QMM
MCA(送信チャネル)
リモート・キュー定義
チャネル
QREMOTE : QR31
RNAME
: QL3
RQMNAME : QM3
MCA(受信チャネル)
XMITQ
: QM3
リモート・キュー:QR31
リモート・キュー定義
QREMOTE : QR21
RNAME
: QL2
RQMNAME : QM2
XMITQ
: QM2
リモート・キュー:QR21
トランスミッション・キュー:
QM2
MCA(送信チャネル)
トランスミッション・キュー:
QM3
MCA(送信チャネル)
チャネル
チャネル
MCA(受信チャネル)
MCA(受信チャネル)
宛先ローカル・キュー:
QL2
キュー・マネージャー:QM1
リモート・キュー定義
QREMOTE : QR41
RNAME
: QL4
RQMNAME : QM4
XMITQ
: QM4
リモート・キュー:QR41
トランスミッション・キュー:
QM4
MCA(送信チャネル)
チャネル
MCA(受信チャネル)
宛先ローカル・キュー:
QL3
キュー・マネージャー:QM2
キュー・マネージャー:QMM
宛先ローカル・キュー:
QL4
キュー・マネージャー:QM3
キュー・マネージャー:QM4
19
チャネルのトリガリング
トリガリングの機能によりチャネルを自動的にスタートさせることが可能
トランスミッション・キューにトリガリングの設定をすることにより、転送用のメッセージが書き込ま
れると自動的に対応するチャネルが開始
チャネルのトリガリングに必要な設定
トランスミッション・キューに以下の属性を指定
TRIGGER
TRIGTYPE(FIRST)
メッセージ
INITQ(SYSTEM.CHANNEL.INITQ)
–イニシエーション・キューは、
SYSTEM.CHANNEL.INITQ で固定
TRIGDATA(チャネル名)
キュー・マネージャー
:QM1
トリガー・メッセージ
<トランスミッション・キュー定義>
DEFINE QLOCAL(QM2)
USAGE(XMITQ)
TRIGGER
TRIGTYPE(FAST)
INITQ(SYSTEM.CHANNEL.INITQ)
TRIGDATA(QM1.TO.QM2)
トランスミッション・キュー:
QM2
起動
チャネル
イニシエーター
MCA
チャネル:
QM1.TO.QM2
SYSTEM.CHANNEL.
INITQ
チャネルの停止に注意が必要
STOPPEDのステータスのチャネルにはトリガーは発生しない
切断間隔の満了やSTOP CHANNELのオプション指定でINACTIVEのステータスで停止さ
せる
20
転送メッセージのバッチ化
チャネルは、複数のメッセージを1つのUOWとして転送
送受信MCA間で1UOW毎に同期がとられる
同期がとられるまでは受信側ではメッセージは取り出せない
(Fastチャネル使用時のノン・パーシステント・メッセージを除く)
バッチをコミットする前に受信側がActiveか確認することも可能(バッチ・ハートビート)
チャネルのBATCHSZ属性で指定
幾つのメッセージを1UOWとして転送するかの指定
バッチ・サイズが大きいほど、メッセージ転送のスループットは高い
トランスミッション・キューにバッチ・サイズ分のメッセージがない場合には、バッチ・インターバルに
指定された時間待ってそこまでで1UOWとして転送
BATCHSZ=5
送信
MCA
受信
MCA
Confirm
トランスミッション・キュー
Ack/Nack
BATCHSIZE=5
21
チャネルのバッチ・インターバル
バッチ・サイズに到達しないメッセージの同期を、指定した間隔待つ機能
小さなバッチ毎の同期フローを減らすことによるメッセージのスループット向上
メッセージが断続的にくる場合に、ネットワーク・コストを削減
受信側がメッセージを受け取る時間は通常は遅くなる
FASTチャネル上のノン・パーシステント・メッセージには影響しない(バッチサイズには数えられる)
チャネルのBATCHINT属性で指定
SDR, SVR, CLUSSDR, CLUSRCVRチャネルのみ指定可能
最初のメッセージが来てからメッセージを待っている合計時間
メッセージをトランスミッション・キューから取り出して転送する時間は含まない
バッチ・インターバルが0であれば、最後のメッセージ送信後すぐに同期処理
合計1秒
待つ
BATCHINT=1000
送信
MCA
受信
MCA
Confirm
トランスミッション・キュー
Ack/Nack
BATCHSIZE=5
22
FASTチャネル
ノン・パーシステント・メッセージをチャネル間の同期処理を行なわずに転送する機能
ノン・パーシステント・メッセージは、より速く宛て先のキューに配布される
ノン・パーシステント・メッセージもチャネルのバッチ数にはカウントされる
パーシステント・メッセージの転送は従来通りバッチ・サイズ毎に同期をとって配布される
チャネルのNPMSPEED属性で設定
FASTチャネル障害時、転送途中のノン・パーシステント・メッセージはロストする
パーシステント・メッセージ
P-メッセージ
P-メッセージ
ノン・パーシステント・メッセージ
NP-メッセージ
送信
MCA
P-メッセージ
P-メッセージ
パーシステント・メッセージ
受信
MCA
パーシステント・メッセージ
NP-メッセージ
P-メッセージ
P-メッセージ
トランスミッション・キュー
NPMSPEED(FAST)
BATCHSIZE=5
23
文字コード変換
メッセージの文字コード変換を行なう機能
CCSID(文字)とエンコーディング(数値)に基づいてコード変換を行う
CCSIDとエンコーディングはキュー・マネージャーや個々のメッセージで指定
メッセージ・ヘッダー部(MQMD)の変換
MQMDコード変換はMCAが自動的に行なう
–チャネル間でお互いのCCSIDとエンコーディングをやりとりし、接続可否を決定
–チャネル折衝時には両側のキュー・マネージャーのCCSIDとエンコーディング値が使用される
コード変換の対象
–文字型フィールドはCCSIDに基づいてコード変換
–数値フィールドはエンコーディングに基づいて変換
–バイナリー・フィールド(メッセージIDや相関ID)は変換対象外
ユーザー・データ部の変換
全て文字で構成
: MQにより変換可能
ユーザー定義フォーマット : ユーザーEXITにより変換
メッセージ
MQMD(メッセージの属性)
ユーザー・データ部
メッセージ・ヘッダー
MCAが必要に応じて変換(EBCDIC&ASCII)
アプリケーション・データ
MQでの変換、またはユーザーが必要に応じて変換
24
MQGET
文字コード変換
CCSIDの設定と影響範囲
キュー・マネージャーのCCSID属性に設定
メッセージ・ヘッダーのコード変換に使用される
–チャネルでのユーザー・メッセージの変換先CCSIDとしても使用
転送メッセージの内容には関係しない
キュー・マネージャー間の接続(チャネル)およびメッセージ転送可否に影響を与える
メッセージ属性(MQMDのCodedCharsetId)に設定
ユーザー・データ部の文字型データのCCSIDを示す
–アプリケーションで設定可能だが、特に指定しなければキュー・マネージャーのCCSIDがセットされる
ユーザー・データ部のコード変換に使用
エンコーディングの設定と影響範囲
キュー・マネージャーが稼動するプラットフォームにより決定される
MQヘッダー内の数値データはMCAが自動的に変換
メッセージ属性(MQMDのEncoding)に設定
デフォルトではキュー・マネージャーの稼動する環境の値がセットされる
ユーザーが定義することも可能だが、デフォルトを使用することを推奨
25
文字コード変換
デフォルト・コードページ
変換をサポートしていないCCSIDのキューマネージャー間で接続を行う方法
デフォルト指定されたCCSIDを使用してチャネルを接続
デフォルト・コードページの利用により、DBCSとSBCSのキュー・マネージャー接続も可能
MQクライアント・チャネルでも使用可能
デフォルト・コードページの指定
ccsid.tblファイルにデフォルトのコードページを設定
DEFAULT
DATA CONVERSIONのパートにてデフォルトEBCDIC CCSIDとデフォルトASCII
CCSIDを指定
:
# DEFAULT DATA CONVERSION
:
#
# Default conversions are enabled by creating two lines similar to the
# two following, but removing the # character which indicates a comment.
#
#default
0x1100
500
← コメントを外す
#default
0x2100
850
← コメントを外す
#
# The first line sets the default for EBCDIC CCSIDs to 500
# and the second sets the default for ASCII and similar CCSIDs to 850.
:
ccsid.tblの配置先(デフォルト)
UNIX
: /var/mqm/conv/table
Windows : C:¥Program Files¥IBM¥WebSphere MQ¥conv¥table
26
文字コード変換
ユーザー・データの変換場所
送信側でデータの変換を実施する場合
送信側でチャネルの属性をCONVERT(YES)に設定
基本的にはMQGET時に変換させるようにする。変換が送信側でしかサポートされないような場合は
チャネルを使用する
アプリケーション
MCA
(送信チャネル)
ローカル・キュー : QL2
チャネル
トランスミッション・キュー : QM2
キュー・マネージャー : QM1
MQGET
MCA
(受信チャネル)
チャネル定義
CONVERT(YES
YES)
YES
キュー・マネージャー : QM2
受信側でデータの変換を実施する場合
受信側のアプリケーションでMQGET時にMQGMO_CONVERTオプションを指定
アプリケーション
MCA
(送信チャネル)
ローカル・キュー : QL2
チャネル
トランスミッション・キュー : QM2
キュー・マネージャー : QM1
チャネル定義
CONVERT(NO
NO)
NO
キュー・マネージャー : QM2
27
チャネルEXIT
チャネル接続におけるユーザーEXIT
MCAのチャネルEXIT
MCAの処理サイクル中にスケジュール
–
–
–
–
–
–
セキュリティーEXIT
送信EXIT
受信EXIT
メッセージEXIT
メッセージ・リトライEXIT
自動定義EXIT
EXITの設定
チャネルの定義で指定
セキュリティーEXIT
送信EXIT
受信EXIT
メッセージEXIT
メッセージ・リトライEXIT
: SCYEXIT
: SENDEXIT
: RCVEXIT
: MSGEXIT
: MREXIT
キュー・マネージャーの定義で指定
自動定義EXIT
MQGET
(MQGMO_CONVERT)
MCA
(受信チャネル)
: CHADEXIT
28
チャネルEXIT
EXITタイプ
スケジュール・ポイント
主な用途
セキュリティー
チャネル開始時の初期データ交換後
EXIT内で定義した形式でのセキュリティー・メッセージの交換の起動
か可能
(両側のEXITが許可した場合にのみ後続の転送処理が可能)
メッセージ
[送信側]
メッセージをXmitキューから取り出した直後で必要に応じて
セグメント化する直前
MQXQH(MQMD、ユーザー・メッセージを含む)内のフィールドの変
更が可能
-暗号化/複合化
-入力ユーザーIDの検証
-ユーザー・メッセージ部のコード変換
-メッセージ部の宛先の変換
-MQMDのReply-to情報の変更
-MQMDのコンテキスト情報の変更
-ユーザー・ジャーナリング
[受信側]
メッセージを宛先のキューに書き出す直前
送信
各転送データの先頭8バイトを除いては全ての転送情報の変更が
可能
1つのセグメントを送信する直前(両側)
(ユーザー・メッセージ以外(ステータス・データなど)のセグメ
ント・データに対してもスケジュールされるが初期データの交
換、およびセキュリティー・チェック・フェーズではスケジュールさ
れない)
受信
-暗号化/複合化
-データの圧縮/拡張
-ユーザー・ジャーナリング
1つのセグメントを受信した直後(両側)
(ユーザー・メッセージ以外(ステータス・データなど)のセグメ
ント・データに対してもスケジュールされるが初期データの交
換、およびセキュリティー・チェック・フェーズではスケジュールさ
れない)
メッセージ・リトライ
宛先キューへの書き込みが失敗した直後
MQXQH(MQMD、ユーザー・メッセージを含む)内のフィールドの変
更が可能
-自動的なリトライ機能の提供
29
<参考> チャネルEXIT
チャネルEXITのスケジュールとタイミング
<送信側MCA>
<受信側MCA>
START CHANNEL
初期データ交換
初期データ交換
チャネル
セキュリティーEXIT
セキュリティーEXIT
MQGET メッセージ
メッセージEXIT
トランスミッション・キュー
Form next segment
IF last segment in batch
THEN
Record batch_id in doubt
Set confirm_request and
batch_id in header
ENDIF
Receive segment
受信EXIT
Add to message
送信EXIT
メッセージEXIT
MQPUT message
(MSGリトライEXIT)
IF batch receive OK
THEN
Record batch_id
Commit batch
Set status_OK in header
ELSE
Rollback batch
Set status_error in header
Prepare error data
ENDIF
送信EXIT
Transmit status segment
Transmit segment
Receive status segment
受信EXIT
CASE
WHEN status_OK
Record batch_id OK
Commit batch
WHEN status_error
Rollback
ENDCASE
30
宛先ローカルキュー
チャネルのハートビート
チャネル間でメッセージが転送されていない時にハートビートを行なう機能
送信側チャネルはハートビートを送信、受信側チャネルはハートビート応答を折り返す
送信側チャネルがネットワークや受信側チャネルの障害をより早く検知することができる
受信側チャネルがハートビートにより、MQリソース(オープンしているキューなど)を開放できる
チャネルのHBINT属性で設定
全てのチャネル・タイプで設定可能
送信側と受信側の設定が異なる場合は、チャネル間の折衝で長い方の間隔がとられる
送信側チャネル
キュー・マネージャー
受信側チャネル
HeartBeat
MQGET WAIT
キュー・マネージャー
HeartBeat応答
MQGET WAIT
HeartBeat
HeartBeat応答
:
31
メッセージの暗号化
チャネル接続でSSLプロトコルをサポート
SSL 3.0をサポート
クライアント認証も選択可能
全てのチャネル・タイプで使用することができる
メッセージ・チャネル、MQIチャネル、クラスター・チャネル
証明書の識別名(DN)によるフィルタリングが可能
証明書のDNをもとに接続の許可
/ 拒否を制御することができる
証明書失効リスト(CRL)への照会
SSLアクセラレータのサポート
リモート・キュー
プログラムA
MCA
(送信チャネル)
MQPUT
セキュアな通信
MCA
(受信チャネル)
プログラムB
SSLチャネル
トランスミッション・キュー
宛先キュー
MQGET
証明書
証明書
SSLアクセラレータ
証明書失効リスト
(LDAPサーバ)
32
SSLアクセラレータ
チャネルのメッセージ圧縮
チャネル間でメッセージを圧縮して転送
ネットワーク資源を効率的に利用
簡易なメッセージ暗号化の手段としても利用可能
MQクライアント接続でも利用可能
チャネル毎にヘッダー部とメッセージ部に分けて、圧縮有無 / 圧縮方法を指定可能
チャネルのCOMPHDR、COMPMSG属性で設定
メッセージ・データ
MQXQH
ヘッダー部で指定可能なアルゴリズム
NONE
:なし
SYSTEM :XOR+RLE
メッセージ部で指定可能なアルゴリズム
NONE
:なし
RLE
:同じ文字が連続する場合に有効
ZLIBFAST/ZLIBHIGH :ZLIB圧縮関数を利用
ANY
:送信側に従う
圧縮方法の決定
チャネル開始時に折衝を行い、同じ圧縮方法が設定されている時のみ圧縮を行なう
必ず、送信側チャネルの指定に従う場合は、受信側チャネルをANYに設定する
33
ローカル・アドレスの指定
アウトバウンドの通信に使用するIPアドレス、ポートを固定することが可能
トランスポート・タイプがTCPの以下のチャネルでのみ指定可能
SDR、SVR、
RQSTR、CLNTCONN、CLUSSDR、CLUSRCVR
チャネルのLOCLADDR属性で指定
IPアドレスおよびポート(ポート範囲)で指定
ファイアウォールを介して通信を行っている場合などで有効
ローカル・アドレスを設定できるため、仮想IPアドレスを指定してファイアー・ウォールを通過させることが
可能
ファイアー・ウォール上での管理が減少
–複数キュー・マネージャー上で共通の仮想IPアドレスを使用することが可能
QM1
192.168.0.10
192.168.10.100(仮想IPアドレス)
QM2
192.168.0.11
192.168.10.100(仮想IPアドレス)
ファイアーウォール
QM1/QM2共に共通の仮想IPアドレスを使用
34
<参考> キュー・マネージャー間接続環境の構築
キュー・マネージャー間接続環境の構築
作成する環境
キュー・マネージャー:QM1とQM2で構成されるキュー・マネージャー間接続環境を構築
チャネル・タイプはSENDER-RECEIVERで作成
QM1のアプリケーションから、QM2のローカル・キュー:QL2にメッセージを送信する
アプリケーション
アプリケーション
MQPUT
MQGET
<ローカル・システム>
<リモート・システム>
リモート・キュー : QR2
MCA
(送信チャネル)
トランスミッション・キュー : QM2
チャネル :
QM1.TO.QM2
MCA
(受信チャネル)
キュー・マネージャー : QM1
ローカル・キュー : QL2
キュー・マネージャー : QM2
IPアドレス/ポート番号:192.168.0.10(1414)
IPアドレス/ポート番号:192.168.0.20(1414)
35
<参考> キュー・マネージャー間接続環境の構築
QM1での作業(前提:キュー・マネージャーは作成済み)
リモート・キューの作成
DEFINE QREMOTE(QR2) RNAME(QL2) RQMNAME(QM2)
トランスミッション・キューの作成
DEFINE QLOCAL(QM2) USAGE(XMITQ)
送信チャネルの作成
DEFINE CHL(QM1.TO.QM2) CHLTYPE(SDR) TRPTYPE(TCP)
CONNAME(192.168.0.20) XMITQ(QM2)
36
<参考> キュー・マネージャー間接続環境の構築
QM2での作業(前提:キュー・マネージャーは作成済み)
ローカル・キューの作成
DEFINE QLOCAL(QL2)
受信チャネルの作成
DEFINE CHL(QM1.TO.QM2) CHLTYPE(RCVR) TRPTYPE(TCP)
リスナーの作成
DEFINE LISTENER(LISTENER1414) TRPTYPE(TCP)
37
ブランク・ページ
38
MQクライアント
39
MQクライアント接続
MQクライアント接続の動作
MQCONNの発行により、キュー・マネージャー側でサーバー接続チャネルが起動
マルチスレッド・アプリケーションでは、スレッド間でTCP/IPソケットの共有も可能
アプリケーションの通信相手はサーバー接続チャネル
サーバー接続チャネルがキュー・マネージャーと接続し、MQIコールを代替実行
アプリケーションとサーバー接続チャネルは同期処理(リクエスト / リプライ通信)を行う
アプリケーションは、MQI実行要求を送信し、MQIの実行結果を応答として受信
起動
接続要求
MQクライアント・アプリ
リスナー
サーバー接続チャネル
MQCONN
MQCONN
MQOPEN
MQOPEN
:
MQクライアント・ライブラリ
キュー・マネージャー
:
チャネル接続している間(MQCONN ~ MQDISC)はハートビートを送信
全てのタイミングでハートビートによる障害検知が可能
キュー・マネージャー⇔MQクライアントの双方向で送信し双方で早期に障害を検知
40
MQクライアント接続
MQクライアント環境でのアプリケーション
ローカル接続のアプリケーションとコーディングは同等
C、C++、・・・
Java
MQクライアント・ライブラリをリンクするとMQクライアント・アプリケーション
MQEnvironmentクラス(MQ base Java)、接続ファクトリ(JMS)にローカル接続 /
クライアント接続を記述
考慮点、その他
キュー・マネージャーをコーディネータとした2PhaseCommitは不可
(MQBEGINを発行できない)
明示的に同期点オプションを指定しないと、接続先プラットフォームのデフォルト値に従う
– MQ/zOSに接続
– MQ/UNIX・PCに接続
--> 同期点処理に参加
--> 同期点処理に参加しない
キュー・マネージャーへ接続するために、接続先情報が必要
(後述)
41
接続先情報の与え方
接続先情報の与え方
MQクライアントがキュー・マネージャーに接続するために下記の情報が必要
「クライアント接続チャネル名」、「ネットワーク・プロトコル」、「接続先アドレス情報」
接続先情報の与え方は3種類
接続先情報の与え方
Java以外(C、C++、COBOL、・・・)
Java(MQ base Java、JMS)
MQSERVER環境変数
○
×
チャネル定義テーブル
○
○ (MQv6.0以降)
プログラム内に記述
○(MQCONNX)
MQEnvironmentクラス(MQ base Java)、
接続ファクトリ(JMS)
接続先の障害を検知して、「接続先の自動切換え」を行うのはチャネル定義テーブルでの接続だけ
42
MQSERVER環境変数
MQSERVER環境変数
アプリケーションの起動環境に設定
「チャネル名」、「プロトコル」、「アドレス情報」を‘/’(スラッシュ)区切りで指定
(UNIX)
export MQSERVER=クライアント接続チャネル名/プロトコル/アドレス情報
(Windows)
set
MQSERVER=クライアント接続チャネル名/プロトコル/アドレス情報
・例. MQSERVER=TO.QMGR01/TCP/111.111.111.111(1111)
・クライアント接続チャネル名はキュー・マネージャー側のサーバー接続チャネルに合わせる
Java(MQ base Java、JMS)からは使用できない
クライアント接続チャネルの属性がデフォルト値になるため、チャネルの詳細オプションを利用できない
SSLチャネル、チャネルのメッセージ圧縮機能を利用できない
アプリケーション側でチャネルEXITを利用できない
など
43
チャネル定義テーブル
チャネル定義テーブル
キュー・マネージャー側でクライアント接続チャネルを作成
対になるサーバー接続チャネルと同じ名前で作成
チャネル定義テーブル・ファイルにチャネル定義が保存される
DEFINE CHANNEL(チャネル名) CHLTYPE(CLNTCONN)
TRPTYPE(xxxx) CONNAME(xxxxx) QMNAME(xxxxxx) ・・・
・QMNAMEは、アプリケーションが接続先を検索するためのキー(詳細はP46「チャネル定義の検索」を参照)
チャネル定義テーブル・ファイルの位置
UNIX
・・・ /var/mqm/qmgrs/<QMgrName>/@ipcc/AMQCLCHL.TAB
Windows ・・・ <inst_dir>¥qmgrs¥<QMgrName>¥@ipcc¥AMQCLCHL.TAB
チャネル定義テーブル・ファイルをアプリケーション側に配布
QMGR01
ファイル転送を行う場合は、バイナリ・モードで転送
MQクライアント・アプリ
44
チャネル定義テーブル・ファイル
チャネル定義テーブル
アプリケーション側のチャネル定義テーブル・ファイルの指定
C、C++、・・・(Java以外)
デフォルト
UNIX
・・・ /var/mqm/AMQCLCHL.TAB
Windows ・・・ <inst_dir>¥AMQCLCHL.TAB
環境変数の設定で任意の位置、名前に配置することも可能
AMQCHLLIB ・・・ 配置ディレクトリ
AMQCHLTAB ・・・ チャネル定義テーブルのファイル名
Java
MQ
base Java
–MQQueueManagerを作成するとき、チャネル定義テーブル・ファイルの位置をURL指定で渡す
java.net.URL table = new URL("file:///home/admdata/ccdt1.tab");
MQQueueManager qmgr = new MQQueueManager("*QMGR_A", table);
:
・file以外のftpプロトコルなども利用可能
JMS
–コネクション・ファクトリのCCDTURL属性にチャネル定義テーブル・ファイルの位置をURL指定
45
チャネル定義テーブル
チャネル定義の検索
チャネル定義テーブルには、複数のクライアント接続チャネルの定義を含めることが可能
MQCONNに指定したキュー・マネージャー名、クライアント接続チャネルのQMNAME属性から
接続に使用するチャネル定義を決定
クライアント接続チャネルのQMNAMEパラメータ
MQCONNの指定
実際に接続するQMgr
QMNAMEがQMgr名のチャネル定義を検索
QMgr名
・複数のチャネル定義がマッチした場合、チャネル名で優先順位付け
数字 -> 英大文字 -> 英小文字
*QMgr名
*、無指定(ブランク)
QMNAMEがブランクのチャネル定義を検索
指定したQMgrと同一の必
要あり
チェックされない
チェックされない
チャネル定義テーブル
クライアント接続チャネル名
CONNAME
QMNAME
TO.QMGR_A.01
QMGR_A
TO.QMGR_B.01
QMGR_B
TO.QMGR_A.02
QMGR_A
MQCONN(QMGR_B)
*なしのQMgr名で接続しているため、
QMGR_B以外は接続不可
TO.QMGR_A.03
MQCONN(*QMGR_A)
任意の名前のQMgrへ接続可能
接続が成功するまで該当するQMgrに順
番に接続を試みる
MQCONN(*)
MQCONN(‘ ’)
46
任意の名前のQMgrへ接続可能
チャネル定義テーブル
グループ接続
チャネル接続が失敗した際に、次の条件にマッチするチャネル定義を使って自動で接続を試
行させることが可能
チャネル定義テーブルに複数のエントリを事前に定義しておく
接続先の切り替えは、アプリケーションに透過的に行われる
MQクライアント・ライブラリは、内部的にチャネル定義テーブル内のエントリに対して接続を順番に試行
する
条件にマッチする全エントリへの接続が失敗すると、MQCONNがエラー
(MQRC_Q_MGR_NOT_AVAILABLE)
チャネル定義テーブル
クライアント接続チャネル名
CONNAME
QMNAME
TO.QMGR_A.01
GROUP_A
TO.QMGR_B.01
GROUP_B
TO.QMGR_A.02
GROUP_A
TO.QMGR_A.03
アプリケーション
TCP.CONNECT ノードA
MQCONN(*QMGR_A)
1番のエントリで接続
if(接続できない)
2番のエントリで接続
if(接続できない)
接続エラー
TCP.CONNECT
ノードB
OK
MQクライアント・ライブラリ
47
チャネル定義テーブル
クライアント・チャネルの重み付け
クライアント・チャネルに重み付けをし、接続先を分散させることが可能
チャネル定義テーブルでグループ化されているクライアント接続
チャネルが対象
CLNTCONNのAFFINITY属性がNONEの場合、CLNTWGHTに指定された値の割合で接続先を
分散
内部的に作成するチャネル・リストを基にチャネルを選択
プロセス(アプリケーション)内の初回MQCONN時に、チャネル定義テーブルを参照し
チャネル・リストを作成
チャネル・リスト
TO.QMGR_2
TO.QMGR_1
アプリA
MQCONN(
*ANY.QMGR)
チャネル定義テーブル
チャネル名
CLNT
WGHT
チャネル・リスト
QMNAME
TO.QMGR_1
1
ANY.QMGR
TO.QMGR_2
2
ANY.QMGR
1本
が接続(※)
キュー・マネージャー
QMGR_1
TO.QMGR_2
TO.QMGR_1
アプリB
MQCONN(
*ANY.QMGR)
チャネル・リスト
TO.QMGR_1 :
TO.QMGR_2
= 1 : 2 で接続
TO.QMGR_1
リストの上位
から接続を試行
48
TO.QMGR_2
アプリC
MQCONN(
*ANY.QMGR)
キュー・マネージャー
QMGR_2
2本
が接続(※)
※上記は AFFINITY(NONE) の場合で、
おおよそ 1:2 の割合で接続先が選択される
(幕張でのテスト結果)
プログラム内に記述
C、C++、・・・(Java以外)
MQCD構造体でクライアント接続チャネルをプログラム内に定義
MQCONNXでキュー・マネージャーに接続
MQCONNX(QMgrName、&ConnectOpts、&hConn、&cc、&rc)
接続オプション(MQCNO)
StructId
Version
Options
ClientConnOffset
ClientConnPtr
・ClientConnOffset、または、ClientConnPtrのいずれかでMQCD構造体のアドレスをポイント
ClientConnOffset : MQCNO構造体の先頭からのオフセットを設定
ClientConnPtr
: MQCD構造体のアドレスを設定
49
プログラム内に記述
Java
MQ base Java
MQEnvironmentクラスに接続先情報を設定
MQEnvironment.channel
= “xxxxxxxxx”;
MQEnvironment.hostname = “111.111.111.111”;
MQEnvironment.port
= 1111;
MQQueueManager qmgr = new MQueueManager(“*”);
:
JMS
コネクション・ファクトリのTRANSPORT属性をCLIENTに設定
CHANNEL、HOSTNAME、PORT属性に接続先情報を設定
50
チャネル定義(MQCD)
ChannelName
Version
ChannelType
TransportType
:
ConnectionName
:
<参考> プログラム内に記述
MQ base Java利用時の考慮点
MQEnvironmentはstaticクラス
複数スレッドが異なるキュー・マネージャーへの接続/切断を繰り返すと、
接続先情報が中途半端に書き換えられた状態で接続にいく可能性がある
・channel
ノードB(スレッド2によって書き換えられた)
・hostname ノードA
・port
ノードA
ノードA
スレッド1
スレッド2
ノードB
下記の方法で接続
java.util.Hashtable properties = new Hashtable();
properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
properties.put(MQC.CHANNEL_PROPERTY, “xxxxxxxxx”);
properties.put(MQC.HOST_NAME_PROPERTY, "111.111.111.111");
properties.put(MQC.PORT_PROPERTY, new Integer(1111));
MQQueueManager qmgr = new MQueueManager(“QMGR01”, properties);
:
51
チャネル数の制御
SVRCONNチャネル毎にクライアントからのインスタンス数を制限可能
キュー・マネージャーが存在するマシンのリソースを制御
単一クライアントが接続を独占することを防止
プログラムの不具合
DoS(Denail
of Service)攻撃
計画外MQクライアント・アプリケーションの接続
SVRCONNチャネルのMAXINST、MAXINSTC属性により動作を制御
MAXINST・・・最大チャネル・インスタンス数
MAXINSTC・・・クライアントあたりの最大チャネル・インスタンス数
IPアドレス単位でクライアントを認識
QMGRB
クライアント1
クライアント1
MQCONN(QMGRA)
①
クライアント2
MQCONN(QMGRA)
②
クライアント3
MQCONN(QMGRA)
③
クライアントX
MQCONN(QMGRA)
QMGRA
【チャネル定義】
名称:TO.QMGRA
タイプ:SVRCONN
最大インスタンス数:3
(MAXINST)
アプリA
MQCONN(QMGRB)
①
アプリB
MQCONN(QMGRB)
②
アプリC
MQCONN(QMGRB)
③
クライアント2
アプリA
MQCONN(QMGRB)
④
52
■
□
【チャネル定義】
名称:TO.QMGRB
タイプ:SVRCONN
最大インスタンス数:6
(MAXINST)
クライアント毎
最大インスタンス数:2
(MAXINSTC)
④
アプリB
MQCONN(QMGRB)
⑤
アプリC
MQCONN(QMGRB)
⑥
■
□:MAXINSTの
カウント対象
■:MAXINSTCの
カウント対象
非同期メッセージ送信
キュー・マネージャーからの応答を待つことなく、非同期にメッセージをキューに書き込む機能
MQPUTの応答時間が短縮
キューにメッセージが書き込まれた事をそのつど確認する必要のないアプリケーションのパフォーマンス
が向上
MQクライアント・アプリ
MQクライアント・
ライブラリ
サーバー接続チャネル
MQPUT
応答コードMQCC_OKは、メッセージがキュー・マネージャに
書き込まれる前に返される
(非同期処理)
キュー・マネージャー
MQPUT
MQCC_OK
MQPUT
MQCC_OK
MQCC_OK
MQPUT
非同期メッセージ送信の処理状況を取得
(MQSTATコール)
MQCC_OK
PUT状況
確認
非同期メッセージ送信を有効にするにはキューやアプリケーションでの設定が必要
キューのDEFPRESP属性で設定
アプリケーションで指定
MQI、BaseJavaアプリケーションはMQPMOで設定
–優先順位:MQPMOの設定 > キューのDEFPRESP属性の設定
JMSでの設定
–宛先オブジェクトにPUTASYCALLOWED(YES)を設定、かつ、キュー属性DEFPRESP(ASYNC)を設定
53
非同期メッセージ送信
非同期のMQPUTでは、即座に応答コード(正常終了)が返る
メッセージがキューに正常に書き込まれたかどうかは判別できない
キューにメッセージが書き込まれたかを確認するには、MQSTATコールを用いてキュー・マネー
ジャーから応答コードを取得することが必要
MQクライアント・
ライブラリ
MQクライアント・アプリ
キュー・マネージャーに処理状況を
問い合わせる
MQPUT
・・・
実際にMQPUTが成功したかどうかは
分からない
サーバー接続チャネル
キュー・マネージャー
MQCC_OK
MQPUT
MQCC_OK
MQSTAT
54
非同期メッセージ送信の制限事項
ノン・パーシステントメッセージと同期点付きのパーシステントメッセージのみ、
非同期的にメッセージが送信される
同期点なしのパーシステント・メッセージを送信する場合、メッセージは同期的に送信される
MQPUT(SYNCPOINT)
MQPUT(NO_SYNCPOINT)
パーシステント
非同期PUT可
同期(非同期PUT不可)
ノン・パーシステント
非同期PUT可
非同期PUT可
MQPUT(SYNCPOINT)、MQPUT(NO_SYNCPOINT)を混ぜて発行することが可能
LOGICAL_ORDERを用いてのグループ・メッセージの非同期メッセージ送信は不可
自動的に同期通信に切り替わる
MQクライアント側でGroupID、MsgSeqNumberを設定すれば非同期送信が可能
55
メッセージ先読み
一度のMQGETで複数のメッセージをキュー・マネージャーから先読みする機能
ノン・パーシステントメッセージがメッセージ先読みの対象
大量のノン・パーシステントメッセージを読み込む際のパフォーマンスが向上
MQクライアント・
ライブラリ
MQクライアント・アプリ
サーバー接続チャネル
キュー・マネージャー
MQGET
MQGET
バッファ
(メモリ)
メモリ)
MQGETを呼び出すと、続くメッセージを先
読みする
MQGET
MQGET
メッセージは一度メモリに格納され、
MQGETはメモリからメッセージを読み込
む
メッセージ先読み有効にするにはキューやアプリケーションでの設定が必要
キューのDEFREADA属性で設定
アプリケーションの指定
MQI、BaseJavaアプリケーションはMQOO
(MQ Open Option)で設定
–優先順位:MQOOの設定 > キューのDEFREADA属性の設定
JMSでの設定
–宛先オブジェクトにREADAHEADALLOWED(YES)を設定
56
メッセージ先読み
先読みするメッセージの量や頻度の調整が可能
mqclient.iniファイルのMessageBufferスタンザで値を設定
Maximumsize
(K bytes)
–メッセージを読み込むバッファサイズを指定。メッセージはMaximumサイズ分先読みされる
UpdatePercentage
(%)
–バッファに入っているメッセージが残り何%になったら再び先読みを行うかを指定
PurgeTime(
seconds)
–バッファに入っているメッセージを何秒で削除するか
57
メッセージ先読みの制限事項
ノン・パーシステントメッセージのみメッセージ先読みが可能
パーシステント・メッセージの場合、メッセージ先読み機能は自動的にOFFになる
同期点つきのMQGETは不可
メッセージ先読み開始前、MQGMO_SYNCPOINTを指定した場合
メッセージ先読み機能は自動的にOFFになる
メッセージ先読み開始後、MQGMO_SYNCPOINTを指定した場合
MQRC_OPTIONS_ERRORが返る
MQGET(SYNCPOINT)
MQGET(NO_SYNCPOINT)
パーシステント
不可
不可
ノン・パーシステント
不可
可
MQクライアントで接続のみメッセージ先読みが可能
ローカル接続の場合、メッセージ先読み機能は自動的にOFFになる
58
MQクラスター
59
MQクラスターとは
MQクラスターとは
論理的に関連付けられたキュー・マネージャーの集合
特徴
MQクラスターでは、キュー定義をMQクラスター内キュー・マネージャーに公開することが可能
公開されたクラスター・キューへは、リモート定義なしにメッセージ送信が可能
公開された情報は一元管理され、クラスター・キューへのメッセージ送信に必要なオブジェクトは自動定義
される
送信側アプリケーションは、宛先キューがどのキュー・マネージャーにあるのか意識する必要がない
MQクラスター内では、キュー・マネージャー間のメッセージ・チャネルは自動作成される
システムを停止させずにキュー・マネージャーやキューをクラスター環境に追加できる
QM1
ラウンド・ロビン
HA製品などと組み合わせることも可能
QM4
クラスター構成例
Q1
QM2
より高い可用性を実現
QM2
Q1
HA構成
QM3
送信側は、宛先キュー名
を意識するだけでよい
60
MQCONN QM4
MQOPEN Q1
MQPUT
Q1
Q1
MQクラスターの利点
負荷分散
ワークロード管理アルゴリズムによって、同じ名前のキュー間でのメッセージ割り振りが可能
高可用性の実現
キュー・マネージャーが障害を受けると宛先候補から外され、残りの正常なキュー間で処理
キュー・マネージャーが使用可能な状態に戻ると、自動的に宛先対象となる
システム管理作業の軽減
メッセージ送信に必要となるオブジェクトは自動定義される
構成の変更がより早く、簡単になり、定義ミスも削減
クラスター情報は一元管理される
61
負荷分散
WLM(ワークロード・マネージャー)によるメッセージの振り分けが可能
複数キュー・マネージャー上の同一名称のクラスター・キューへ宛先振り分け(ラウンド・ロビン)
が可能
メッセージの最終宛先キュー・マネージャーは、WLM
により決定
振分方法は2つあり、送信アプリケーションのMQOPEN時のBINDオプションにて指定
MQPUT単位(メッセージ単位)で振分
MQOPEN単位で複数メッセージを同一キューに振分
単純なラウンド・ロビンに加え、重み付けや優先順位を考慮した振り分けが可能(後述)
送信アプリケーション
MQCONN QM1
MQOPEN Q1
MQPUT
受信アプリケーション
QM2
WLMによる振り分け
Q1
MQCONN QM2
MQOPEN Q1
MQGET
クラスター・キュー
Q1に送信
QM1
QM3
Q1
MQCONN QM3
MQOPEN Q1
MQGET
クラスター・キュー
QM4
Q1
クラスター・キュー
62
MQCONN QM4
MQOPEN Q1
MQGET
可用性向上
宛先キュー・マネージャーの障害発生時には、残りの正常稼働キュー・マネージャーで
メッセージを振り分け
キュー・マネージャーの障害を検知後、宛先対象から外れる
障害が復旧すれば、自動的にラウンド・ロビン対象に復帰
システム停止なしで、キュー・マネージャーやキューなどのリソースをクラスターに追加可能
キュー・マネージャーの障害発生時は宛先か
ら外れる
QM2
MQCONN QM1
MQOPEN Q1
MQPUT
QM1
QM3
QM4
それ以外の条件でも宛先から外される
・キューのPUT(DISALBED)
・キュー・マネージャーのSUSPEND
・キュー・マネージャー・ダウン
・H/W、サーバー障害
・ネットワーク障害
・チャネル障害
Q1
Q1
Q1
新規追加する
クラスター・キュー
WLMによる振り分け
QM5
Q1
キュー・マネージャーの再起動などは不
要、MQクラスター内キュー・マネージャー
の処理を継続したまま新規定義を追加
可能
63
システム管理の軽減
メッセージ送信に必要なオブジェクトを自動定義
クラスター内のオブジェクト定義情報はフル・リポジトリを保持する・キュー・マネージャーが一元
管理
メッセージ送信に必要な情報は、リポジトリから取得
DQM構成で必要となるリモート・キュー、トランスミッション・キュー、宛先キュー・マネージャーに対する
チャネルなどの定義が不要
構成の定義 / 変更がより早く、簡単になり、定義ミスも削減
CLUS
QM1
QM4
フル・
フル・
リポジトリ
Q1
QM2
リモート・キューなどの定義がなくても、
リポジトリからQ1の情報を受け取れ
るので、メッセージング可能
リポジトリには、QM1、
QM2、QM4 のキューQ1
の情報などが含まれて
いる
Q1
QM3
64
フル・
フル・
リポジトリ
Q1
Q1
※用語に関しては後述
MQクラスターの構成要素
MQクラスター構成例
パーシャル・リポジトリ
クラスター:CLUS_A
クラスターキュー
フル・リポジトリ
QM3
QM1
クラスター・
トランスミッション・
キュー
Q1
Q1
パーシャル・
リポジトリ
クラスター・
トランスミッション・
キュー
フル・
リポジトリ
QM2
Q1
クラスター・
トランスミッション・
キュー
明示定義クラスター
受信チャネル
QM4
Q1
フル・
リポジトリ
Q1
パーシャル・
リポジトリ
クラスター・
トランスミッション・
キュー
明示定義クラスター
送信チャネル
65
リポジトリ
リポジトリ
クラスターに参加するキュー・マネージャーは必ず1つ保持
MQクラスター内のキュー・マネージャー、キューに関する情報を保管
実体はキュー、情報はパーシステント・メッセージ
– SYSTEM.CLUSTER.REPOSITORY.QUEUE (システム・デフォルト・オブジェクト)
フル・リポジトリとパーシャル・リポジトリがある
フル・リポジトリ
MQクラスター内の全ての情報を保持するリポジトリ
可用性のもっとも高いシステムにフル・リポジトリを配置
(z/OS上など)
フル・リポジトリを持つキュー・マネージャーをリポジトリ・キュー・マネージャーという
通常クラスター内に2つ構成する
パーシャル・リポジトリ
キュー・マネージャーが使用する情報のみを保持するリポジトリ
必要な情報は、フル・リポジトリ経由で受信
リポジトリ・キュー・マネージャー以外のキューマネージャーに存在
Q1へメッセージを送る
ために必要な情報を
受信
MQOPEN
Q1
全クラスター情報を
保持
MQクラスター
QM1
QM2
フル・
リポジトリ
Q1の
定義情報
パーシャル・
リポジトリ
QM3
QM4
Q1
パーシャル・
フル・
リポジトリ
リポジトリ
66
クラスター・キュー
クラスター内で、キュー名だけでアクセス可能なキュー
キュー属性CLUSTERにクラスター名を指定したキュー
メッセージ送信に、リモート・キュー定義などが不要
ローカル・キュー、エイリアス・キュー、リモート・キューをクラスター・キュー化可能
送信アプリケーションはキューの存在する宛先キュー・マネージャー名を知らなくてもよい
MQOPEN時にクラスター・キュー名を指定するだけ
複数キュー・マネージャー上に同一名のクラスター・キューを定義可能
WLMによる振り分けが可能
CLUSTER1
QM1
WLMによる振り分け
QMa
リモート定義なし
でのアクセス
CLQA
クラスター・
クラスター・
キュー
DEFINE QL(CLQA) CLUSTER(CLUSTER1)
MQOPEN CLQA
MQPUT
QM2
CLQA
クラスター・
クラスター・
キュー
DEFINE QL(CLQA) CLUSTER(CLUSTER1)
67
クラスター・トランスミッション・キュー
リモートにあるクラスター・キューへのメッセージ送信の際に使用される伝送キュー
キュー・マネージャーにつき1つ定義される
SYSTEM.CLUSTER.TRANSMIT.QUEUE(システム・デフォルト・オブジェクト)
全てのクラスター送信チャネルで共有
CLUSTER1
QM2
QM1
QC.QM2
MQPUT QC.QM2
MQPUT QC.QM3
クラスター・キュー
SYSTEM.CLUSTER.
TRANSMIT.QUEUE
QM3
クラスター・キュー
QC.QM3
68
クラスター・チャネル
クラスターに参加しているキュー・マネージャー間で、クラスター情報やユーザー・データを
やりとりするために使われるチャネル定義
各々のキュー・マネージャーでは、クラスター受信チャネル(CLUSRCVR)と
クラスター送信チャネル(CLUSSDR)を1つずつ明示的に定義
クラスター送信チャネルはいずれか一方のフル・リポジトリ・キュー・マネージャーに向けて作成
クラスター受信チャネルは、CONNAMEに自身へ接続するための情報を設定してMQクラスターに公
開
クラスター内のキュー・マネージャーは、該当キュー・マネージャーへの接続が必要になると
クラスター受信チャネルの情報を入手し、クラスター送信チャネルを自動定義して接続
69
クラスター・チャネル
クラスター・チャネルは、明示的に定義するものと、自動定義されるものがある
クラスター送信チャネル
(CLUSSDR)
クラスター受信チャネル
(CLUSRCVR)
明示定義するチャネル
複数あるリポジトリ・キュー・マネージャーのうち、1つに対して1
本定義
Inbound用を1本定義
定義例
DEFINE CHL(TO.QM2) CHLTYPE(CLUSSDR)
CONNAME(‘192.168.0.2(1414)’) CLUSTER(CLUS1)
DEFINE CHL(TO.QM1) CHLTYPE(CLUSRCVR)
CONNAME(‘192.168.0.1(1414)’) CLUSTER(CLUS1)
自動定義されるチャネル
その他キュー・マネージャーに対して CLUSRCVR の情報を元
に、定義
クラスター内キュー・マネージャーからの接続要求に応じてクラス
ター受信チャネル定義と同名のインスタンスが起動
- 同名のチャネル・インスタンスが複数起動することになる
備考
クラスター情報を送信するために、リポジトリ・キュー・マネー
ジャーに対しては明示定義し、その他は自動定義
CLUSRCVR の情報がクラスター内に公開され、他キュー・マ
ネージャーは、その情報を元に、CLUSSDR を自動定義可能
192.168.0.1
192.168.0.2
QM1
QM2
Q1
フル・
リポジトリ
CLUS
SDR
CLUS
SDR
CLUS
SDR
CLUS
CLUS
RCVR
RCVR
CLUS
CLUS
RCVR
RCVR
CLUS
SDR
Q1
フル・
リポジトリ
CLUS
SDR
CLUS
SDR
CLUS
CLUS
RCVR
RCVR
※動的に作成された送信チャネルはDISPLAY CHANNEL
コマンドでは見えないので注意
DISPLAY CLUSQMGRで確認する
ステータスは参照可能(DISPLAY CHSTATUS)
START、STOPは可能
192.168.0.3
QM3
明示定義
チャネル
自動定義
チャネル
70
MQクラスター関連コマンド
クラスター構成情報を確認するコマンド
DISPLAY CLUSQMGR
クラスター内のキュー・マネージャー情報を出力
DISPLAY QCLUSTER
クラスター内のキュー情報を出力
クラスター構成情報を管理するコマンド
通常はクラスター環境に問題が発生したり、リポジトリ情報に不整合が発生した場合に使用
通常のオペレーションでは使用しない
REFRESH CLUSTER
保持しているクラスター情報の削除、およびフル・リポジトリに対して自身の情報の再送信
RESET CLUSTER
特定キュー・マネージャーのクラスター情報の削除、および、他のキュー・マネージャーへの使用不可通知
フル・リポジトリ・キュー・マネージャーでのみ実行可能
クラスター・キュー・マネージャーを一時停止 / 再開するコマンド
SUSPEND QMGR
キュー・マネージャーをクラスター内で一時停止状態にする
RESUME QMGR
一時停止状態から復旧する
71
クラスター・キューへの送信方法
クラスター環境での、キューへの基本的な送信方法は3通り
1.
2.
3.
宛先の選択はQMGRにまかせ、各メッセージ(MQPUT)毎にメッセージを振り分け(①)
宛先の選択はQMGRにまかせ、MQOPEN単位でメッセージを振り分け(②)
特定のQMGRのクラスター・キューにメッセージを送信する(③)
① MQOPEN
MQOO_BIND_NOT_FIXED
MQOD.ObjectName=Q1
MQPUT(1)
MQPUT(2)
② MQOPEN
MQOO_BIND_ON_OPEN
MQOD.ObjectName=Q1
MQPUT(1)
MQPUT(2)
MQCLOSE
MQOPEN
MQOO_BIND_ON_OPEN
MQPUT(3)
MQPUT(4)
③ MQOPEN
MQOD.ObjectQMgrName=QM3
QM3
MQOD.ObjectName=Q1
MQPUT(1)
MQPUT(2)
WLM
による振分
QM1
QM2
Q1
WLMにより
宛先決定
QM3
Q1
宛先明示
指定
72
方法
MQOD
ObjectQMgrName
MQPMO
BINDオプション
①
ブランク
NOTFIXED
②
ブランク
OPEN
③
指定(QM3)
-
送信方法の指定
負荷分散の方法はアプリケーション内で指定
方法①、方法② ラウンド・ロビン
MQOPEN
- MQOO_BIND_*オプション で指定
オープン・オプション
選択されるキュー
MQOO_BIND_ON_OPEN
オープン時に宛先が決定され、同一オブジェクト・ハンドルを使用しPUTされた後続のメッセージ
はすべて同一キューにPUTされる
MQOO_BIND_NOT_FIXED
MQPUT時にWLMによって動的に宛先が決定され、別のクラスター・キューに割り振られる
MQOO_BIND_AS_Q_DEF
(デフォルト)
キューの属性DEFBIND(OPEN|NOTFIXED)に従う
方法③ 特定キュー・マネージャーへ送信
MQOD
-ObjectQMgrName で指定
– 特定キュー・マネージャー上のクラスター・キューに送信する場合に指定
– ラウンドロビン対象にする場合はブランク
補足:MQOO_BIND_ON_OPEN 指定でQMGRによって選択された宛先が返されるMQODのフィールド
MQOO_BIND_ON_OPEN指定時は、ResolvedQMgrNameに宛先Qmgr名がセットされる
MQOO_BIND_NOT_FIXED指定時は、ResolvedQMgrName はブランクが返される
-->最終宛先は、MQPUT時に動的に決定されるが、アプリケーションからは宛先の検知は不可能
フィールド名
入力
出力
(MQBYTE40)
○
×
Windows NT SID用
ResolvedQName
(MQCHAR48)
×
○
最終宛先キュー名
ResolvedQMgrName
(MQCHAR48)
×
○
最終宛先キュー・マネージャー名
AlternateSecurityId
説明
73
MQODの指定と宛先の決定
MQODに指定するMQOD.ObjectName クラスター・キュー名を指定
MQOD.ObjectQMgrName ブランク、または宛先キュー・マネージャーを指定
ブランクの場合
MQOO_BIND_ON_OPENを指定すると、MQOPEN時に宛先キュー・マネージャーが決定される
MQOO_BIND_NOT_FIXEDを指定すると、WLMによる振り分けが行われる
MQODのObjectQMgrNameに明示的にキュー・マネージャー名をセットした場合
クラスター・キュー・マネージャーであれば、すべてクラスター・トランスミッション・キューに入れられる
=> ノン・クラスター・キューでもクラスター・チャネル経由でメッセージが送られる
入力されたMQOD
実際に設定される名前
ObjectQMgrName
ObjectName
ObjectQMgrName
ObjectName
転送キュー名
ブランク
ローカル・キュー
(クラスター属性)
WLMが設定したCLQMGR名
or
MQPUT時に設定されるCLQMGR名
入力されたキュー名
SYSTEM.CLUSTER.
TRANSMIT.QUEUE
ローカル・キュー・マ
ネージャー
ローカル・キュー
(クラスター属性)
ローカル・キュー・マネージャー
入力されたキュー名
-
ブランク
ローカルにない
クラスター・キュー
WLMが設定したCLQMGR名
or
MQPUT時に設定されるCLQMGR名
入力されたキュー名
SYSTEM.CLUSTER.
TRANSMIT.QUEUE
ローカルになく、
クラスター・QMまたは
クラスターQMALIAS
Not Resolved
ObjectQMgrName
or
MQPUT時に設定されるCLQMGR名
入力されたキュー名
SYSTEM.CLUSTER.
TRANSMIT.QUEUE
74
ワークロード・バランシングの制御
ラウンド・ロビンによる負荷分散(デフォルト)
ローカルのキュー・マネージャーがキューを保持していればローカルのキューにPUT
ローカルに存在しない場合、チャネルのステータス、キュー・マネージャー、キューのステータスを
もとに宛先を決定
宛先候補が複数ある場合はラウンド・ロビンで決定
送信アプリケーション
受信アプリケーション
QM2
MQCONN QM1
MQOPEN Q1
MQPUT
Q1
MQCONN QM2
MQOPEN Q1
MQGET
Q1
MQCONN QM2
MQOPEN Q1
MQGET
Q1に送信
QM1
QM3
WLM
によるラウン
ドロビン
QM4
MQCONN QM2
MQOPEN Q1
MQGET
Q1
75
リモート・クラスター・キューを含めたラウンド・ロビン
リモートにあるクラスター・キューも宛先として参加
クラスター内に定義してある同名のキューを対称にラウンド・ロビン
デフォルトでは、接続するキュー・マネージャーに宛先クラスター・キューがあると、メッセージはすべてその
キューに PUT
キュー、またはキュー・マネージャーのCLWLANYQ属性で設定
デフォルト
リモート・クラスター・キューを含める
CLUS1
MQCONN(QM1)
MQOPEN(CLQ)
MQPUT
MQPUT
MQPUT
CLQ
CLQ
CLUS1
CLQ
CLQ
MQCONN(QM1)
MQOPEN(CLQ)
MQPUT
MQPUT
MQPUT
CLQ
76
CLUS.XMITQ
CLQ
優先順位
キューやチャネルに付与された優先順位に従ってワークロード・バランシング
一番高いプライオリティーに設定されているチャネルやキューが使用される
メッセージ送信時に、チャネルやキューのステータスを確認する
一番プライオリティーの高いものが使用不可になると、次点プライオリティーのキューやチャネルを使用
–復旧すると、再び振り分けの対象となる
優先順位は、チャネルの値が判断され、次に
キュー の値が判断される
チャネル、またはキューのCLWLPRTY属性で設定
チャネルの優先度
を先に参照
障害時
正常時
QM2
QM2
CLQ
優先度 1
MQCONN(QM1)
MQOPEN(CLQ)
MQPUT
MQPUT
MQPUT
MQCONN(QM1)
MQOPEN(CLQ)
MQPUT
MQPUT
MQPUT
TO.QM2
優先度 2
QM1
QM1
QM3
QM3
CLQ
優先度 2
CLQ
優先度 2
TO.QM3
優先度 1
CLQ
優先度 1
TO.QM2
優先度 2
TO.QM3
優先度 1
77
重み付け
チャネルに設定された重み付けに応じてワークロード・バランシング
チャネルがどのくらいの比重で使用されたかを判断し、送信先を決定
以下の例では、50:25:10
の割合で振分
チャネルのCLWLWGHT属性で設定
QM1
TO.QM1
重み 50
QM2
QM0
TO.QM2
重み 25
MQCONN(QM0)
MQOPEN(CLQ)
MQPUT
・・・・
TO.QM3
重み 10
QM3
補足
メッセージが送信されれば、その内容に関わりなく、チャネルは使用されたとみなされます。
たとえばクラスター内部情報を送受信するためにチャネルが使用されても、チャネルが使用されたと判断されます。したがって、
上記の例では重み付けが50、25、10と定義されていますが、必ずしもユーザー・メッセージが50:25:10で振り分けられるとは限
りません。
78
ランク
キューやチャネルにランクの設定が可能
MQクラスターを跨ってReqest / Reply型のメッセージを行うような環境で使用
常に一番高いランクに設定されているキューやチャネルにメッセージを振分
一番ランクの高いものがすべて使用不可になっても、それよりも低いランクのものは使用されない
ランクを高く設定することで、クラスター内のルートを固定することが可能
ランクは、まずチャネルの値が判断され、次に
キュー の値が判断される
チャネルやキューのCLWLRANK属性で設定
メッセージの経路
RANKが同じの場合のREPLYメッセージの経路
ここでのラウンド・ロビンを防ぐた
め、QMG1⇔QMG2間のランク
を下げ、経路を塞ぐ
CLUS1
QMG1
CLUS2
QM1
(Qmgr Alias)
応答アプリ
mqod.ObjectNam
e=REPQ
mqod.ObjectQMg
rName=QM1
MQOPEN
QM2
QM1
QMG2
REPQ
CLUS.XMIT
Q
DEFINE QL(REPQ) CLUSTER()
QM1
(Qmgr Alias)
DEFINE QR(QM1) RNAME()
RQMNAME(QM1) CLUSTER(CLUS2)
79
ネットワークの優先順位
ネットワークの二重化
ルーター障害などに備えて N/W を二重化
考慮点
デフォルトでは定義されたチャネル間でラウンド・ロビン
特定のネットワークを使用させる場合は、チャネルのNETPRTY属性を使用
同一宛先で NETPRTY の高いものが障害を受けると次の NETPRTY のを使用
NETPRTYの高いチャネ
ルを使用
CLUS_A
TO.QMGR1_A (NETPRYT=9)
QMGRA
TO.QMGR1_B (NETPRTY=0)
QMGR1
フル・リポジトリ
NETPRTYの高いチャネル
が障害を受けると生きて
いるチャネルを代替使用
error!
TO.QMGR2_A (NETPRTY=0)
ネットワークA
QMGR2
フル・リポジトリ
TO.QMGR2_B (NETPRTY=9)
ネットワークB
80
※ CLWLPRTY との違い
CLWLPRTYは、宛先に関係なく最大
値を持つチャネルのみが使用される
MQクラスター構成での考慮点
宛先キューが複数ある場合、メッセージは複数キュー・マネージャーにラウンド・ロビンさ
れるので、メッセージの順序性は保証されない
MQOPEN単位であれば、複数メッセージを同一宛先に送ることは可能
MQOPEN単位での追い越しは発生する
関連性のあるメッセージを同一宛先に送ったり、順序性を保証する必要がある場合は考慮
が必要
QM2
MQPUT単位でのラウンド・ロビンの例
CLQ
QM1
MQOPEN Q1
MQPUT(1)
MQPUT(2)
MQPUT(3)
ラウンド・ロビンされるので、
処理順序は保証されない
CLQ
QM3
受信側アプリケーションから参照可能なのは、接続先キュー・マネージャーがローカルに
保持するキューのみ
クラスター・キューは、共用キューとは異なる
QM2
CLQ
QM1
CLQ
QM3
81
<参考> MQクラスター環境の構築
新たなクラスター環境の作成
作成する環境
CLUS_A を構成
フル・リポジトリを持つキュー・マネージャーはQM1、QM2とする
QM1とQM2で新たなクラスター環境
CLUS_A
192.168.0.1
QM1
フル・
フル・
リポジトリ
TO.QM2
QM2
TO.QM1
フル・
フル・
リポジトリ
Q1
192.168.0.2
82
MQCONN QM2
MQOPEN CLQ
MQGET
アクセスするには
別途接続が必要
<参考> MQクラスター環境の構築
作成手順 (前提:キュー・マネージャーは作成済み)
キュー・マネージャーをフル・リポジトリに変更
ALTER QMGR REPOS(CLUS_NAME)
CLUS_NAME
クラスター名
CHL_NAME
CLUS_NAME
CONNAME
チャネル名
クラスター名
自分のIPアドレスやホスト名(※)
クラスター受信チャネルの定義
DEFINE CHL(CHL_NAME) CHLTYPE(CLUSRCVR)
CLUSTER(CLUS_NAME) CONNAME(HOST_NAME)
※クラスター受信チャネルは、RECEIVERチャネルなどのin-boundチャネルとは異なり、自身のCONNAMEを定
義する。この定義情報を元に、リモートのキュー・マネージャーはクラスター送信チャネルを自動定義する。
クラスター送信チャネルの定義
DEFINE CHL(CHL_NAME) CHLTYPE(CLUSSDR)
CLUSTER(CLUS_NAME) CONNAME(HOST_NAME)
CHL_NAME
CLUS_NAME
CONNAME
チャネル名
クラスター名
自分のIPアドレスやホスト名
83
<参考> MQクラスター環境の構築
クラスター構成手順
作業内容
作業場所
1. フル・リポジトリに変更
ALTER QMGR REPOS(CLUS_A)
QM1、QM2
2. クラスター受信チャネルの作成
DEFINE CHL(TO.QM1) CHLTYPE(CLUSRCVR)
CLUSTER(CLUS_A) CONNAME(‘192.168.0.1(1414)’)
QM1
3. クラスター受信チャネルの作成
DEFINE CHL(TO.QM2) CHLTYPE(CLUSRCVR)
CLUSTER(CLUS_A) CONNAME(‘192.168.0.2(1414)’)
QM2
4. クラスター送信チャネルの作成
DEFINE CHL(TO.QM2) CHLTYPE(CLUSSDR)
CLUSTER(CLUS_A) CONNAME(‘192.168.0.2(1414)’)
QM1
5. クラスター送信チャネルの作成
DEFINE CHL(TO.QM1) CHLTYPE(CLUSSDR)
CLUSTER(CLUS_A) CONNAME(‘192.168.0.1(1414)’)
QM2
クラスター送信チャネルから定義すると警告メッセージが出力されるため、クラスター受信チャネルから定
義することを推奨
「AMQ9419:クラスター受信チャネルがありません。」
チャネル(TO.QM1、TO.QM2)は自動起動される
チャネルが接続されるとクラスターに参加し、クラスター・キューを使用可能
84
<参考> MQクラスター環境の構築
両方のキュー・マネージャーで、クラスター構成ができたことを確認
以下は、QM1上での確認例
MQクラスター(CLUS_A)に属しているキュー・マネージャーの情報の表示
DISPLAY CLUSQMGR(*)
AMQ8441: クラスター・キュー・マネージャーの詳細を表示します。
CLUSQMGR(QM1)
CHANNEL(TO.QM1)
CLUSTER(CLUS_A)
AMQ8441: クラスター・キュー・マネージャーの詳細を表示します。
CLUSQMGR(QM2)
CHANNEL(TO.QM2)
CLUSTER(CLUS_A)
チャネル状況の稼動状況の確認
DISPLAY CHSTATUS(*)
AMQ8417: チャネル状況の内容を表示します。
CHANNEL(TO.QM2)
CHLTYPE(CLUSSDR)
CONNAME(192.168.0.2 (1414))
CURRENT
RQMNAME(QM2)
STATUS(RUNNING)
SUBSTATE(MQGET)
XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
AMQ8417: チャネル状況の内容を表示します。
CHANNEL(TO.QM1)
CHLTYPE(CLUSRCVR)
CONNAME(192.168.0.1)
CURRENT
RQMNAME(QM1)
STATUS(RUNNING)
SUBSTATE(RECEIVE)
XMITQ( )
85
<参考> MQクラスター環境の構築
パーシャル・リポジトリを持つキュー・マネージャーをクラスターに追加
追加する定義
QM3
をクラスター CLUS_A に追加
クラスター・キューをキュー・マネージャー QM3 上に追加
追加する定義
CLQ1をクラスター・キューとして、CLUS_A
に公開
CLUS_A
定義する
クラスター
送信チャネル
192.168.0.1
QM1
フル・
フル・
リポジトリ
192.168.0.3
QM3
QM2
CLQ1
フル・
フル・
リポジトリ
Q1
192.168.0.2
追加する
クラスター
キュー
定義する
クラスター
受信チャネル
86
<参考> MQクラスター環境の構築
パーシャル・リポジトリを持つキュー・マネージャーの追加手順
明示的に接続するリポジトリ・キュー・マネージャーの決定
明示的に接続するキュー・マネージャーは1つでよい
ここではQM1とする
クラスター受信チャネルの定義 → 83ページ参照
クラスター送信チャネルの定義 → 83ページ参照
両チャネルを定義した時点でチャネルが自動起動
チャネルが接続されると自分の情報を送信し、フル・リポジトリからクラスター情報を受信
クラスター・キューの定義
DEFINE QL(QUEUE_NAME) CLUSTER(CLUS_NAME)
QUEUE_NAME
CLUS_NAME
キュー名
クラスター名
実際の追加作業
クラスター受信 / 送信チャネルの定義 (QM3上で定義)
1. クラスター受信チャネルの作成
DEFINE CHL(TO.QM3) CHLTYPE(CLUSRCVR) CLUSTER(CLUS_A) CONNAME(‘192.168.0.3(1414)’)
2. クラスター送信チャネルの作成
DEFINE CHL(TO.QM1) CHLTYPE(CLUSSDR) CLUSTER(CLUS_A) CONNAME(‘192.168.0.1(1414)’)
クラスター・キュー CLQ1 の追加 (QM3上で定義)
1. クラスター・キューの作成
DEFINE QL(CLQ1) CLUSTER(CLUS_A)
87
<参考> MQクラスター環境の構築
キュー・マネージャーがクラスターに追加されたかを確認
85ページ参照
クラスター・キューが追加されたかを確認
リポジトリ・キュー・マネージャー QM1、QM2 上で確認
リポジトリ・キュー・マネージャー上では、クラスター・キュー定義が見える
DISPLAY QCLUSTER(*) CLUSQMGR PUT
AMQ8409: キューの内容を表示します。
QUEUE(CLQ)
TYPE(QCLUSTER)
CLUSQMGR(QM3)
PUT(ENABLED)
88
Fly UP