ページの先頭行へ戻る
PRIMECLUSTER 導入運用手引書 4.3

H.3.5 グローバルゾーン上のクラスタアプリケーション再設定

グローバルゾーン上に各ノングローバルゾーンに対応するクラスタアプリケーションを構築します。本節の作業は各ノングローバルゾーンに対して実施してください。

5-1. 作業用クラスタアプリケーションの削除

RMSを停止し、“手順2-5. 作業用クラスタアプリケーションの作成”で作成した作業用クラスタアプリケーションを削除します。クラスタアプリケーションを削除する際、リソースの削除は実施しないでください。

5-2. ノングローバルゾーン制御用Cmdlineリソースの作成

ノングローバルゾーン、およびノングローバルゾーンに構成したクラスタアプリケーションをグローバルゾーンから制御するためのCmdlineリソースを作成します。

5-3. 共有IP制御用Cmdlineリソースの作成

共有IPゾーンのノングローバルゾーンを使用し、かつ、サーバ間でノングローバルゾーンのイメージを共有しない場合、グローバルゾーンで引継ぎIPアドレスのためのリソースを作成します。

  1. Cmdlineリソースを使用する全てのノードに対して、以下の例のようにスクリプトファイルを作成します。/var/tmp/PCL/rmstoolsディレクトリが存在しない場合は、ディレクトリを作成してください。

    • hvzonelip.shスクリプトファイルの作成(GLSのNIC切替方式で使用する場合、または、GLSを使用しない場合)

      # vi /var/tmp/PCL/rmstools/hvzonelip.sh
      (以下のhvzonelip.shスクリプトファイルの内容を貼り付ける) # chmod +x /var/tmp/PCL/rmstools/hvzonelip.sh
    • hvzonelifrsc.shスクリプトファイルの作成(GLSの高速切替方式、GS/SURE連携方式で使用する場合)

      # vi /var/tmp/PCL/rmstools/hvzonelifrsc.sh
      (以下のhvzonelifrsc.shスクリプトファイルの内容を貼り付ける) # chmod +x /var/tmp/PCL/rmstools/hvzonelifrsc.sh
    • hvzonelip.shスクリプトファイルの内容(GLSのNIC切替方式で使用する場合、または、GLSを使用しない場合)

      #!/bin/sh
      #
      # hvzonelip.sh 1.0
      #
      
      LIP=""
      IFLIST=""
      ZONENAME=""
      ZONEWAIT=""
      
      #--------------------------------------------------
      # Add Logical IP
      #--------------------------------------------------
      
      TAG=`/usr/bin/basename $0`
      CONFFILE=$2
      RSCNAME=${HV_NODENAME:-Unknown}
      PHASE=${HV_INTENDED_STATE:-Unknown}
      
      Start()
      {
          IFATTR="netmask + broadcast + -trailers"
          IFCFG_RETRY_CNT=4
      
          for PIF in $IFLIST
          do
              /usr/sbin/ifconfig $PIF 2>/dev/null | /bin/grep "UP," >/dev/null 2>&1
              if [ $? -eq 0 ]
              then
                  break
              fi
          done
      
          CheckIp $PIF $LIP $ZONENAME
          if [ $? != 0 ]
          then
              Pmsg INFO "ip address has already been assigned. if=$CHKIF LIP=$LIP ZONENAME=$ZONENAME"
              return 0 
          fi
      
          RET=1
          CNT=0
          while [ $RET -ne 0 ] && [ $CNT -le $IFCFG_RETRY_CNT ]
          do
              CNT=`/usr/bin/expr $CNT + 1`
              CMD="/usr/sbin/ifconfig $PIF addif $LIP $IFATTR up zone $ZONENAME"
              Pmsg TRACE "$CMD"
              $CMD
              RET=$?
              Pmsg TRACE "exitcode = $RET"
          done
      
          if [ $RET -ne 0 ]
          then
              Pmsg ERROR "ifconfig failed. cmd=$CMD"
          fi
      
          return $RET
      }
      
      CheckIp()
      {
          CHKPIF=$1
          CHKLIP=$2
          CHKZONE=$3
          CHKIF=
      
          CHKIFCAU=`/usr/sbin/ifconfig -a4u 2>/dev/null`
          echo "$CHKIFCAU" | /bin/grep "inet $CHKLIP " >/dev/null 2>&1
          if [ $? != 0 ]
          then
              return 0
          fi
      
          CHKIFLIST=`echo "$CHKIFCAU" | /bin/grep "^$CHKPIF:[0-9]*: " | /usr/bin/sed -e "s/: .*//"`
          for CHKIF in $CHKIFLIST
          do
              CHKIFC=`/usr/sbin/ifconfig $CHKIF 2>/dev/null`
              echo "$CHKIFC" | /bin/grep "inet $CHKLIP " >/dev/null 2>&1
              if [ $? != 0 ]
              then
                  continue
              fi
              echo "$CHKIFC" | /bin/grep "zone $CHKZONE$" >/dev/null 2>&1
              if [ $? != 0 -a "$CHKZONE" != "global" ]
              then
                  continue
              fi
              return 1
          done
      
          return 0
      }
      
      #--------------------------------------------------
      # Remove Logical IP
      #--------------------------------------------------
      
      Stop()
      {
          IFCFG_RETRY_CNT=9
      
          for PIF in $IFLIST
          do
              RET=0
              CNT=0
              while [ $RET -eq 0 ] && [ $CNT -le $IFCFG_RETRY_CNT ]
              do
                  CNT=`/usr/bin/expr $CNT + 1`
                  CMD="/usr/sbin/ifconfig $PIF removeif $LIP"
                  Pmsg TRACE "$CMD"
                  $CMD 2>/dev/null
                  RET=$?
                  Pmsg TRACE "exitcode = $RET"
              done
          done
      
          return 0
      }
      
      #--------------------------------------------------
      # Common functions
      #--------------------------------------------------
      
      WaitForZoneBoot()
      {
          MSGFLAG=0
      
          while [ 1 ]
          do
              ZONESTATUS=`/usr/sbin/zoneadm -z "$ZONENAME" list -p 2>/dev/null | /bin/grep ":shared" | /usr/bin/nawk -F: '{ print $3 }'`
              if [ "$ZONESTATUS" = "ready" -o "$ZONESTATUS" = "running" ]
              then
                  break
              fi
              if [ "$ZONESTATUS" = "" ]
              then
                  Pmsg ERROR "shared-ip zone does not exist. ZONENAME=$ZONENAME"
                  return 1
              fi
              if [ "$MSGFLAG" = 0 ]
              then
                  Pmsg INFO "wait for zone boot. stat=$ZONESTATUS ZONENAME=$ZONENAME"
                  MSGFLAG=1
              fi
              sleep 1
          done
      
          if [ "$MSGFLAG" = 1 ]
          then
              Pmsg INFO "finished waiting. stat=$ZONESTATUS ZONENAME=$ZONENAME"
          fi
      
          return 0
      }
      
      Pmsg()
      {
          TSTAMP=`/usr/bin/date +"%Y-%m-%d %H:%M:%S"`
          echo "$RSCNAME: $PHASE: $TSTAMP: $1: $TAG($$) $2"
          return 0
      }
      
      ReadConf()
      {
          if [ -r "$CONFFILE" ]
          then
              . $CONFFILE
          fi
          if [ -z "$LIP" -o -z "$IFLIST" -o -z "$ZONENAME" ]
          then
              Pmsg ERROR "configuration error. LIP=$LIP IFLIST=$IFLIST ZONENAME=$ZONENAME"
              return 1
          fi
          return 0
      }
      
      #--------------------------------------------------
      # Main
      #--------------------------------------------------
      
      if [ x"$1" = x"start" ]
      then
          ReadConf
          if [ $? != 0 ]
          then
              exit 1 
          fi
          if [ "$ZONEWAIT" != 0 ]
          then
              WaitForZoneBoot
              if [ $? != 0 ]
              then
                  exit 1
              fi
          fi
          Start
          exit $?
      elif [ x"$1" = x"stop" ]
      then
          ReadConf
          if [ $? != 0 ]
          then
              exit 0
          fi
          Stop
          exit $?
      else
          Pmsg ERROR "usage: $TAG {start|stop} [conffile]. cmd=$0 $*"
      fi
      
      exit 1
    • hvzonelifrsc.shスクリプトファイルの内容(GLSの高速切替方式、GS/SURE連携方式で使用する場合)

      #!/bin/sh
      #
      # hvzonelifrsc.sh 1.0
      #
      
      LIF=""
      ZONENAME=""
      ZONEWAIT=""
      
      #--------------------------------------------------
      # Place the logical interface in non-global zone
      #--------------------------------------------------
      
      TAG=`/usr/bin/basename $0`
      CONFFILE=$2
      RSCNAME=${HV_NODENAME:-Unknown}
      PHASE=${HV_INTENDED_STATE:-Unknown}
      
      Start()
      {
          IFCFG_RETRY_CNT=4
      
          RET=1
          CNT=0
          while [ $RET -ne 0 ] && [ $CNT -le $IFCFG_RETRY_CNT ]
          do
              CNT=`/usr/bin/expr $CNT + 1`
              CMD="/usr/sbin/ifconfig $LIF zone $ZONENAME"
              Pmsg TRACE "$CMD"
              $CMD
              RET=$?
              Pmsg TRACE "exitcode = $RET"
          done
      
          if [ $RET -ne 0 ]
          then
              Pmsg ERROR "ifconfig failed. cmd=$CMD"
          fi
      
          return $RET
      }
      
      #--------------------------------------------------
      # Place the logical interface in global zone
      #--------------------------------------------------
      
      Stop()
      {
          IFCFG_RETRY_CNT=4
      
          RET=1
          CNT=0
          while [ $RET -ne 0 ] && [ $CNT -le $IFCFG_RETRY_CNT ]
          do
              CNT=`/usr/bin/expr $CNT + 1`
              CMD="/usr/sbin/ifconfig $LIF -zone"
              Pmsg TRACE "$CMD"
              $CMD 
              RET=$?
              Pmsg TRACE "exitcode = $RET"
          done
      
          return 0
      }
      
      #--------------------------------------------------
      # Common functions
      #--------------------------------------------------
      
      WaitForZoneBoot()
      {
          MSGFLAG=0
      
          while [ 1 ]
          do
              ZONESTATUS=`/usr/sbin/zoneadm -z "$ZONENAME" list -p 2>/dev/null | /bin/grep ":shared" | /usr/bin/nawk -F: '{ print $3 }'`
              if [ "$ZONESTATUS" = "ready" -o "$ZONESTATUS" = "running" ]
              then
                  break
              fi
              if [ "$ZONESTATUS" = "" ]
              then
                  Pmsg ERROR "shared-ip zone does not exist. ZONENAME=$ZONENAME"
                  return 1
              fi
              if [ "$MSGFLAG" = 0 ]
              then
                  Pmsg INFO "wait for zone boot. stat=$ZONESTATUS ZONENAME=$ZONENAME"
                  MSGFLAG=1
              fi
              sleep 1
          done
      
          if [ "$MSGFLAG" = 1 ]
          then
              Pmsg INFO "finished waiting. stat=$ZONESTATUS ZONENAME=$ZONENAME"
          fi
      
          return 0
      }
      
      Pmsg()
      {
          TSTAMP=`/usr/bin/date +"%Y-%m-%d %H:%M:%S"`
          echo "$RSCNAME: $PHASE: $TSTAMP: $1: $TAG($$) $2"
          return 0
      }
      
      ReadConf()
      {
          if [ -r "$CONFFILE" ]
          then
              . $CONFFILE
          fi
          if [ -z "$LIF" -o -z "$ZONENAME" ]
          then
              Pmsg ERROR "configuration error. LIF=$LIF ZONENAME=$ZONENAME"
              return 1
          fi
          return 0
      }
      
      #--------------------------------------------------
      # Main
      #--------------------------------------------------
      
      if [ x"$1" = x"start" ]
      then
          ReadConf
          if [ $? != 0 ]
          then
              exit 1
          fi
          if [ "$ZONEWAIT" != 0 ]
          then
              WaitForZoneBoot
              if [ $? != 0 ]
              then
                  exit 1
              fi
          fi
          Start
          exit $?
      elif [ x"$1" = x"stop" ]
      then
          ReadConf
          if [ $? != 0 ]
          then
              exit 0
          fi
          Stop
          exit $?
      else
          Pmsg ERROR "usage: $TAG {start|stop} [conffile]. cmd=$0 $*"
      fi
      
      exit 1
  2. 配置したスクリプトに対する設定ファイルを新規に作成します。ファイル名には任意の名前を指定することができます。また、作成したファイルの中で、以下の項目を設定します。

    • hvzonealip.shの設定ファイルの作成(GLSのNIC切替方式を使用する場合、または、GLSを使用しない場合)
      LIP、IFLIST、ZONENAMEの3項目を設定します。

      • /var/tmp/PCL/rmstools/hvzonelip_zone-net.conf

        LIP=
        IFLIST=
        ZONENAME=
    • hvzonelifrsc.shの設定ファイルの作成(GLSの高速切替方式、GS/SURE連携方式を使用する場合)
      LIF、ZONENAMEの2項目を設定します。

      • /var/tmp/PCL/rmstools/hvzonelifrsc_zone-net.conf

        LIF=
        ZONENAME=

    項目

    設定内容

    引継ぎIPアドレス (LIP=)

    ノングローバルゾーンで、引き継ぐIPアドレス(IPv4アドレス)を設定します。本IPアドレスは、GLSや他のノングローバルゾーンで使用していないものを設定してください。また、IPv6アドレスは設定できません。
    例) "192.168.10.10"

    引継ぎ論理仮想インタフェース(LIF=)

    ノングローバルゾーンで、引き継ぐIPアドレス(IPv4アドレス)が割り当てられた論理仮想インタフェース(コロン付きインタフェース)を設定します。
    例) "sha0:65"

    ネットワークインタフェース名のリスト(IFLIST=)

    ノングローバルゾーンが使用するグローバルゾーン上のネットワークインタフェース名を設定します。GLSで複数のネットワークインタフェースを束ねている場合、プライマリとセカンダリの両方のネットワークインタフェース名を空白で区切って記載します。
    例) "fjgi0 fjgi1"、"fjgi0"

    ノングローバルゾーン名(ZONENAME=)

    ノングローバルゾーンの名前を設定します。
    例) "zone1"

    ノングローバルゾーンの起動待ち
    (ZONEWAIT=)

    ノングローバルゾーンにIPアドレスを割り当てるとき、対象となるノングローバルゾーンの状態をチェックするかを指定します。何も設定しない場合、最大でCmdlineリソースのTIMEOUT時間が経過するまでノングローバルゾーンの起動を待ち合わせます。待ち合わせをせず、即時にリソースを異常にしたい場合、設定ファイルに“ZONEWAIT="0"”を追記します。
    例) "0"

    参考

    • NIC切替方式の場合、Glsリソースに登録した引継ぎIPアドレスとは異なるIPアドレスを追加することで、ノングローバルゾーン間のIPアドレス引き継ぎを実現します。一方、高速切替方式やGS/SURE連携方式の場合、Glsリソースに登録した引継ぎIPアドレスをグローバルゾーンと共有させることで、ノングローバルゾーン間のIPアドレス引き継ぎを実現します。

    • 高速切替方式、GS/SURE連携方式の場合、引継ぎ論理仮想インタフェース(LIF=)は、GLSのhanethvrsc createコマンドに、-iオプションをつけて実行することで設定します。また、hanethvrsc printコマンドでifnameの項目として表示されます。

      # /opt/FJSVhanet/usr/sbin/hanethvrsc print
      ifname takeover-ipv4 takeover-ipv6 +----------+----------------+--------------------------------------------------+ sha0:65 192.168.100.101 -
    • GS/SURE連携方式の場合、GLSのhanethvrsc createコマンドに-iオプションをつけずに設定した場合、ノングローバルゾーンで引継ぎIPアドレスを使用できません。引継ぎIPアドレスが、ノングローバルゾーンとグローバルゾーン間で共有可能な論理仮想インタフェース(shaX:65)ではなく、仮想インタフェース(shaX)に割り当てられるためです。論理仮想インタフェースとして設定されているかは、hanethvrsc printの実行結果で表示されるtakeover-ipv4項目と、hanetconfig printの実行結果で表示されるHostname項目の仮想IPアドレスが異なるものになっていることで判別してください。

      # /opt/FJSVhanet/usr/sbin/hanethvrsc print
      ifname takeover-ipv4 takeover-ipv6 +----------+----------------+--------------------------------------------------+ sha0:65 192.168.100.101 - # /opt/FJSVhanet/usr/sbin/hanetconfig print
      [IPv4,Patrol] Name Hostname Mode MAC Adder/Phys ip Interface List +-----------+---------------+----+-----------------+---------------------------+ sha1 192.168.10.1 n fjgi0 sha2 192.168.20.1 n fjgi1 sha0 192.168.100.100 c sha1,sha2

    • NIC切替方式のスクリプトの設定例
      グローバルゾーンでGLSのNIC切替方式が二重化しているネットワークインタフェース「fjgi0 fjgi1」を使用して、ノングローバルゾーン「zone1」で引継ぎIPアドレス「192.168.10.10」を設定する場合の設定例は以下の通りです。

      • /var/tmp/PCL/rmstools/hvzonelip_zone1-net1.conf

        LIP="192.168.10.10"
        IFLIST="fjgi0 fjgi1"
        ZONENAME="zone1"
    • GLSを使用しない場合のスクリプトの設定例
      グローバルゾーンのネットワークインタフェース「fjgi0」を使用して、ノングローバルゾーン「zone1」で引継ぎIPアドレス「192.168.10.10」を設定する場合の設定例は以下の通りです。

      • /var/tmp/PCL/rmstools/hvzonelip_zone1-net1.conf

        LIP="192.168.10.10"
        IFLIST="fjgi0"
        ZONENAME="zone1"
    • 高速切替方式、GS/SURE連携方式のスクリプトの設定例
      グローバルゾーンでGLSの高速切替方式、GS/SURE連携方式が二重化しているネットワークインタフェースを使用して、ノングローバルゾーン「zone1」で引継ぎ論理仮想インタフェース「sha0:65」を設定する場合の設定例は以下の通りです。

      • /var/tmp/PCL/rmstools/hvzonelif_zone1-net1.conf

        LIF="sha0:65"
        ZONENAME="zone1"
  3. Cmdlineリソースを使用する全てのノード(グローバルゾーン)に対して、作成した設定ファイルをコピーします。

    注意

    各ノードに設定ファイルを配置しない場合、Cmdlineリソースが起動しない場合があります。

  4. Cmdlineリソースを登録します。

    Cmdlineの作成の「作成方法」で「パス入力」を選択し、Startスクリプト、Stopスクリプトを設定します。Checkスクリプトは入力しません。

    • GLSのNIC切替方式を使用する場合、または、GLSを使用しない場合

      • Startスクリプト

        /var/tmp/PCL/rmstools/hvzonelip.sh start [config file]
      • Stopスクリプト

        /var/tmp/PCL/rmstools/hvzonelip.sh stop [config file]
      • Checkスクリプト

        入力しません。

    • GLSの高速切替方式、GS/SURE連携方式を使用する場合

      • Startスクリプト

        /var/tmp/PCL/rmstools/hvzonelifrsc.sh start [config file]
      • Stopスクリプト

        /var/tmp/PCL/rmstools/hvzonelifrsc.sh stop [config file]
      • Checkスクリプト

        入力しません。

    以下に例を示します。

    • Startスクリプト

      /var/tmp/PCL/rmstools/hvzonelip.sh start /var/tmp/PCL/rmstools/hvzonelip_zone1-net1.conf
    • Stopスクリプト

      /var/tmp/PCL/rmstools/hvzonelip.sh stop /var/tmp/PCL/rmstools/hvzonelip_zone1-net1.conf
    • Checkスクリプト

      入力しません。

  5. スクリプトの属性を設定します。「Flag」ボタンをクリックし、以下の値を設定してください。

    Flag

    概要

    NULLDETECTOR

    Checkスクリプトがないため、“Yes”に変更します。

    TIMEOUT

    デフォルト値300秒から60秒に変更します。60秒よりTIMEOUTの時間を短くする場合、上記で登録したStartスクリプトとStopスクリプトの実行時間を考慮したうえで設定してください。詳細は、“6.7.1.1 Cmdlineリソースの作成”を参照してください。

