WebSphere MQ + CLUSTERPRO - 検証報告書 - 2003 年 11 月 21 日版 ターボリナックス株式会社
目次 目次 1. 概要...3 2. 対象システム...4 2.1. ハードウェア構成...4 2.2. ソフトウェア構成...6 3. インストール...7 3.1. OS...7 3.2. FAStT デバイスドライバ (qla2300.o)...8 3.3. Turbolinux 8 CLUSTERPRO SE...9 3.4. WebSphere MQ...9 3.4.1. MQ インストール事前準備...9 3.4.2. MQ のインストール...14 4. ソフトウェアの設定...15 4.1. 準備...15 4.2. WebSphere MQ...15 4.2.1. キュー マネージャーの構成...15 4.3. Turbolinux 8 CLUSTERPRO SE...16 4.3.1. クラスタの設定...16 4.3.1.1. フェイルオーバグループの設定...16 4.3.1.2. スクリプト... 17 5. クラスタ構成の検証...20 5.1. 検証項目...20 5.2. 検証内容...20 6. 付録...21 6.1. キュー マネージャーの削除...21
1. 概要 1. 概要 この文書は WebSphere MQ の動作環境を Turbolinux 8 CLUSTERPRO SE によるクラスタ上に作成し クラスタの動作検証を行った際の手順を記載するものである 郵便番号 : 103-8510 住所 : 東京都中央区日本橋 19-21 作業場所 御担当者名 : IBM Linux コンピテンシー センター 連絡先 : 作業日 : 2003 年 11 月 4 日 5 日 会社名 : 日本アイ ビー エム株式会社 ターボリナックス株式会社 作業者 この文章は WebSphere MQ を CLUSTERPRO によりクラスタ化するための設定例を示すことにより システムインテグレーション時の留意事項をまとめたものであり MQ や CLUSTERPRO の動作保証をするものではありません Page 3
2. 対象システム 2. 対象システム 2.1. ハードウェア構成 対象システムのハードウェア構成 メーカー名 項目 日本 IBM 内容 製品名 Xseries 440 8687-4RX プロセッサ CPU Intel Xeon 1.60GHz x 4 チップセット IBM XA-32 メモリ 4GB ストレージ ( 内臓 ) コントローラ ServeRAID-4Mx SCSI ディスク Ultra160 36.4GB(10krpm) 2(RAID1) HBA FAStT FC2-133 ホスト バス アダプター + FC ケーブル グラフィクス S3 Savage4 LT ネットワークカード Broadcom Vigil B5700 1000Base-T (bcm5700) ストレージ ( 外付 ) FAStT600 ストレージ サーバ コントローラ Dual active 2GB RAID コントローラ ディスク 36GB Page 4
2. 対象システム クラスタサーバのハードウェア構成 Page 5
2. 対象システム 2.2. ソフトウェア構成 クラスタサーバのソフトウェア構成 Page 6
3. インストール 3. インストール 各ソフトウェアのインストールについて記載する 3.1. OS 各サーバに次の OS 製品をインストール 製品名 Turbolinux Enterprise Server 8 powered by UnitedLinux ( SP2a 適用 Kernel 2.4.19-304 ) なお インストール時に インストールステップで表示される インストールの設定 画面で ソフトウェア を選択して 詳細な選択 (D) をクリックし [C/C++ Compiler コンパイラーとツール ] を選択してインストール Turbolinux Enterprise Server 8 のインストールに関する詳細は 以下の URL 内インストール手順書を参照 URL : http://www.turbolinux.co.jp/products/cluster/cpro8/trial.html 評価版ご利用時のご参考資料 Turbolinux Enterprise Server 8 簡易インストール手順書 ネットワークの設定 クラスタサーバ 1 項目 インターフェース - eth0 パブリック LAN IP アドレス 10.7.11.10 ネットワーク 10.7.0.0 / 255.255.0.0 インターフェース - eth1 インターコネクト IP アドレス 192.168.1.1 ネットワーク 192.168.1.0 / 255.255.255.0 内容 ホスト名 X440-1 クラスタサーバ 2 項目 インターフェース - eth0 パブリック LAN IP アドレス 10.7.11.11 ネットワーク 10.7.0.0 / 255.255.0.0 インターフェース - eth1 インターコネクト IP アドレス 192.168.1.2 ネットワーク 192.168.1.0 / 255.255.255.0 内容 ホスト名 X440-2 OS インストール後に Service Pack 2 をインストール # mount /media/cdrom ; cd /media/cdrom #./install_update_rpms.sh Page 7
3. インストール 3.2. FAStT デバイスドライバ (qla2300.o) FAStT デバイスドライバを下記の URL よりダウンロードしインストールする http://www 6.ibm.com/jp/domino05/pc/download/download.nsf/DownloadSearchView/CC172E7816752E8C49256D 9F0030DDB8 ソフト名 ダウンロード ファイル リリース日 FAStT ホスト アダプター非フェイル オーバー デバイス ドライバーバージョン 6.06.00 (Linux) 25k9277.tgz 9 月 11 日 ドライバのインストール ドライバの作成 ドライバのバックアップ # cd /lib/modules/2.4.19-64gb-smp/kernel/drivers/scsi # cp qla2300.o qla2300.o.orig カーネルソースのディレクトリに移動 # cd /usr/src/linux # make clonecong # make dep ドライバのコンパイル # tar xvfz 25k9277.tgz # cd i2x00-v6.06.00 #./drvsetup #./libinstall # cd i2x00-v6.06.00 # make all SMP=1 OSVER=linux (SMP) モジュールの指定 /etc/syscong/kernel に qla2300.o の記述を追加 < 追加例 > INITRD_MODULES= aic7xxx ext3 qla2300 ドライバの確認 # insmod./qla2300.o # less /proc/scsi/qla2300/n n はスロット数により変わる ドライバのロード # cp qla2300.0 /lib/modules/2.4.19-64gb-smp/kernel/drivers/scsi/ # mk_initrd カーネルパラメータの変更 /boot/grub/menu.lst に max_scsi_luns=128 を追加 Page 8
3. インストール 3.3. Turbolinux 8 CLUSTERPRO SE 各サーバに次の Turbolinux 8 CLUSTERPRO SE ( パッケージ :clusterpro-2.1-1.3) をインストール トレッキングツールでクラスタ情報を生成 CLUSTERPRO 用 fstab は以下のとおり /etc/clusterpro/fstab NP ###NEC_NP1 /dev/sdb1 SW sdb2 /dev/sdb2 /MQHA ext3 rw WD ###NEC_NP1 /dev/sdb1 WD sdb2 /dev/sdb2 :fsckopt -y :mnttimeout 300 Turbolinux 8 CLUSTERPRO SE のインストール / 設定に関する詳細は 以下の URL 内簡易設定手順書を参照 URL : http://www.turbolinux.co.jp/products/cluster/cpro8/trial.html 評価版ご利用時のご参考資料 Turbolinux 8 CLUSTERPRO SE トライアル版簡易設定手順書 3.4. WebSphere MQ 各サーバに次の MQ をインストール 製品名 WebSphere MQ for Linux V5.3 3.4.1. MQ インストール事前準備 クラスタを構成する各サーバで MQ 用のユーザとグループを作成する この時 両ノードでグループ mqm とユーザ mqm に関する GID UID を合わせる必要がある ユーザ名 グループ名 mqm mqm < 作成例 GID=500 UID=501> # groupadd -g 500 mqm # useradd -m -u 501 -g mqm mqm クラスタで使用する MQ 用スクリプトを 以下のパスにコピーする スクリプトディレクトリパス /home/mqm/bin MQ 用スクリプトスタート スクリプト モニタリング スクリプト ストップ スクリプト リスナー / チャネル開始 スクリプト リスナー終了 スクリプト hamqm_start_su hamqm_applmon_su hamqm_stop_su rc.local 本スクリプトは hamqm_start_su スクリプトから呼び出されます キュー マネージャー開始後に必要な処理を記述してください rc.local2 本スクリプトは hamqm_stop_su スクリプトから呼び出されます キュー マネージャー終了後に必要な処理を記述してください スクリプトのコピー後 全ての MQ 用スクリプトに実行パーミッションを設定する このスクリプトは root ユーザで実行する Page 9
3. インストール スクリプト本検証で使用した MQ 用スクリプトは以下の通り 本スクリプトは検証用に作成したものであり 実運用で使用する場合はシステムに合わせて修正を行う必要があります hamqm_start_su #!/bin/bash # PLEASE NOTE - This script is supplied "AS IS" with no # warranty or liability. It is not part of # any product. Please ensure that you read # and understand it before you run it. Make # sure that by running it you will not # overwrite or delete any important data. # # DESCRIPTION: # hamqm_start_su <qm-name> # # This script should do whatever it can to start the QM (name # passed as arg). # Only argument is the queue manager name. Save it as QM variable QM=$1 if [ -z "$QM" ] echo "hamqm_start_su: ERROR! No queue manager name supplied" exit 1 # Check that the QM doesn't already think it's running # The regular expression in the next line contains a tab character # Edit only with tab-friendly editors. srchstr="( -m)$qm[ ]*.*$" for process in amqpcsea amqhasmx amqharmx amqzllp0 \ amqzlaa0 runmqchi amqrrmfa amqzxma0 do ps -ef grep $process grep -v grep \ egrep "$srchstr" awk '{print $2}' \ xargs kill -9 >/dev/null 2>&1 done # Should now be safe to start the QM su mqm -c "strmqm ${QM} > /dev/null 2>&1" rc=$? ## Fire post-online script if good return from strmqm. if [ $rc -eq 0 ] # Launch post-online script in background. # if [ -x /home/mqm/bin/rc.local ] echo "hamqm_start: launch post_online script for ${QM}" /home/mqm/bin/rc.local ${QM} & exit $rc Page 10
3. インストール hamqm_stop_su #!/bin/bash # PLEASE NOTE - This script is supplied "AS IS" with no # warranty or liability. It is not part of # any product. Please ensure that you read # and understand it before you run it. Make # sure that by running it you will not # overwrite or delete any important data. # # DESCRIPTION: # hamqm_stop_su <qmname> # # Stops the QM. # The endmqm is issued synchronously and this script blocks until it # has completed. # QM=$1 TIMEOUT=10 exit_flg=0 srchstr="( -m)$qm[ ]*.*$" if [ -z "$QM" ] echo "hamqm_stop: ERROR! No queue manager name supplied" exit 1 echo "hamqm_stop_su is running: \"$QM\"" su - mqm -c "endmqm -i ${QM} >/dev/null 2>&1" SECONDS=0 while [ $exit_flg -eq 0 ] do for process in amqpcsea amqhasmx amqharmx amqzllp0 \ amqzlaa0 runmqchi amqrrmfa amqzxma0 do proc_count=`ps -ef grep $process grep -v grep \ egrep "$srchstr" wc -l` if [ $proc_count -eq 0 ] exit_flg=1 exit_flg=0 break done if [ $exit_flg -eq 1 ] break if [ $SECONDS -gt $TIMEOUT ] echo "kill processes!" for process in amqpcsea amqhasmx amqharmx amqzllp0 \ amqzlaa0 runmqchi amqrrmfa amqzxma0 do ps -ef grep $process grep -v grep \ egrep "$srchstr" awk '{print $2}' \ xargs kill -9 >/dev/null 2>&1 done break sleep 1 done # Invoke Post-Offline user exit, if one exists if [ -x /home/mqm/bin/rc.local2 ] Page 11
3. インストール echo "hamqm_stop_su: launch post-offline script for ${QM}" /home/mqm/bin/rc.local2 ${QM} # Exit code from post_offline script is deliberately ignored hamqm_applimon_su #!/bin/bash # # PLEASE NOTE - This script is supplied "AS IS" with no # warranty or liability. It is not part of # any product. Please ensure that you read # and understand it before you run it. Make # sure that by running it you will not # overwrite or delete any important data. # # DESCRIPTION: # hamqm_applmon_su <qmname> # This is the application monitor script. # # This script tests the operation of the QM, by performing a ping. # # Exit codes: # 0 => Either QM is starting or QM is running and responds. # Either is OK. # >0 => QM is not responding and not starting. # Exit code is result of runmqsc command. QM=$1 TIMEOUT=10 while : do # Test the operation of the QM. echo "ping qmgr" su - mqm -c "runmqsc ${QM}" > /dev/null 2>&1 pingresult=$? # pingresult will be 0 on success; non-zero on error (man runmqsc) echo "pingresult is $pingresult" if [ $pingresult -eq 0 ] # ping succeeded echo "hamqm_applmon: Queue Manager ${QM} is responsive" result=0 # ping failed # Don't condemn the QM immediately, it may be in startup. # The following regexp includes a space and a tab, so use tab-friendly # editors. srchstr=" $QM[ ]*$" cnt=`ps -ef grep strmqm grep "$srchstr" grep -v grep \ awk '{print $2}' wc -l` if [ $cnt -gt 0 ] # It appears that QM is still starting up, tolerate echo "hamqm_applmon_su: Queue Manager ${QM} is starting" result=0 # There is no sign of QM start process echo "hamqm_applmon_su: Queue Manager ${QM} is not responsive" result=$pingresult exit ${result} sleep ${TIMEOUT} done Page 12
3. インストール rc.local #!/bin/bash QM_NAME=$1 QM_PORT="1414" TRP_TYPE="tcp" MQ_CHANNEL="QM1.TO.QM2" CMDNAME="`basename $0`" su - mqm -c "runmqlsr -m $QM_NAME -t $TRP_TYPE -p $QM_PORT > /dev/null 2>&1 &" su - mqm -c "runmqchl -c ${MQ_CHANNEL} -m ${QM_NAME} >/dev/null 2>&1 &" exit 0 rc.local2 #!/bin/bash QM_NAME=$1 su - mqm -c "endmqlsr -m ${QM_NAME}" >/dev/null 2>&1 ps -fwu mqm grep ${QM_NAME} >/dev/null 2>&1 ret=$? # ret is true(=0), if ${QM_NAME} is found. while [ $ret -eq 0 ]; do sleep 1 ps -fwu mqm grep ${QM_NAME} >/dev/null 2>&1 ret=$? done Page 13
3. インストール 3.4.2. MQ のインストール各サーバに WebSphere MQ for Linux V5.3 をインストール mqlicense.sh を実行し ライセンスに同意する 以下のコンポーネントを rpm コマンドでインストールする rpm パッケージ MQSeriesRuntime-5.3.0-2.i386.rpm MQSeriesSDK-5.3.0-2.i386.rpm MQSeriesServer-5.3.0-2.i386.rpm MQSeriesMsg_ja-5.3.0-2.i386.rpm MQSeriesSamples-5.3.0-2.i386.rpm CSD5 (U487853) を適用する setmqcap で購入ライセンスを設定する Page 14
4. ソフトウェアの設定 4. ソフトウェアの設定 各サーバで稼動するソフトウェアの設定について記載する 4.1. 準備 共有ディスクにクラスタ用のパーティションを作成する ここでは FAStT600 の設定および接続が完了しているものとする fdisk コマンドを実行し CLUSTER パーティションおよび MQ 用パーティションを作成する # fdisk /dev/sdb CLUSTER パーティション /dev/sdb1 10MB MQ 用切替パーティション /dev/sdb2 10GB 4.2. WebSphere MQ 4.2.1. キュー マネージャーの構成 キュー マネージャーを構成し 共有ディスクにデータを移動する 本テストでは MQ のパラメータは全てデフォルトのまま使用する 今回使用したキュー マネージャー名は以下のとおり キュー マネージャー名 QM1 片方のサーバで以下の手順を実行する (root ユーザで実行 ) 共有ディスクを /MQHA にマウントする # mkdir /MQHA # mount /dev/sdb2 /MQHA 共有ディスクに以下のディレクトリを作成する ディレクトリ作成後 パーミッションを適切な値に変更する # mkdir -p /MQHA/QM1/data # mkdir -p /MQHA/QM1/log キュー マネージャーのデータファイル ログの場所を環境変数に設定する # export MQHAFSDATA=/MQHA/QM1/data # export MQHAFSLOG=/MQHA/QM1/log キュー マネージャーを作成する # hacrtmqm QM1 もう片方のサーバで以下の手順を実行する (mqm ユーザで実行 ) 以下のスクリプトを実行する $ halinkmqm QM1 QM1 /MQHA/QM1/data Page 15
4. ソフトウェアの設定 4.3. Turbolinux 8 CLUSTERPRO SE 各サーバの Turbolinux 8 CLUSTERPRO SE の設定について記載する 4.3.1. クラスタの設定 クラスタの設定内容は以下の通り スーパークラスタ名 項目 ネットワークパーティション ディスク COM ポート - サブクラスタ サブクラスタ名 SuperCluster ###NEC_NP1 SubCluster サーバ x440-1, x440-2 グループ MQ 内容 4.3.1.1. フェイルオーバグループの設定 MQ フェイルオーバグループの設定内容は次の通り フェイルオーバグループ名 項目 フェイルオーバ ポリシー x440-1 x440-2 リソース MQ 内容 仮想 IP アドレス 10.7.11.12/255.255.0.0 切替パーティション名 /dev/sdb2 切替パーティションマウントポイント名 /MQHA 切替パーティションサイズ 10GB Page 16
4. ソフトウェアの設定 4.3.1.2. スクリプト 起動 停止用スクリプトを CLUSTERPRO マネージャから編集する 本検証では斜体文字部分を追記 start.bat #! /bin/sh #*************************************** #* START.BAT * #*************************************** if [ "$ARMS_EVENT" = "START" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "NORMAL1" armlog "Start MQ" -arm /home/mqm/bin/hamqm_start_su QM1 armload MQ -M -FOV /home/mqm/bin/hamqm_applmon_su QM1 > /dev/null if [ "$ARMS_SERVER" = "HOME" ] armlog "NORMAL2" armlog "ON_OTHER1" armlog "ERROR_DISK from START" elif [ "$ARMS_EVENT" = "RECOVER" ] armlog "RECOVER" elif [ "$ARMS_EVENT" = "FAILOVER" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "FAILOVER1" armlog "Start MQ" -arm /home/mqm/bin/hamqm_start_su QM1 armload MQ -M -FOV /home/mqm/bin/hamqm_applmon_su QM1 > /dev/null if [ "$ARMS_SERVER" = "HOME" ] armlog "FAILOVER2" armlog "ON_OTHER2" armlog "ERROR_DISK from FAILOVER" armlog "NO_ARM" armlog "EXIT" exit 0 Page 17
4. ソフトウェアの設定 stop.bat #! /bin/sh #*************************************** #* STOP.BAT * #*************************************** arm_rel_path() { while [ "$1"!= "" ] do armrelpath $1 > /dev/null 2>&1 relret=$? if [ "$relret" = "0" ] armlog "KILL NO PROCESS" elif [ "$relret" = "1" ] armlog "KILL SOME PROCESS" armlog "ARMRELPATH ERROR" } done shift arm_rel_mntpoint() { mntpoint=`armlsmnt -l $ARMS_RESOURCELIST` mntret=$? } if [ "$mntret" = "0" ] if [ "$mntpoint"!= "" ] arm_rel_path $mntpoint armlog "NO MOUNT POINT" armlog "ARMLSMNT ERROR" if [ "$ARMS_EVENT" = "START" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "NORMAL1" armlog "Stop MQ" -arm armkill MQ /home/mqm/bin/hamqm_stop_su QM1 if [ "$ARMS_SERVER" = "HOME" ] armlog "NORMAL2" armlog "ON_OTHER1" arm_rel_mntpoint armlog "ERROR_DISK from START" elif [ "$ARMS_EVENT" = "FAILOVER" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "FAILOVER1" armlog "Stop MQ" -arm armkill MQ /home/mqm/bin/hamqm_stop_su QM1 if [ "$ARMS_SERVER" = "HOME" ] Page 18
4. ソフトウェアの設定 armlog "FAILOVER2" armlog "ON_OTHER2" arm_rel_mntpoint armlog "ERROR_DISK from FAILOVER" armlog "NO_ARM" armlog "EXIT" exit 0 Page 19
5. クラスタ構成の検証 5. クラスタ構成の検証 MQ のクラスタ構成で MQ の動作 リソースの引継ぎが正常に行われることを確認 5.1. 検証項目 クラスターサーバ上で稼働する MQ に対して行った検証項目および 検証結果は以下の通り 内容は 5.2 検証内容 を参照 No 項目 結果 1 キュー マネージャーのテイクオーバー OK 2 パーシステント メッセージの引継ぎ OK 3 リスナーの停止 起動 OK 4 チャネルの確立 OK 5 テイクオーバー中に送信したメッセージの引継 OK 5.2. 検証内容 検証の内容は以下の通り なお メッセージは全てパーシステント メッセージを使用 1. キュー マネージャーのテイクオーバー 片側のクラスタサーバでキュー マネージャーをダウンすることにより 他方でキュー マネージャーが起動することを確認 2. パーシステント メッセージの引継ぎ キュー マネージャーをダウンさせる前にキューに PUT した パーシステント メッセージが引継ぎ後のキューに存在することを確認 3. リスナーの停止 起動 ダウンしたサーバ側でリスナーが停止し 引継先のサーバでリスナーが起動することを確認 今回は リスナーとして runmqlsr を使用 4. チャネルの確立 リスナーの引継ぎ後 送信チャネル 受信チャネルのステータスが "RUNNIING" 状態になることを確認 また メッセージが送受信できることを確認 5. テイクオーバー中に送信したメッセージの引継 テイクオーバー中に送信したメッセージが消失しないことを確認 クラスターを構成するキュー マネージャーに対しメッセージを送信し続けている最中にテイクオーバーを実施 送信した全てのメッセージが引継ぎ後のキュー マネージャーのキューに PUT されていることを確認 Page 20
6. 付録 6. 付録 6.1. キュー マネージャーの削除 提供スクリプト ( hacrtmqm ) でキュー マネージャーを作成した場合 キュー マネージャーの削除は以下の手順で行う リンクの削除 共有ディスクの以下のリンクを削除 /MQHA/QM1/data/qmgrs/QM1 以下の esem, isem, msem, ssem, shmem を削除 /MQHA/QM1/data/qmgrs/QM1/@ipcc 以下の esem, isem, msem, ssem, shmem を削除 クラスタを構成する各サーバの以下のリンクを削除 /var/mqm/qmgrs 以下の QM1 を削除 クラスタを構成する各サーバの以下のディレクトリを削除 ( 必要に応じて ) /var/mqm 以下の ipc ディレクトリを削除 ディレクトリの作成 共有ディスク上に以下のディレクトリを作成ディレクトリのオーナーは mqm : mqm パーミッションは 775 に設定する /MQHA/QM1/data/qmgrs/QM1 以下に esem, isem, msem, ssem, shmem を作成 /MQHA/QM1/data/qmgrs/QM1/@ipcc 以下に esem, isem, msem, ssem, shmem を作成 キュー マネージャーの削除 mqm グループに属するユーザで以下のコマンドを実行する $ dltmqm QM1 mqs.ini ファイルの編集 dltmqm コマンドを発行したサーバではない方のサーバ上にある mqs.ini ファイルの以下のスタンザを削除 QM1 の QueueManager スタンザ < 参考 > mqs.ini ファイルは /var/mqm 以下にあります Page 21