GlusterFS を使用して HA IBM MQ キュー マネージャー クラスタを Compute Engine にデプロイする

このチュートリアルでは、高可用性の IBM MQ キュー マネージャー クラスタを、Compute Engine を使用して Google Cloud にデプロイするプロセスについて順を追って説明します。MQ はネットワークやアプリケーションで障害が発生した場合でもデータが確実に配信されるよう、キューイング システムを介してキュー マネージャー間でデータを転送します。

このチュートリアルは、エンタープライズ アーキテクト、システム管理者、デベロッパー、DevOps エンジニアの方が Google Cloud に高可用性の IBM MQ キュー マネージャー クラスタをデプロイしようとしている場合に役立ちます。

このチュートリアルは、読者が次の技術を理解していることを前提としています。

  • Ubuntu server 16.04
  • IBM MQ
  • Compute Engine
  • ネットワーク サービスの負荷分散

目標

  • Compute Engine インスタンスを作成する。
  • ファイアウォール ルールを作成する。
  • 内部ロードバランサを作成する。
  • GlusterFS 共有ファイル システムを構成する。
  • クラスタの各ノードを構成する。
  • 高可用性対応のクラスタを構成する。
  • クラスタをテストする。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • ネットワーキング

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Compute Engine API を有効にします。

    API を有効にする

このチュートリアルを終了した後、作成したリソースを削除すれば、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

アーキテクチャ

可用性が高くスケーラブルな IBM MQ のデプロイを作成するために、このソリューションではキュー マネージャー クラスタに複数インスタンス キュー マネージャーを結合します。 複数インスタンス キュー マネージャーはアクティブ / スタンバイ構成で稼働し、共有ボリュームを使用して構成と状態データを共有します。 クラスタ化されたキュー マネージャーはネットワーク チャネルを使用して構成情報を共有し、受信メッセージの負荷分散を行うことができます。ただし、2 つのキュー マネージャーの間でメッセージの状態が共有されることはありません。

2 つのデプロイモデルを使用すると、キュー マネージャー レベルでの冗長性を確保した上で、1 つ以上のキュー マネージャーに負荷を分散してスケーリングできます。

このチュートリアルでは、2 つのキュー マネージャーを作成し、それを A、B とします。各キュー マネージャーに対して、プライマリ ノードとスタンバイ ノードを作成します(キュー マネージャー A に対しては mq-1mq-2、キュー マネージャー B に対しては mq-3mq-4 とします)。トラフィックをプライマリ インスタンスにルーティングするために、キュー マネージャーごとに 1 つの内部ロードバランサを使用します。コンシューマとパブリッシャは、キュー マネージャー自体のアドレスであるかのように、この内部ロードバランサのアドレスに向けられます。内部ロードバランサは、キュー マネージャー相互の通信にも使用されます。

IBM MQ 複数インスタンス キュー マネージャーには共有ストレージが必要です。このチュートリアルでは、各複数インスタンス キュー マネージャーのノード間で共有するファイル システムとして、GlusterFS というスケーラブルな分散ファイル システムを使用します。

MQ 複数インスタンス システムのアーキテクチャ

Compute Engine インスタンスを作成する

