目次


Linuxでの高可用性ミドルウェア、第2回: WebSphere MQ

メッセージング・ミドルウェアにHA信頼性を与える

Comments

オンデマンド・コンピューティングの成功にとって、システムの稼働時間を最大に維持することが次第に重要になってきています。WebSphere MQは重要なメッセージング・ミドルウェアの一つであり、企業がオンデマンド・ビジネスに移行するための補助となるものです。高可用性(high availability: HA)構成を考える場合には、WebSphere MQをどのように含めるかが重要なことを意識する必要があります。この記事ではオープン・ソースのソフトウェアを利用し、ハードウェア・レベルで提供されるクラスタリングを使ってWebSphere MQに高可用性を実現する方法を説明します。

最初に

WebSphere MQは、一度のみのメッセージ配送を保証した非同期メッセージとキューイング機能を提供します。WebSphere MQとハートビートを併せて使うことで、WebSphere MQキュー・マネージャーの可用性をさらに高めることができます。

このシリーズの第1回では、HAの概念を紹介し、ハートビートのインストールと設定方法を説明しました。今回の記事では、ハートビートを使ったコールド・スタンバイ構成でWebSphere MQ用のHAを実装する方法について説明します。この実装では、プライマリー・マシンに問題があることをハートビートが検出します。これはハードウェアの問題かも知れませんし、ソフトウェアの問題かも知れません。そうするとスタンバイ・マシンは次を行います。

  • IPアドレスを引き継ぐ
  • キュー・マネージャーのキューとログ・ファイルを保存している共有ディスクを引き継ぐ
  • キュー・マネージャーと、その関連プロセスを起動する

この記事を最大限に利用するには、WebSphere MQと高可用性クラスターを基本的に理解している必要があります。また、このシリーズの第1回の記事、Linuxでの高可用性ミドルウェア、第1回: HeartbeatとApache Webサーバー もよく読んでおく必要があります。

WebSphere MQ用にHAを実装する

ハートビートに使われるキュー・マネージャーは、あるノードがフェールした場合に生き残ったノードがアクセスできるように、そのログとデータを共有ディスクに保存しておく必要があります。キュー・マネージャーを実行しているノードはまた、内部ディスクに幾つかのファイルを保持しておく必要もあります。こうしたファイルには、/var/mqm/mqs.iniなど、そのノードの全キュー・マネージャーに関連するファイルや、内部制御情報を生成するために使われるキュー・マネージャー固有のファイルなどがあります。従ってキュー・マネージャーに関連したファイルは、内部ディスクと外部ディスクとに分割されます。

共有ディスクに保存されるキュー・マネージャー・ファイルに関して言うと、あるキュー・マネージャーに関連する全リカバリー・データ(ログとデータ)に対して単一の共有ディスクを使うこともできます。しかし実稼働環境での最適なパフォーマンスのためには、ログとデータを別のファイルシステムに置き、ディスクI/Oに対して別々に調整できるように習慣づけた方が賢明です。

図1は私達のファイルシステムの構成を示しています。図にあるリンクは以下に説明するように、シェル・スクリプトを使って自動的に生成されます。

図1. キュー・マネージャー(ha.queue.manager)用のファイルシステム構成
Filesystem organization for the queue manager - ha.queue.manager
Filesystem organization for the queue manager - ha.queue.manager

以下のセクションでは、WebSphere MQをインストールし、また高可用性キュー・マネージャー構成をテストするための手順を、順を追って説明します。

WebSphere MQをインストールする