注意

  • ノングローバルゾーンを起動した状態でCmdlineリソース(共有IP制御)をOnline状態にしてください。ノングローバルゾーンが停止している場合、ifconfigコマンドによる共有IPのzone設定に失敗するためです。

  • ノングローバルゾーン上のRMSによって動作するアプリケーションがOnline状態になる前に、引継ぎIPアドレスを起動したい場合、Cmdlineリソース(ノングローバルゾーン制御)にResourceの関連付けを設定してください。Cmdlineリソース(ノングローバルゾーン制御)のSubApplicationに、Cmdlineリソース(共有IP制御)を設定します。詳細は、“6.7 クラスタアプリケーションの設定”を参照してください。

5-4. クラスタアプリケーションの作成

あらかじめグローバルゾーンに登録していたGdsリソース、Glsリソース、Fsystemリソースに加えて“5-2. ノングローバルゾーン制御用Cmdlineリソースの作成”で作成したCmdlineリソースを加えて、対象のノングローバルゾーンに対応するクラスタアプリケーションを作成してください。

クラスタアプリケーションを作成するには、ノングローバルゾーンが停止している必要があります。

ノングローバルゾーンが動作中の場合は、以下の手順でクラスタアプリケーションの制御対象となるノングローバルゾーンを、全てのクラスタノードで停止してから、クラスタアプリケーションを作成してください。

# zlogin zone-a shutdown -i0 -g0 -y

クラスタアプリケーションの作成後、クラスタ環境のチェックを行ってください。詳細は、“6.10 クラスタ環境のチェック”を参照してください。

注意

クラスタアプリケーションの作成手順は“6.7.2.1 スタンバイ運用のクラスタアプリケーション作成”に従いますが、以下の点が異なります。

  • クラスタアプリケーションの属性

    ウォームスタンバイの場合、“StandbyTransitions”を必ず“ClearFaultRequest|StartUp|SwitchRequest”に設定してください。