まず、このチュートリアルに必要なコンピューティング リソースを作成します。 Compute Engine インスタンスの mq-1mq-2 をキュー マネージャー A のプライマリ ノードとスタンバイ ノードとして作成し、mq-3mq-4 をキュー マネージャー B のプライマリ ノードとスタンバイ ノードとして作成します。これらのインスタンスはそれぞれ異なるゾーン内にあるため、インスタンスごとに非マネージド インスタンス グループも作成します。後で、これらの非インスタンス グループをロードバランサに接続します。

  1. Cloud Shell を開く

    Cloud Shell に移動

  2. MQ コンピューティング インスタンスの起動スクリプトを作成します。

    cat << 'EOF' >  mqstartup.sh
    #!/bin/bash
    
    if [ -f /root/INSTALLATION_DONE ]; then
      echo "Skipping because installation completed."
      exit 0
    fi
    
    # Docker installation
    
    apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    apt-get update
    apt-get install -y docker-ce
    
    # GlusterFS installation
    
    apt-get install -y glusterfs-server
    
    # Format and mount the persistent disk
    
    mkdir -p /data
    mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
    mount -o discard,defaults /dev/sdb /data
    
    touch /root/INSTALLATION_DONE
    EOF
    
  3. キュー マネージャー A のプライマリ ノードにする Compute Engine インスタンスを作成します。

    gcloud compute instances create mq-1 \
        --zone=us-central1-c \
        --machine-type=n1-standard-1 \
        --image-family=ubuntu-1604-lts \
        --image-project=ubuntu-os-cloud \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=mq-1 \
        --create-disk=mode=rw,size=10,type=projects/${DEVSHELL_PROJECT_ID}/zones/us-central1-c/diskTypes/pd-ssd,name=gluster-disk-1 \
        --tags=ibmmq \
        --metadata-from-file startup-script=mqstartup.sh
    
  4. 非マネージド インスタンス グループを作成して、このインスタンスを追加します。

    gcloud compute instance-groups unmanaged create mq-group-1 \
        --zone=us-central1-c
    
    gcloud compute instance-groups unmanaged add-instances mq-group-1 \
        --zone=us-central1-c \
        --instances=mq-1
    
  5. キュー マネージャー A のスタンバイ ノードにする Compute Engine インスタンスを作成します。

    gcloud compute instances create mq-2 \
        --zone=us-central1-b \
        --machine-type=n1-standard-1 \
        --image-family=ubuntu-1604-lts \
        --image-project=ubuntu-os-cloud \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=mq-2 \
        --create-disk=mode=rw,size=10,type=projects/${DEVSHELL_PROJECT_ID}/zones/us-central1-b/diskTypes/pd-ssd,name=gluster-disk-2 \
        --tags=ibmmq \
        --metadata-from-file startup-script=mqstartup.sh
    
  6. 非マネージド インスタンス グループを作成して、このインスタンスを追加します。

    gcloud compute instance-groups unmanaged create mq-group-2 \
        --zone=us-central1-b
    
    gcloud compute instance-groups unmanaged add-instances mq-group-2 \
        --zone=us-central1-b \
        --instances=mq-2
    
  7. キュー マネージャー B のプライマリ ノードにする Compute Engine インスタンスを作成します。

    gcloud compute instances create mq-3 \
        --zone=us-central1-a \
        --machine-type=n1-standard-1 \
        --image-family=ubuntu-1604-lts \
        --image-project=ubuntu-os-cloud \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=mq-3 \
        --create-disk=mode=rw,size=10,type=projects/${DEVSHELL_PROJECT_ID}/zones/us-central1-a/diskTypes/pd-ssd,name=gluster-disk-3 \
        --tags=ibmmq \
        --metadata-from-file startup-script=mqstartup.sh
    
  8. 非マネージド インスタンス グループを作成して、このインスタンスを追加します。

    gcloud compute instance-groups unmanaged create mq-group-3 \
        --zone=us-central1-a
    
    gcloud compute instance-groups unmanaged add-instances mq-group-3 \
        --zone=us-central1-a \
        --instances=mq-3
    
  9. キュー マネージャー B のスタンバイ ノードにする Compute Engine インスタンスを作成します。

    gcloud compute instances create mq-4 \
        --zone=us-central1-f \
        --machine-type=n1-standard-1 \
        --image-family=ubuntu-1604-lts \
        --image-project=ubuntu-os-cloud \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=mq-4 \
        --create-disk=mode=rw,size=10,type=projects/${DEVSHELL_PROJECT_ID}/zones/us-central1-f/diskTypes/pd-ssd,name=gluster-disk-4 \
        --tags=ibmmq \
        --metadata-from-file startup-script=mqstartup.sh
    
  10. 非マネージド インスタンス グループを作成して、このインスタンスを追加します。

    gcloud compute instance-groups unmanaged create mq-group-4 \
        --zone=us-central1-f
    
    gcloud compute instance-groups unmanaged add-instances mq-group-4 \
        --zone=us-central1-f \
        --instances=mq-4
    