プライマリー・ノードとバックアップ・ノードの両方にWebSphere MQ 5.3.0.2とFixpack 7をインストールするには、このセクションで説明する概要手順に従ってください。詳しくはドキュメント、WebSphere MQ for Linux for Intel and Linux for zSeries Quick Beginningsを参照してください(参考文献にリンクがあります)。

  1. 次のコマンドを使ってWebSphere MQ 5.3.0.2 RPMを解凍します。

    rm -rf /tmp/mq5.3.0.2-install
    mkdir /tmp/mq5.3.0.2-install
    tar xzf C48UBML.tar.gz -C /tmp/mq5.3.0.2-install
    tar xf /tmp/mq5.3.0.2-install/MQ53Server_LinuxIntel.tar -C /tmp/mq5.3.0.2-install

    ここで、C48UBML.tar.gzはWebSphere MQのインストール・イメージです。

  2. カーネル・レベルを設定します。

    export LD_ASSUME_KERNEL=2.4.19

  3. WebSphere MQ に付属のJava runtime environment (JRE) をIBM 1.4.2 JDK JREと入れ替えます。

    mv /tmp/mq5.3.0.2-install/lap/jre /tmp/mq5.3.0.2-install/lap/jre.mq
    ln -s /opt/IBMJava2-142/jre /tmp/mq5.3.0.2-install/lap/jre

  4. ライセンス条件に同意します。

    /tmp/mq5.3.0.2-install/mqlicense.sh -accept -text_only

  5. WebSphere MQ RPMsをインストールします。

    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesRuntime-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesSDK-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesServer-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesClient-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesSamples-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesJava-5.3.0-2.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.2-install/MQSeriesMan-5.3.0-2.i386.rpm

  6. クリーン・アップを行います。

    rm -rf /tmp/mq5.3.0.2-install/

  7. fixpack 7 RPMsを解凍します。

    rm -rf /tmp/mq5.3.0.7-install/
    mkdir /tmp/mq5.3.0.7-install/
    tar xzf U496732.nogskit.tar.gz -C /tmp/mq5.3.0.7-install/

  8. fixpack 7 RPMsをインストールします。

    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesRuntime-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesSDK-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesServer-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesClient-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesSamples-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesJava-U496732-5.3.0-7.i386.rpm
    rpm -Uvh /tmp/mq5.3.0.7-install/MQSeriesMan-U496732-5.3.0-7.i386.rpm

  9. 再度クリーン・アップを行います。

    rm -rf /tmp/mq5.3.0.7-install/

高可用性MQマネージャーとキューを生成する

一部のプラットフォームでは、高可用性キュー・マネージャーの生成は、MC63やIC61などWebSphere MQ HA Support Packsにあるスクリプトによって自動的に行われます。しかしLinuxにはこうしたサポート・パックはありません。

このセクションで使われているスクリプトは、MC63サポート・パックにあるスクリプトを修正したもので、次のような制約があります。

  • ログとデータに対して一つのファイルシステム(/ha)のみ
  • 一度に一つのキュー・マネージャー

高可用性キュー・マネージャーha.queue.managerを生成するには、下記の概略手順に従って下さい。

  1. 共有ディスク(/ha)に次のようなディレクトリーを作ります。
    • /ha/ha.queue.manager
    • /ha/ha.queue.manager/data
    • /ha/ha.queue.manager/log
  2. プライマリー・ノード(ha1)で、(rootとして)下記のコマンドを使って高可用性キュー・マネージャーを生成します。

    /ha/hacode/mq/hascripts/hacrtmqm ha.queue.manager

    hacrtmqmコマンドがキュー・マネージャーを生成し、そのディレクトリーが確実にHA操作に対応できるようにします。hacrtmqmスクリプトに対するソース・コードは、この記事に含まれています(ダウンロードにリンクがあります)。

  3. mqmユーザーに対して、両方のノードの .bashrc(スタートアップ・スクリプト)ファイルに次の2行を追加します。

    LD_ASSUME_KERNEL=2.4.19
    export LD_ASSUME_KERNEL

  4. setmqcapコマンドを実行し、料金を払ったプロセッサー数を入力します。このコマンドをha1で実行します。

    /opt/mqm/bin/setmqcap 4

  5. ユーザーmqmとして、strmqmコマンドを使ってキュー・マネージャー、ha.queue.managerを起動します。

    /opt/mqm/bin/strmqm ha.queue.manager

  6. 下記をタイプしてMQSCコマンドを有効にします。

    /opt/mqm/bin/runmqsc ha.queue.manager

    MQSCセッションが起動しことを示すメッセージが表示されます。MQSCにはコマンド・プロンプトはありません。

  7. 次のコマンドを入力して、ローカル・キュー、HA.QUEUEを作ります。

    define qlocal (HA.QUEUE)

  8. 次のコマンドを入力して、チャネル、HA.CHANNELを作ります。

    define channel(HA.CHANNEL) chltype(svrconn) trptype(tcp) mcauser('mqm')

  9. endをタイプしてMQSCを停止します。幾つかのメッセージが表示され、再度コマンド・プロンプトが表示されます。
  10. endmqmコマンドを使って、キュー・マネージャー、ha.queue.managerを手動で停止します。

    /opt/mqm/bin/endmqm ha.queue.manager

  11. バックアップ・ノード(ha2)で、ユーザーmqmとしてキュー・マネージャーを生成します。下記のコマンドを使いますが、実際は全て一行です。/haをrootとしてマウントする必要があります。

    cd /ha/hacode/mq/hascripts/
    ./halinkmqm ha.queue.manager ha\!queue\!manager
    /ha/ha.queue.manager/data standby

    hacrtmqmは、内部的にはhalinkmqmと呼ばれるスクリプトを使ってIPCキーに使われているサブディレクトリーを再リンクし、/var/mqm/qmgrs/$qmgrから /ha/$qmgr/data/qmgrs/$qmgrディレクトリーにsymlink(シンボリックリンク)を作ります。hacrtmqmでキュー・マネージャーを生成したノードでは、halinkmqmを実行しないでください。そこではhalinkmqmは既に実行されているのです。halinkmqmスクリプトのソース・コードは、この記事に含まれています(ダウンロードからたどれるファイルの中にあります)。

  12. setmqcapコマンドを実行し、料金を払ったプロセッサー数を入力します。

    /opt/mqm/bin/setmqcap 4

  13. strmqmコマンドを使って、バックアップ・ノードでキュー・マネージャー、ha.queue.managerを起動します。起動することを確認します。
  14. バックアップ・ノードでキュー・マネージャーを停止します。

