AWS上のLifeKeeper for Linux とJP1を連携させてみた

環境イメージ

前回は、AWS上のLifeKeeper for Linux(以降、LifeKeeperと記載)とHULFTを連携させて、リソース階層に登録された三つのリソースがフェールオーバーされることを確認しました。

これらは専用のRecovery Kitを導入してGUIでリソース階層までを作成しましたが、今回は専用スクリプトを用いて、JP1を冗長化したいと思います。

>前回から読む

 具体的には、JP1/Base(以降、Baseと記載)、JP1/AJS(以降、AJSと記載)を各インスタンスに導入し、共有ファイルシステム配下を指定した論理ホストを作成します。

その後、Base・AJSの制御スクリプトをLifeKeeperへ登録し、手動でリソース階層を設定する流れとなります。なお、AJSは導入サーバーのホスト名を32バイト以内とする制限事項があり、AWSのデフォルトで付与されるホスト名だと制限に触れることから、インスタンスを作り直しホスト名を変更しています。

インフラ環境について

今回は「AWS上にLifeKeeper for Linux を導入してみた」にホスト名変更の手順を加えて、環境を構築しています。基本的な環境の詳細については、以下の記事をご確認ください。

AWS上のインスタンスのホスト名変更については、以下をご確認ください。

また、実際にサービス提供環境などにJP1 Recovery Kitを導入する際は、同梱されている管理ガイドを参照して構築するようにしてください。

環境設定

BaseとAJSの設定は以下となります。

  項目     設定内容  
  Baseバージョン     JP1/Base 11-10  
  AJSバージョン  

  JP1/Automatic Job Management System 3 
  11-10-01

  認証サーバー   論理ホスト
  論理ホスト   仮想IPアドレスと関連付けた任意のホスト名
  論理ホスト情報格納ディレクトリ   /data配下

 

構成イメージ

環境イメージは以下となります。
Clustering subnet A/Bで起動した各インスタンスに導入したBase・AJSは論理ホストにて起動し、環境設定ファイルの格納領域(ディレクトリ)は”/data/jp1base/”もしくは、”/data/jp1ajs2/”となります。
 “/data”配下はLifeKeeperのData Replication機能を利用した共有ファイルシステムとなっており、LifeKeeperがリソース階層(①~⑤)として依存関係が構成されています。

環境イメージ

フェールオーバー時の挙動は、リソース階層の下から切り替わりが発生します。
セカンダリ側でData Replicationのプライマリ昇格、”/data”へのマウント、仮想IPの付け替え、Baseプロセス(論理ホスト)、AJSプロセス(論理ホスト)の順番で起動します。

なお、論理ホストの環境設定ファイルが共有ファイルシステム領域に格納されていることから、Base・AJSはセカンダリ・プライマリの区別無く、同じ環境設定で起動します。

フェールオーバー時の挙動

操作の流れ

以下の流れで導入を行います。

■導入してみた
 Base・AJSを導入してみました。

■連携させてみた
 LifeKeeperとBase・AJSを連携させてみました。

■検証してみた
 擬似的に障害を発生させ、フェールオーバーを確認してみました。

導入してみた

環境の構築が完了しましたので、Base・AJSを導入します。