ファイアウォール ルールを作成する

クラスタ内のノードの相互通信と、ロードバランサからのトラフィック受信を可能にするために、適切なファイアウォール ルールを作成する必要があります。

  1. クラスタのノード間のトラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create ibmmq-transport \
        --allow=tcp:1414 \
        --target-tags ibmmq \
        --source-tags ibmmq
    
  2. ヘルス チェッカーからキュー マネージャーへのトラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create fw-allow-health-checks \
        --allow=tcp:1414 \
        --target-tags ibmmq \
        --source-ranges 35.191.0.0/16,130.211.0.0/22
    

内部 TCP ロードバランサを設定する

次は、4 つのインスタンスをモニタリングする内部ロードバランサを作成します。このロードバランサで、4 つのインスタンスの中から 2 つの正常なプライマリ インスタンスを判別し、それらのインスタンスにトラフィックをルーティングします。

  1. ヘルスチェックを作成します。

    gcloud compute health-checks create tcp hc-tcp-1414 \
        --description="Health check: TCP 1414" \
        --check-interval=2s \
        --timeout=2s \
        --healthy-threshold=2 \
        --unhealthy-threshold=2 \
        --port=1414
    
  2. バックエンド サービスを作成します。

    gcloud compute backend-services create mqm-svc-a \
        --load-balancing-scheme internal \
        --region us-central1 \
        --health-checks hc-tcp-1414 \
        --protocol tcp
    
    gcloud compute backend-services create mqm-svc-b \
        --load-balancing-scheme internal \
        --region us-central1 \
        --health-checks hc-tcp-1414 \
        --protocol tcp
    
  3. バックエンド サービスに非マネージド インスタンス グループを追加します。

    gcloud compute backend-services add-backend mqm-svc-a \
        --instance-group mq-group-1 \
        --instance-group-zone us-central1-c \
        --region us-central1
    
    gcloud compute backend-services add-backend mqm-svc-a \
        --instance-group mq-group-2 \
        --instance-group-zone us-central1-b \
        --region us-central1
    
    gcloud compute backend-services add-backend mqm-svc-b \
        --instance-group mq-group-3 \
        --instance-group-zone us-central1-a \
        --region us-central1
    
    gcloud compute backend-services add-backend mqm-svc-b \
        --instance-group mq-group-4 \
        --instance-group-zone us-central1-f \
        --region us-central1
    
  4. 転送ルールを作成します。

    gcloud compute forwarding-rules create mqm-svc-a-forwarding-rule \
        --load-balancing-scheme internal \
        --ports 1414 --network default \
        --address 10.128.0.100 \
        --region us-central1 \
        --backend-service mqm-svc-a
    
    gcloud compute forwarding-rules create mqm-svc-b-forwarding-rule \
        --load-balancing-scheme internal \
        --ports 1414 \
        --network default \
        --address 10.128.0.101 \
        --region us-central1 \
        --backend-service mqm-svc-b
    

キュー マネージャー A の GlusterFS ボリュームを作成してマウントする