WebSphere MQ Serverを管理するためにハートビートを設定する

MQサーバーを管理するためにハートビートを設定する手順の概要は下記の通りです。

  1. 先に書いた通り、ハートビートが管理するリソースは基本的に、単なる起動/停止スクリプトです。ですから必要なのは、WebSphere MQキュー・マネージャーやその関連プロセスを起動/停止するためのスクリプトを作ることです。非常に基本的なスクリプトをリスト1に示しますが、これは皆さんの設定に合わせて、さらにカスタム化することができます。このスクリプトは/etc/rc.d/init.dディレクトリーに置く必要があります。

    リスト1. mqseriesスクリプト
    #!/bin/bash
    #
    #   /etc/rc.d/init.d/mqseries
    #
    # Starts the MQ Server
    #
    # chkconfig: 345 88 57
    # description: Runs  MQ
    . /etc/init.d/functions
    # Source function library.
    PATH=/usr/bin:/bin:/opt/mqm/bin
    QMGRS="ha.queue.manager"
    PS=/bin/ps
    GREP=/bin/grep
    SED=/bin/sed
    #======================================================================
    SU="sh"
    if [ "`whoami`" = "root" ]; then
       SU="su - mqm"
    fi
    #======================================================================
    killproc() {            # kill the named process(es)
          pid=`$PS -e |
              $GREP -w $1 |
              $SED -e 's/^  *//' -e 's/ .*//'`
          [ "$pid" != "" ] && kill -9 $pid
    }
    #======================================================================
    start() {
       for qmgr in $QMGRS ; do
          export qmgr
       echo "$0: starting $qmgr"
       $SU -c "strmqm $qmgr"
       $SU -c "nohup runmqlsr -m $qmgr -t tcp -p 1414 >> /dev/null 2&t;&1 < /dev/null &"
       done
    }
    #======================================================================
    stop() {
       for qmgr in $QMGRS ; do
          export qmgr
          echo ending $qmgr
    	killproc runmqlsr
    	$SU -c "endmqm -w $qmgr &"
          sleep 30
       done
    }
    case $1 in
    'start')
       start
       ;;
    'stop')
       stop
       ;;
    'restart')
       stop
       start
       ;;
    *)
       echo "usage: $0 {start|stop|restart}"
       ;;
    esac
  2. 今度は上記のmqseriesスクリプトを含むように、(両方のノードの)/etc/ha.d/haresourcesファイルを設定します。例えば次のようにします。

    ha1.haw2.ibm.com 9.22.7.46
    Filesystem::hanfs.haw2.ibm.com:/ha::/ha::nfs::rw,hard mqseries

    これは、ハートビートが起動すると、ハートビートはha1にクラスターIPアドレスを提供させ、共有ファイルシステム /haをマウントさせ、そしてWebSphere MQプロセスを起動させる、という命令です。終了時には、ハートビートはまず、WebSphere MQプロセスを停止してからファイルシステムをアンマウントし、そして最後にIPアドレスを明け渡します。