※コマンドラインのプロンプトは「$」がログインユーザーとなり、「#」がrootユーザーとなります。rootユーザーへのスイッチは”su -”で変更してください。

  1.  Base・AJSの制限に触れないロケールに変更します。
    今回は日本語のUTF-8を指定します。
      # localectl set-locale LANG=ja_JP.utf8  
  2.  必須パッケージの導入
    RHEL7にBaseを導入するために必要なパッケージを適用します。
    ※必須パッケージについてはBaseのリリースノートをご確認ください。
  3.  JP1のイメージファイルのアップロード
    ログインユーザーのホームディレクトリ”/home/ec2-user”へアップロードします。
  4.  イメージファイルのマウント
      # mount -o loop -t iso9660 /home/ec2-user/JP1AJS_1110L_P1.iso /media

    ※イメージファイルのマウント時に以下のメッセージが出力されますが、無視して問題ありません。
         mount: /dev/loop0 is write-protected, mounting read-only

  5.  インストーラーの起動
      # cd /media/linux
      # ./setup /media
  6.  インストールの選択
    キーボードの「i」を押下します。
    6. インストールの選択 キーボードの「i」を押下します
  7.  Baseの導入
    P-812C-6LBLを選択し、以降はウィザードに従って導入します。
  8.  AJSの導入
    P-CC8112-4KBLを選択し、以降はウィザードに従って導入します。
  9.  rootの環境変数への追記
    BaseとAJSのコマンド等のPATHを登録します。
      # vi /root/.bash_profile
         PATH=$PATH:/opt/jp1base/bin/
         PATH=$PATH:/etc/opt/jp1base/
         PATH=$PATH:/opt/jp1ajs2/bin/
         PATH=$PATH:/etc/opt/jp1ajs2/

    ※追記した環境変数を有効にするため、一度rootアカウントを入りなおしてください。

  10.  認証サーバーの変更
      # jbssetusrsrv <論理ホスト名>
      ※”/etc/hosts”に記載した論理ホスト名を指定してください。
  11.  イベントサーバーの設定
      # vi /etc/opt/jp1base/conf/event/servers/default/conf
       <jp1hosts2> jp1imevt jp1imevtapi
        ↓    ※書き換える
      <自ホスト名>
      —
      options remote-receive v5-unused save-rep
        ↓ ※書き換える
      options sync remote-receive v5-unused save-rep
  12.  物理ホストでの認証サーバー起動抑止
      # cp -p /etc/opt/jp1base/conf/jp1bs_spmd.conf.model /etc/opt/jp1base/conf/jp1bs_spmd.conf
  13.  論理ホスト環境ファイルの格納ディレクトリの作成(プライマリインスタンス)
      # mkdir –p /data/jp1base/conf/
      # mkdir –p /data/jp1base/log/
      # mkdir –p /data/event/
  14.  Baseの論理ホストの作成(プライマリインスタンス)
      # jp1base_setup_cluster –h <論理ホスト名> -d /data –a <論理ホスト名> -s
  15.  AJSの論理ホストの作成(プライマリインスタンス)
      # jajs_setup_cluster -h <論理ホスト名> -F AJSROOT2 -d /data -m hot -P 22221 -I _JF1 -M s
  16.  ジョブ実行環境の作成(プライマリインスタンス)
      # jpqimport -dt isam -ci /data/jp1ajs2/conf/jpqsetup.conf -mh <論理ホスト名>
  17.  キューレスジョブのセットアップ(プライマリインスタンス)
      # jsqlsetup -h <論理ホスト名> -F AJSROOT2
  18.  環境設定の抽出(プライマリインスタンス)
      # jbsgetcnf -h <論理ホスト名> > /tmp/jp1_setup.conf
  19.  セカンダリインスタンスへ環境設定ファイルの転送(プライマリインスタンス)
      # cd /home/ec2-user/
      # scp –i <キーペア名> /tmp/jp1_setup.conf ec2-user@<プライマリインスタンスのプライマリプライベートIP>
  20.  環境設定の読み込み(セカンダリインスタンス)
      # jbssetcnf /tmp/jp1_setup.conf
  21.  Baseの論理ホストの作成(セカンダリインスタンス)
      # jp1base_setup_cluster –h <論理ホスト名>
  22.  AJSの論理ホストの作成(セカンダリインスタンス)
      # jajs_setup_cluster –h <論理ホスト名> -F AJSROOT2
  23.  キューレスジョブのセットアップ(セカンダリインスタンス)
      # ajsqlsetup -h <論理ホスト名> -F AJSROOT2 -nc
  24. 起動スクリプトの編集
    以下のコメント(:#)を削除します。
      # vi /opt/jp1ajs2/bin/jajs_start.cluster
              52  : # /opt/jp1ajs2/bin/ajsqlstart >/dev/null 2>/dev/null
              67  : # /opt/jp1ajs2/bin/ajsqlattach -h $JP1_HOSTNAME
              70  : # exit 1
              143   : # /opt/jp1ajs2/bin/ajsqldetach -h $JP1_HOSTNAME –k

    ※左の数字は行番号になります。
    ※行番号が出力されていない場合は、コマンドモードで以下のコマンドを実行してください。
        :set number

  25.  停止スクリプトの編集
      # vi /opt/jp1ajs2/bin/bin/jajs_stop.cluster
              100 : # /opt/jp1ajs2/bin/ajsqldetach -h $JP1_HOSTNAME –k
              103 : # ExitCord=1
              104 : # exit $ExitCord
              108 : # /opt/jp1ajs2/bin/ajsqlstop –c

    ※左の数字は行番号になります。
    ※行番号が出力されていない場合は、コマンドモードで以下のコマンドを実行してください。
        :set number

  26.  各インスタンスの再起動
    各インスタンスを再起動します。
      # reboot

連携させてみた

BaseとAJSの導入が完了したので、続いてLifeKeeperとの連携を行います。

  1.  イメージファイルのマウント
      # mount -o loop -t iso9660 /home/ec2-user/JP1_AJS3_MGR.iso /media

    ※イメージファイルのマウント時に以下のメッセージが出力されますが、無視して問題ありません。
        mount: /dev/loop0 is write-protected, mounting read-only

  2.  Base・AJSのRecovery Kitパッケージのアーカイブをコピー
      # cp –p /media/ Generic_ARK_for_JP1* /opt/LifeKeeper/share/
  3.  アーカイブの展開とディレクトリ名の変更
      # cd /opt/LifeKeeper/share/
      # tar xvf Generic_ARK_for_JP1_Base.tgz
      # tar xvf Generic_ARK_for_JP1_AJS3_Manager.tgz
      # rm –rf ./ Generic_ARK_for_JP1*
      # mv Generic_ARK_for_JP1_Base JP1_Base
      # mv Generic_ARK_for_JP1_AJS3_Manager JP1_AJS3
  4.  Baseのスクリプトの編集
    制御用スクリプトの論理ホスト変数を、実際の論理ホスト名に書き換えます。
    以下のファイル名を変更してquickCheck、recover、remove、restoreの四つのスクリプトに対して行います。
      # vi quickCheck
      VHOSTNAME=” VHOSTNAME”
        ↓   ※書き換える
      VHOSTNAME=”<論理ホスト名>”
  5.  AJSのスクリプトの編集
    Baseのスクリプトと同じように、四つのスクリプトの論理ホスト変数を書き換えます。
  6.  LifeKeeperGUIの起動
    プライマリインスタンスにてLifeKeeperGUIを起動します。
      # lkGUIapp
  7.  ログイン
    インスタンスのrootユーザーでログインします。
  8.  Baseの設定
    以下のボタンを押下して、Baseのリソースを作成します。
    ボタン

    必要な情報は以下となります。

      項目

      入力/選択する値  

      備考 
      Please Select Recovery Kit   Generic Application  
      Switchback Type   Intelligent  
      Server   プライマリインスタンスのホスト名  
      Restore Script   /opt/LifeKeeper/share/JP1_Base/restore  
      Remove Script   /opt/LifeKeeper/share/JP1_Base/remove  
      QuickCheck Script   /opt/LifeKeeper/share/JP1_Base/quickCheck  
      Local Recovery Script   /opt/LifeKeeper/share/JP1_Base/recover  
      Application Info   論理ホスト名  
      Bring Resource In Service   Yes  
      Resource Tag   lkjp1_base   スクリプト内のAPP変数に設定されている値
      Target Server   セカンダリインスタンスのホスト名  
      Switchback Type   intelligent  
      Template Priority   1  
      Target Priority   10  
      Resource Tag   lkjp1_base   スクリプト内のAPP変数に設定されている値
      Application Info   論理ホスト名  
  9.  AJSの設定
    以下のボタンを押下して、AJSのリソースを作成します。
    ボタン

    必要な情報は以下となります。

      項目

      入力/選択する値

      備考 
      Please Select Recovery Kit   Generic Application  
      Switchback Type   Intelligent  
      Server   プライマリインスタンスのホスト名  
      Restore Script   /opt/LifeKeeper/share/JP1_AJS3/restore  
      Remove Script   /opt/LifeKeeper/share/JP1_AJS3/remove  
      QuickCheck Script   /opt/LifeKeeper/share/JP1_AJS3/quickCheck  
      Local Recovery Script   /opt/LifeKeeper/share/JP1_AJS3/recover  
      Application Info   論理ホスト名  
      Bring Resource In Service   Yes  
      Resource Tag   lkjp1_ajsmgr   スクリプト内のAPP変数に設定されている値
      Target Server   セカンダリインスタンスのホスト名  
      Switchback Type   intelligent  
      Template Priority   1  
      Target Priority   10  
      Resource Tag   lkjp1_ajsmgr   スクリプト内のAPP変数に設定されている値
      Application Info   論理ホスト名  
  10.  依存関係の設定
    リソースを作成しただけですと、各リソースが別々に動作してしまうため、依存関係の設定を行います。
    以下のボタンを押下して、依存関係を設定します。
    bottun_izon

    なお、二つのリソースに対して依存関係を設定するため、以下の順番で三回操作します。
    必要な情報は以下となります。

    (一回目)

      項目     入力/選択する値     備考  
      Server   プライマリインスタンスのホスト名  
      Parent Resource Tag   lkjp1-ajsmgr  
      Child Resource Tag   lkjp1-base  

    (二回目)

      項目     入力/選択する値     備考  
      Server   プライマリインスタンスのホスト名  
      Parent Resource Tag   lkjp1-base  
      Child Resource Tag   仮想IPリソース  仮想IPのリソースタグ名を指定します

    (三回目)

      項目     入力/選択する値     備考  
      Server   プライマリインスタンスのホスト名  
      Parent Resource Tag   仮想IPリソース   仮想IPのリソースタグ名を指定します
      Child Resource Tag   /data/  データレプリケーションのリソースタグ名を指定します。
  11.  リソース階層の完成
    ここまで行えば、以下の状態となります。
    これでBase・AJSリソースの作成が完了しました。
    左ペインの「lkjp1-ajsmgr」配下に五つのリソースが階層として登録されています。
    lkjp1-ajsmgr」配下に五つのリソースが階層として登録される

検証してみた

  LifeKeeperとJP1の連携が完了しましたので、最後に実際に動作(フェールオーバー)するか確認してみます。今回もElastic IPが一つしかないことから、セカンダリインスタンスからログインして検証してみます。

  1.  Elastic IPをセカンダリインスタンスに関連付ける
    AWS Management ConsoleにてElastic IPをセカンダリインスタンスに関連付けます。
  2.  LifeKeeperGUIの起動
    セカンダリインスタンスへログインしたら、LifeKeeperGUIを起動します。
      # lkGUIapp
  3.  LifeKeeperの状態確認
    LifeKeeperGUIへログインします。
    LifeKeeperGUIへログイン
  4.  各リソースに登録されているプロセス(Base・AJS)の起動状況を確認
    セカンダリインスタンスにて以下のコマンドを実行して各プロセスが起動していないことを確認します。
      $ ps –ef | grep jbs
      $ ps –ef | grep ajs
  5.  プライマリインスタンスへログイン
    セカンダリインスタンスにて以下のコマンドを実行して、プライマリインスタンスへログインします。
      $ ssh –i <キーペア名> ec2-user@<プライマリインスタンスのプライマリプライベートIP>
  6.  プライマリインスタンスで擬似的に障害を発生させる
    プライマリインスタンスのNICを落とすことで、擬似的に障害を発生させます。
    プライマリインスタンスで以下のコマンドを実行します。
      # service network stop
        ※ifdownコマンドでも問題ありません。
  7.  LifeKeeperGUIを確認してみる
    プライマリインスタンスにてコマンドを実行後、暫くすると以下の表示になりました。
    右側で表示されていたAct表示が、左に移動しています。

    また、プライマリインスタンスが異常となったため、左ペインやインスタンスの画像に 下記の注意マークがついています。
    注意マーク

    7. LifeKeeperGUIを確認

  8.  各リソースに登録されているプロセス(Base・AJS)の起動状況を確認
    もう一度、セカンダリインスタンスにて以下のコマンドを実行します。
      $ ps –ef | grep jbs
      $ ps –ef | grep ajs

今回はBase・AJSともにプロセス数が多すぎるため、記事には記載しませんが、各プロセスが起動していることが確認できます。これで正常にフェールオーバーがされていることが確認できました。

※NICを落としたプライマリインスタンスはAWS Management Console から、インスタンスの再起動処理を行えば、アクセスできるようになります。

まとめてみた

今回はLifeKeeperとJP1を連携させてみました。

今まで構築してきたアプリケーションの冗長化と違うところは、Generic Applicationを使用してリソースを作成すること、また自動で行われていたリソース階層の設定を手動で行うこととなります。

今回は専用のRecovery Kitとしてのスクリプトを使用しましたが、Generic Applicationは任意のアプリケーションに対して、「起動」「停止」を制御するスクリプトを作成すれば使用できます。更にスクリプトを登録したリソースに対して、他リソースとの依存関係を設定することができるため、今回のように先に共有ファイルシステムをマウントしてから、アプリケーションを起動するような動作も行えます。

つまり専用のRecovery Kitが無くとも、自作のスクリプトを使用してLifeKeeperでアプリケーションを制御することができるということです。

これにより、各リソースの依存関係など検討する点はあるものの、基本的にはスクリプトを作成し共有ファイルシステムの設定ができれば、あらゆるアプリケーションはLifeKeeperによる冗長化が可能ということになります。

また、今回のシリーズのようにAWSを使用してインフラ環境を構築してしまえば、面倒なオンプレミス環境の設計や構築も無く、可用性も一定以上を実現できます。

LifeKeeperは評価版があり、AWSは無料枠もありますので、このシリーズ記事をお読みの皆様も一度、構築されてはいかがでしょうか。

>>JP1のクラスタ構成による可用性の向上パターンはこちら

LifeKeeperによるJP1のクラスター構成ガイドはこちら

 
  ご注意
  当記事の内容は、弊社が独自に実施した検証結果に基づいたものです。
  JP1のサポート対象となる稼働環境(クラウド環境、データミラー構成の可否、等)に関しては以下Webサイトをご参照の上、具体的なご要望に関しては日立製作所様又はJP1の販売会社様へご相談下さい。

 

LifeKeeperとJP1の評価キット 

また、JP1とLifeKeeperをAWS上で冗長化するための評価キットを、日立製作所様のサイトにて提供しております。ハンズオントレーニングで使った詳細な手順書がついておりますので、JP1案件の構成検証などにぜひお役立てください。

手順書目次

  1. AWSで仮想環境作成
  2. LifeKeeper導入/設定
  3. DataKeeper導入と設定
  4. リソース作成
  5. Transit Gateway設定
  6. JP1導入と設定
  7. 動作確認