このチュートリアルでは、キュー マネージャーのノード間で共有するストレージとして、GlusterFS 分散ファイル システムを使用します。まず、mq-1 インスタンスと mq-2 インスタンスに GlusterFS をデプロイして、キュー マネージャー A の GlusterFS を設定します。

  1. mq-2 のプローブを行って、mq-1 上で GlusterFS の信頼できるプールを初期化します。

    gcloud compute ssh mq-1 \
        --zone=us-central1-c \
        --command='sudo mkdir -p /data/gv0 && sudo gluster peer probe mq-2' \
        -- -t
    
  2. mq-1 のプローブを行って、mq-2 上で GlusterFS の信頼できるプールを初期化します。

    gcloud compute ssh mq-2 \
        --zone=us-central1-b \
        --command='sudo mkdir -p /data/gv0 && sudo gluster peer probe mq-1' \
        -- -t
    
  3. GlusterFS レプリケーションを開始します。

    gcloud compute ssh mq-2 \
        --zone=us-central1-b \
        --command='sudo gluster volume create mq-data replica 2 mq-1:/data/gv0 mq-2:/data/gv0 && sudo gluster volume start mq-data' \
        -- -t
    
  4. 共有ボリュームを mq-2 にマウントします。

    gcloud compute ssh mq-2 \
        --zone=us-central1-b \
        --command='sudo mkdir -p /mnt/mqm_glusterfs && sudo mount -t glusterfs mq-1:/mq-data /mnt/mqm_glusterfs' \
        -- -t
    
  5. 共有ボリュームを mq-1 にマウントします。

    gcloud compute ssh mq-1 \
        --zone=us-central1-c \
        --command='sudo mkdir -p /mnt/mqm_glusterfs && sudo mount -t glusterfs mq-1:/mq-data /mnt/mqm_glusterfs' \
        -- -t
    
  6. 共有ボリュームのステータスを確認します。

    gcloud compute ssh mq-1 \
        --zone=us-central1-c \
        --command='sudo gluster volume info'
    

    ボリューム ID は異なりますが、出力は次のようになります。

    Volume Name: mq-data
    Type: Replicate
    Volume ID: ad63f6df-8469-4f30-9282-5a285d1a2b87
    Status: Started
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: mq-1:/data/gv0
    Brick2: mq-2:/data/gv0
    Options Reconfigured:
    performance.readdir-ahead: on
    

キュー マネージャー B の GlusterFS ボリュームを作成してマウントする

次に、mq-3 インスタンスと mq-4 インスタンスに GlusterFS をデプロイして、キュー マネージャー B の GlusterFS を設定します。

  1. mq-4 のプローブを行って、mq-3 上で GlusterFS の信頼できるプールを初期化します。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command='sudo mkdir -p /data/gv0 && sudo gluster peer probe mq-4' \
        -- -t
    
  2. mq-3 のプローブを行って、mq-4 上で GlusterFS の信頼できるプールを初期化します。

    gcloud compute ssh mq-4 \
        --zone=us-central1-f \
        --command='sudo mkdir -p /data/gv0 && sudo gluster peer probe mq-3' \
        -- -t
    
  3. GlusterFS レプリケーションを開始します。

    gcloud compute ssh mq-4 \
        --zone=us-central1-f \
        --command='sudo gluster volume create mq-data replica 2 mq-3:/data/gv0 mq-4:/data/gv0 && sudo gluster volume start mq-data' \
        -- -t
    
  4. 共有ボリュームを mq-4 にマウントします。

    gcloud compute ssh mq-4 \
        --zone=us-central1-f \
        --command='sudo mkdir -p /mnt/mqm_glusterfs && sudo mount -t glusterfs mq-3:/mq-data /mnt/mqm_glusterfs' \
        -- -t
    
  5. 共有ボリュームを mq-3 にマウントします。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command='sudo mkdir -p /mnt/mqm_glusterfs && sudo mount -t glusterfs mq-3:/mq-data /mnt/mqm_glusterfs' \
        -- -t
    
  6. 共有ボリュームのステータスを確認します。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command='sudo gluster volume info'
    

    ボリューム ID は異なりますが、出力は次のようになります。

    Volume Name: mq-data
    Type: Replicate
    Volume ID: ad63f6df-8469-4f30-9282-5a285d1a2b87
    Status: Started
    Number of Bricks: 1 x 2 = 2
    Transport-type: tcp
    Bricks:
    Brick1: mq-3:/data/gv0
    Brick2: mq-4:/data/gv0
    Options Reconfigured:
    performance.readdir-ahead: on
    

キュー マネージャー A を初期化する