WebSphere MQ用のHAをテストする

このセクションでは、キュー・マネージャー、ha.queue.managerの高可用性をテストするために必要な手順の概要を説明します。

  1. プライマリー・ノードでハートビート・サービスを起動し、次にバックアップ・ノードで起動します。

    /etc/rc.d/init.d/heartbeat start

    もし失敗した場合には /var/log/messagesを見て原因を特定し、修正します。ハートビートが正常に起動すると、ha.cfでファイル設定したIPアドレスを持つ、新しいインターフェースが見えるはずです。これは、ifconfigコマンドを実行することで表示することができます。リスト2は設定に対する出力のうち、関連する部分を示しています。

    リスト2. クラスターIPアドレスに対するインターフェース
    ...
    eth0:0    Link encap:Ethernet  HWaddr 00:D0:59:DA:01:50
              inet addr:9.22.7.46  Bcast:9.22.7.127  Mask:255.255.255.128
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:76541 errors:0 dropped:0 overruns:0 frame:0
              TX packets:61411 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:8830515 (8.4 Mb)  TX bytes:6755709 (6.4 Mb)
              Interrupt:11 Base address:0x6400 Memory:c0200000-c0200038
    ...
    リスト3. ha-logファイルの内容
    ...
    heartbeat: 2004/09/01_11:17:13 info: **************************
    heartbeat: 2004/09/01_11:17:13 info: Configuration validated.
    	Starting heartbeat 1.2.2
    heartbeat: 2004/09/01_11:17:13 info: heartbeat: version 1.2.2
    heartbeat: 2004/09/01_11:17:13 info: Heartbeat generation: 10
    heartbeat: 2004/09/01_11:17:13 info: Starting serial heartbeat on
    	tty /dev/ttyS0 (19200 baud)
    heartbeat: 2004/09/01_11:17:13 info: ping heartbeat started.
    heartbeat: 2004/09/01_11:17:13 info: pid 9226 locked in memory.
    heartbeat: 2004/09/01_11:17:13 info: Local status now set to: 'up'
    heartbeat: 2004/09/01_11:17:14 info: pid 9229 locked in memory.
    heartbeat: 2004/09/01_11:17:14 info: pid 9230 locked in memory.
    heartbeat: 2004/09/01_11:17:14 info: pid 9231 locked in memory.
    heartbeat: 2004/09/01_11:17:14 info: pid 9232 locked in memory.
    heartbeat: 2004/09/01_11:17:14 info: pid 9233 locked in memory.
    heartbeat: 2004/09/01_11:17:14 info: Link 9.22.7.1:9.22.7.1 up.
    heartbeat: 2004/09/01_11:17:14 info: Status update for node 9.22.7.1:
    	status ping
    ...
    heartbeat: 2004/09/01_11:19:18 info: Acquiring resource group:
    	ha1.haw2.ibm.com 9.22.7.46 mqseries
    heartbeat: 2004/09/01_11:19:18 info: Running /etc/ha.d/resource.d/IPaddr
    	9.22.7.46 start
    heartbeat: 2004/09/01_11:19:18 info: /sbin/ifconfig eth0:0 9.22.7.46
    	netmask 255.255.255.128  broadcast 9.22.7.127
    heartbeat: 2004/09/01_11:19:18 info: Sending Gratuitous Arp for
    	9.22.7.46 on eth0:0 [eth0]
    ...
    heartbeat: 2004/09/01_11:19:49 info: Running /etc/init.d/mqseries  start
    ...

    IPアドレス取得が行われ、次にWebSphere MQプロセスが起動しているのがわかります。psコマンドを使って、プライマリー・ノードでWebSphere MQが実行していることを確認します。

  2. BGQUEUEに永続的なメッセージを幾つか置きます。これはMQ Senderプログラム(OSによってsend.batまたはsend.sh)を実行することで行います。このプログラムはMQ Clientをインストールしたマシンから実行する必要があります。リスト4はノードha1で実行した場合の出力を示しています。

    リスト4. HAキューに永続的なメッセージを置く
    [root@ha1 mq]# ./send.sh
    MSender is running
    Hostname  = ha.haw2.ibm.com
    QManager = ha.queue.manager
    Channel Name  = HA.CHANNEL
    Channel Port  = 1414
    Q  = HA.QUEUE
    Enter a message:
    Hello
    This
    is
    a
    test
    Done Sending Message
    [root@ha1 mq]#
  3. ブラウズしてメッセージを取得します。MQ Browseプログラム(OSによってreceive.batまたはreceive.sh)を使います。先にキューに置いた全てのメッセージが、最後の「test」を除いて取り出すことができます。最後のメッセージは、フェールオーバーが起きた後に取得できます。リスト5はノードha1で実行した場合の出力を示しています。

    リスト5. HAキューから永続的なメッセージを取得する
    [root@ha1 mq]# ./receive.sh
    MBrowse is running
    Hostname  = ha.haw2.ibm.com
    QManager = ha.queue.manager
    Channel Name  = HA.CHANNEL
    Channel Port  = 1414
    Q  = HA.QUEUE
    Browsed message: Hello
    Actually get message?y
    Actually getting the message
    Browsed message: This
    Actually get message?y
    Actually getting the message
    Browsed message: is
    Actually get message?y
    Actually getting the message
    Browsed message: a
    Actually get message?y
    Actually getting the message
    Browsed message: test
    Actually get message?n
    MQJE001: Completion Code 2, Reason 2033
    MQ exception: CC = 2 RC = 2033

    最後にある、原因コード2033のMQ Exceptionは無視します。このエラーは、もはや取り出すべきメッセージがキューに無いために起きたものです。

  4. フェールオーバーをシミュレートします。これは次のコマンドを使って、プライマリー・システムで単純にハートビートを停止することで行います。

    /etc/rc.d/init.d/heartbeat stop

    1分以内に2番目のマシンで全てのサービスが立ち上がるのが分かるはずです。もし立ち上がらない場合は、/var/log/messagesを見て問題を特定し、修正します。再度ハートビートを起動すれば、プライマリー・マシンにフェール・バックすることができます。ハートビートは常にプライマリー・システムを優先し、可能であればプライマリー・システムで実行します。/var/log/ha-logファイルをチェックし、バックアップ・マシンでpsコマンドを実行して、WebSphere MQが実行していることを確認します。

  5. 最後のメッセージをブラウズして取得します。MQ Browseプログラム(OSによってreceive.batまたはreceive.sh)を実行します。今度は最後のメッセージが取得できます。リスト6はノードha2で実行した場合の出力を示しています。

    リスト6. HAキューから永続的なメッセージを取得する
    [root@ha2 mq]# ./receive.sh
    MBrowse is running
    Hostname  = ha.haw2.ibm.com
    QManager = ha.queue.manager
    Channel Name  = HA.CHANNEL
    Channel Port  = 1414
    Q  = HA.QUEUE
    Browsed message: test
    Actually get message?y
    Actually getting the message
    MQJE001: Completion Code 2, Reason 2033
    MQ exception: CC = 2 RC = 2033
  6. プライマリー・マシンで再びハートビート・サービスを起動します。これで2番目のマシンで実行しているWebSphere MQサーバー・プロセスが停止し、プライマリー・マシンで起動するようになります。プライマリー・マシンはクラスターIPも取得するはずです。

共有ディスクを使うことで、フェールオーバー前にキューに置かれたメッセージを後から回復する方法が、これで理解できたと思います。

まとめ

この記事では、Linuxでオープン・ソースのソフトウェアを使用することで、WebSphere MQ用に高可用性をどのように実装するかを見てきました。次回の記事では、IBM LoadLevelerスケジューラーのHA実装について説明して行きます。

謝辞

WebSphere MQのインストールに関して技術的指導をくださったMike Burrに感謝いたします。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=228544
ArticleTitle=Linuxでの高可用性ミドルウェア、第2回: WebSphere MQ
publish-date=12092004