mq-1 に対して一連のコマンドを実行して、キュー マネージャーの名前、共有ストレージ、送受信通信チャネル、認証、キュー マネージャー クラスタ内のもう一方のキュー マネージャーを定義します。

  1. Cloud Shell で、一時 MQ コンテナを mq-1 上で実行し、接続します。

    gcloud compute ssh mq-1 \
        --zone=us-central1-c \
        --command='sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=A --volume /mnt/mqm_glusterfs:/mnt/mqm --network host --name=ibmmq-init --rm=true  ibmcom/mq:latest ' \
       -- -t
    
  2. クラスタとキューの定義を入力します。

    mkdir -p /mnt/mqm/data
    chown mqm:mqm /mnt/mqm/data
    /opt/mqm/bin/crtmqdir -f -s
    su mqm -c "cp /etc/mqm/web/installations/Installation1/servers/mqweb/*.xml /var/mqm/web/installations/Installation1/servers/mqweb/"
    su mqm -c "crtmqm -q -p 1414 $MQ_QMGR_NAME"
    su mqm -c "strmqm -x"
    
  3. キュー マネージャー A を構成してクラスタ化します。

    echo "
    * Define the full repository for the cluster
    ALTER QMGR REPOS(GCP)
    
    * Define backstop rule for channel auth
    SET CHLAUTH('*') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(NOACCESS) DESCR('Back-stop rule - Blocks everyone') ACTION(REPLACE)
    
    * Clustering channels and listeners
    DEFINE LISTENER(A_LS) TRPTYPE(TCP) CONTROL(QMGR)
    
    DEFINE CHANNEL(GCP.A) CHLTYPE(CLUSRCVR) CONNAME('10.128.0.100') CLUSTER(GCP) REPLACE
    DEFINE CHANNEL(GCP.B) CHLTYPE(CLUSSDR) CONNAME('10.128.0.101') CLUSTER(GCP) REPLACE
    
    SET CHLAUTH('GCP.A') TYPE (QMGRMAP) QMNAME(B) USERSRC(CHANNEL) ADDRESS('*')" | runmqsc $MQ_QMGR_NAME
    
  4. アプリケーションのキュー、チャネル、認証を構成します。

    echo "
    * Application queues
    DEFINE QLOCAL('APP.QUEUE.1') DEFBIND(NOTFIXED) CLWLUSEQ(ANY) CLUSTER(GCP) REPLACE
    
    * Application topics
    DEFINE TOPIC('APP.BASE.TOPIC') TOPICSTR('app/') REPLACE
    
    * Application connection authentication
    DEFINE AUTHINFO('APP.AUTHINFO') AUTHTYPE(IDPWOS) CHCKCLNT(REQDADM) CHCKLOCL(OPTIONAL) ADOPTCTX(YES) REPLACE
    ALTER QMGR CONNAUTH('APP.AUTHINFO')
    REFRESH SECURITY(*) TYPE(CONNAUTH)
    
    * Application channels
    DEFINE CHANNEL('APP.SVRCONN') CHLTYPE(SVRCONN) MCAUSER('app') REPLACE
    SET CHLAUTH('APP.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) CHCKCLNT(REQUIRED) DESCR('Allows connection via APP channel') ACTION(REPLACE)
    
    * Application auth records
    SET AUTHREC GROUP('mqclient') OBJTYPE(QMGR) AUTHADD(CONNECT,INQ)
    SET AUTHREC PROFILE('APP.**') GROUP('mqclient') OBJTYPE(QUEUE) AUTHADD(BROWSE,GET,INQ,PUT)
    SET AUTHREC PROFILE('APP.**') GROUP('mqclient') OBJTYPE(TOPIC) AUTHADD(PUB,SUB)" | runmqsc $MQ_QMGR_NAME
    
    exit
    

キュー マネージャー B を初期化する

mq-3 に対しても同様の一連のコマンドを実行して、2 つ目のキュー マネージャーに同じ情報(キュー マネージャーの名前、共有ストレージ、送受信通信チャネル、認証、キュー マネージャー クラスタ内のもう一方のキュー マネージャー)を定義します。

  1. Cloud Shell で、一時 MQ コンテナを mq-3 上で実行し、接続します。

    gcloud compute ssh  mq-3 \
        --zone=us-central1-a \
        --command='sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=B --volume /mnt/mqm_glusterfs:/mnt/mqm --network host --name=ibmmq-init --rm=true ibmcom/mq:latest' \
        -- -t
    
  2. クラスタとキューの定義を入力します(ここでは、キュー マネージャー A に対して実行した手順のステップ 2 からステップ 4 を統合しています)。

    mkdir -p /mnt/mqm/data
    chown mqm:mqm /mnt/mqm/data
    /opt/mqm/bin/crtmqdir -f -s
    su mqm -c "cp /etc/mqm/web/installations/Installation1/servers/mqweb/*.xml /var/mqm/web/installations/Installation1/servers/mqweb/"
    su mqm -c "crtmqm -q -p 1414 $MQ_QMGR_NAME"
    su mqm -c "strmqm -x"
    
    echo "
    * Define the full repository for the cluster
    ALTER QMGR REPOS(GCP)
    
    * Define backstop rule for channel auth
    SET CHLAUTH('*') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(NOACCESS) DESCR('Back-stop rule - Blocks everyone') ACTION(REPLACE)
    
    * Clustering channels and listeners
    DEFINE LISTENER(B_LS) TRPTYPE(TCP) CONTROL(QMGR)
    
    DEFINE CHANNEL(GCP.B) CHLTYPE(CLUSRCVR) CONNAME('10.128.0.101') CLUSTER(GCP) REPLACE
    DEFINE CHANNEL(GCP.A) CHLTYPE(CLUSSDR) CONNAME('10.128.0.100') CLUSTER(GCP) REPLACE
    
    SET CHLAUTH('GCP.B') TYPE (QMGRMAP) QMNAME(A) USERSRC(CHANNEL) ADDRESS('*')
    
    * Application queues
    DEFINE QLOCAL('APP.QUEUE.1') DEFBIND(NOTFIXED) CLWLUSEQ(ANY) CLUSTER(GCP) REPLACE
    
    * Application topics
    DEFINE TOPIC('APP.BASE.TOPIC') TOPICSTR('app/') REPLACE
    
    * Application connection authentication
    DEFINE AUTHINFO('APP.AUTHINFO') AUTHTYPE(IDPWOS) CHCKCLNT(REQDADM) CHCKLOCL(OPTIONAL) ADOPTCTX(YES) REPLACE
    ALTER QMGR CONNAUTH('APP.AUTHINFO')
    REFRESH SECURITY(*) TYPE(CONNAUTH)
    
    * Application channels
    DEFINE CHANNEL('APP.SVRCONN') CHLTYPE(SVRCONN) MCAUSER('app') REPLACE
    SET CHLAUTH('APP.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL) CHCKCLNT(REQUIRED) DESCR('Allows connection via APP channel') ACTION(REPLACE)
    
    * Application auth records
    SET AUTHREC GROUP('mqclient') OBJTYPE(QMGR) AUTHADD(CONNECT,INQ)
    SET AUTHREC PROFILE('APP.**') GROUP('mqclient') OBJTYPE(QUEUE) AUTHADD(BROWSE,GET,INQ,PUT)
    SET AUTHREC PROFILE('APP.**') GROUP('mqclient') OBJTYPE(TOPIC) AUTHADD(PUB,SUB)" | runmqsc $MQ_QMGR_NAME
    
    exit
    

IBM MQ を HA モードで起動する

キュー マネージャーが初期化されたら、IBM MQ クラスタを起動できます。

  1. Cloud Shell で、mq-1 上のキュー マネージャー A を起動します。

    gcloud compute ssh  mq-1  \
        --zone=us-central1-c \
        --command="sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=A  --volume /mnt/mqm_glusterfs:/mnt/mqm --publish 1414:1414 --network host --name=ibmmq-node --rm=true -d ibmcom/mq:latest -c 'echo app:APPPass1! | chpasswd && su mqm -c \"strmqm -x\"; tail -f /dev/null'"
    

    このチュートリアルでは、このコマンドでユーザーアプリのパスワードとして AppPass1! を設定しています。

  2. mq-2 上のキュー マネージャー A を起動します。

    gcloud compute ssh  mq-2  \
        --zone=us-central1-b \
        --command="sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=A --volume /mnt/mqm_glusterfs:/mnt/mqm --publish 1414:1414 --network host --name=ibmmq-node --rm=true -d ibmcom/mq:latest -c 'echo app:APPPass1! | chpasswd && su mqm -c \"strmqm -x\"; tail -f /dev/null'"
    

    このコマンドで、ユーザーアプリのパスワードとして AppPass1! を設定します。

  3. ロードバランサのステータスを確認するには、Cloud Console の [負荷分散] ページに移動します。

    [負荷分散] ページを開く

  4. リストから、ロードバランサ [mqm-svc-a] を選択します。

    mq-group1 と mq-group2 が表示されたコンソールのロードバランサのページ

    ロードバランサ mqm-svc-a で正常なインスタンス グループの存在が表示されている場合は(上のスクリーンショットを参照)、次のステップに進めます。

  5. Cloud Shell で、mq-3 上のキュー マネージャー B を起動します。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command="sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=B --volume /mnt/mqm_glusterfs:/mnt/mqm --publish 1414:1414 --network host --name=ibmmq-node --rm=true -d ibmcom/mq:latest -c 'echo app:APPPass1! | chpasswd && su mqm -c \"strmqm -x\"; tail -f /dev/null'"
    
  6. mq-4 上のキュー マネージャー B を起動します。

    gcloud compute ssh mq-4 \
        --zone=us-central1-f \
        --command="sudo docker run -it --entrypoint=/bin/bash --env LICENSE=accept --env MQ_QMGR_NAME=B --volume /mnt/mqm_glusterfs:/mnt/mqm --publish 1414:1414 --network host --name=ibmmq-node --rm=true -d ibmcom/mq:latest -c 'echo app:APPPass1! | chpasswd && su mqm -c \"strmqm -x\"; tail -f /dev/null'"
    

クラスタを確認する

デプロイをテストする前に、キュー マネージャー A とキュー マネージャー B が正常に通信できることを確認する必要があります。

  1. Cloud Shell で、mq-3 上の IBM MQ コンテナに接続します。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command="sudo docker exec -it ibmmq-node /bin/bash" \
        -- -t
    
  2. クラスタ通信チャネルのステータスを確認します。

    echo "DISPLAY CHSTATUS(*)" | runmqsc $MQ_QMGR_NAME && exit
    

    すべてが正常に機能している場合、出力は次のようになります。

    5724-H72 (C) Copyright IBM Corp. 1994, 2018.
    Starting MQSC for queue manager B.
    
         1 : display chstatus(*)
    AMQ8417I: Display Channel Status details.
       CHANNEL(GCP.B)                          CHLTYPE(CLUSRCVR)
       CONNAME(10.128.0.2)                     CURRENT
       RQMNAME(A)                              STATUS(RUNNING)
       SUBSTATE(RECEIVE)
    AMQ8417I: Display Channel Status details.
       CHANNEL(GCP.A)                          CHLTYPE(CLUSSDR)
       CONNAME(10.128.0.100(1414))             CURRENT
       RQMNAME(A)                              STATUS(RUNNING)
       SUBSTATE(MQGET)           XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
    One MQSC command read.
    No commands have a syntax error.
    All valid MQSC commands were processed.
    

クラスタにメッセージを送信する

次は、クラスタをテストするために、IBM が Docker イメージで提供しているサンプル アプリケーションを使用して、APP.QUEUE.1 という名前のキューに 2 つのメッセージを送信します。

テスト メッセージをキュー マネージャー B に送信する

  1. Cloud Shell で、mq-3 上の IBM MQ コンテナに接続します。

    gcloud compute ssh mq-3 \
        --zone=us-central1-a \
        --command="sudo docker exec -it ibmmq-node /bin/bash" \
        -- -t
    
  2. ターミナル シェルで、キュー マネージャー B を接続先とするメッセージ送信側アプリケーションを起動します。

    MQSAMP_USER_ID=app /opt/mqm/samp/bin/amqsput APP.QUEUE.1 B
    
  3. パスワードの入力を求められたら、前に作成したアプリのパスワード(このチュートリアルでは APPPass1!)を入力して認証を行います。

  4. target queue is APP.QUEUE.1」と表示されたら、「abcdef」と入力してテスト メッセージをキューに送信します。

  5. 123456」と入力した別のテスト メッセージを送信します。

  6. Enter キーを押して、メッセージ送信側アプリケーションを終了します。

    出力は次のようになります。

    Sample AMQSPUT0 start
    Enter password: *********
    target queue is APP.QUEUE.1
    abcdef
    123456
    
    Sample AMQSPUT0 end
    
  7. キュー マネージャー B 内に、処理中のメッセージが 1 つあることを確認します。

    echo "display qstatus(APP.QUEUE.1)" | runmqsc $MQ_QMGR_NAME | grep CURDEPTH
    

    処理中のメッセージが 1 つしかない理由は、後述するように、IBM MQ の負荷分散機能により、もう一方のメッセージがキュー マネージャー A にルーティングされたためです。

  8. SSH 接続を閉じます。

    exit
    

    次の出力が表示されます。

    CURDEPTH(1)                             IPPROCS(0)
    

    前のステップでは 2 つのメッセージを送信しましたが、キュー マネージャー B 内には処理中のメッセージが 1 つしかありません。これは、IBM MQ がキュー マネージャーの間でメッセージの負荷を分散し、2 つ目のメッセージをキュー マネージャー A に送信したためです。

キュー マネージャー A 内で処理中のメッセージを確認する

  1. Cloud Shell で、mq-1 上の IBM MQ コンテナに接続します。

    gcloud compute ssh mq-1 \
        --zone=us-central1-c \
        --command="sudo docker exec -it ibmmq-node /bin/bash" \
        -- -t
    
  2. ターミナル ウィンドウで、キュー マネージャー A に処理中のメッセージが 1 つあることを確認します。

    echo "display qstatus(APP.QUEUE.1)" | runmqsc $MQ_QMGR_NAME | grep CURDEPTH
    

    次の出力が表示されます。

    CURDEPTH(1)                             IPPROCS(0)
    

キュー マネージャーの高可用性をテストする

インスタンス mq-3 をシャットダウンして、mq-4 がキュー マネージャー B のプライマリ インスタンスになることを確認します。

  1. Cloud Shell で、インスタンス mq-3 を停止します。

    gcloud compute instances stop mq-3 \
        --zone=us-central1-a
    
  2. mq-4 がプライマリ インスタンスになったことを確認するために、ロードバランサの観点からこのインスタンスが正常な状態であるか検査します。

    gcloud compute backend-services get-health mqm-svc-b \
        --region=us-central1
    

    次のような出力が表示されます。

    backend: https://www.googleapis.com/compute/v1/projects/ibmmq1/zones/us-central1-a/instanceGroups/mq-group-3
    status:
          kind: compute#backendServiceGroupHealth---backend: https://www.googleapis.com/compute/v1/projects/ibmmq1/zones/us-central1-f/instanceGroups/mq-group-4
    status:
          healthStatus:
        - healthState: HEALTHY
        instance: https://www.googleapis.com/compute/v1/projects/ibmmq1/zones/us-central1-f/instances/mq-4
        ipAddress: 10.128.0.5
        port: 80
        kind: compute#backendServiceGroupHealth
    

本番環境への移行

このチュートリアルでは IBM MQ Advanced for Developers を使用しました。本番環境に移行する前に、他にも使用できる一連のライセンスと機能セットを確認してください。また、本番環境にデプロイする前に、IBM MQ をコンテナ内で実行する方法に関する IBM のドキュメントの確認も必要です。

クリーンアップ

チュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして、割り当てを使い果たしたり、今後料金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