6.13.3 サーバの監視コマンドの作成
サーバの監視コマンドは,プログラムの状態を監視するコマンドです。HAモニタでは,サーバの監視コマンドを作成することによって,サーバ障害時にサーバの再起動や自動系切り替えができます。なお,モニタモードのプログラム管理機能で監視するUAPだけでサーバを構成する場合は,作成不要です。
ここでは,サーバの監視コマンドが呼び出されるタイミング,およびサーバの監視コマンドの作成方法について説明します。サーバの監視方法の説明については,「3.2.1 モニタモードのサーバの監視(実行サーバの場合)」を参照してください。
- 〈この項の構成〉
(1) サーバの監視コマンドが呼び出されるタイミング
作成したサーバの監視コマンドは,HAモニタがスーパユーザの権限で実行します。
サーバの監視コマンドは,実行系で実行サーバが起動完了したあとに起動されます。
(2) サーバの監視コマンドの作成方法(サーバ対応の環境設定のptrlcmd_exオペランドで指定する場合)
次に示す項目を満たすように,サーバの監視コマンドを作成してください。
-
プログラムの監視に必要な動作環境があれば設定してください。RHEL7以降ではUnit設定ファイルに環境変数を設定できますが,HAモニタを上書きインストールするとUnit設定ファイルが上書きされます。そのため,シェルの中で動作環境(環境変数)を設定することを推奨します。
サーバの監視コマンドを実行した際に引き継がれる環境変数については,「6.13.2 サーバの停止コマンドの作成」の「(2) サーバの停止コマンドの作成方法」を参照してください。
-
SIGTERMシグナルを受信する設定にする。
HAモニタは,サーバの正常停止,計画系切り替え,および監視コマンド実行時のタイムアウト時に,SIGTERMシグナルを送信することで監視コマンドを停止します。そのため,SIGTERMシグナルを受信できるようにしておいてください。
-
サーバの監視コマンドは,無限ループが発生しないように作成する。
監視コマンド内で定期的な監視をするなどによって,監視コマンドが無限ループすると,HAモニタは監視コマンドのスローダウンやハングアップとして検知します。このため,モニタモードのサーバにサーバ障害が発生したと判断します。
-
監視コマンドの終了結果(EXITコード)に,監視結果を返す。
指定できる終了結果(EXITコード)を次に示します。なお,EXITコード30~49は,HAモニタの予約番号のため使用しないでください。
表6‒11 監視対象の業務の状態に応じて指定できる終了結果(EXITコード) 監視対象の業務の状態
指定できる終了結果(EXITコード)
説明
正常
0
このEXITコードを返却すると,HAモニタは監視対象の業務が正常,または復旧したと判断します。
監視対象の業務が,正常に動作できている場合に返却してください。
監視失敗
業務エラー
判断不可
1~9
このEXITコードを返却すると,HAモニタは監視コマンドを再実行します。HAモニタは,サーバ対応の環境設定のptrlcmd_ex_retryオペランドの指定に従って動作します。なお,再実行時の実行間隔は,サーバ対応の環境設定のptrlcmd_ex_interオペランドと同じになります。
監視対象の業務の監視に失敗,業務エラー,判断不可となった場合など,一時的な問題だと判断できるときに返却してください。
障害
10~19
このEXITコードを返却すると,HAモニタは監視コマンドを再実行しないで,実行サーバのサーバ障害と判断します。HAモニタは,サーバ対応の環境設定のservexec_retryオペランドに従い動作します。
監視コマンドを再実行しないため,業務が障害と判断できる場合などに返却してください。
20~29
このEXITコードを返却すると,HAモニタは監視コマンドを再実行しないで,実行サーバのサーバ障害と判断し,系切り替えをします。HAモニタは,サーバ対応の環境設定のservexec_retryオペランドの指定を無視して,即時に系切り替えをします。
サーバを再起動しても,業務が動作できないような恒久的な障害(ディスク障害など)と判断できる場合などに返却してください。
EXITコードごとの処理の流れを次に示します。
EXITコードに0を指定した場合(正常),実行間隔(サーバ対応の環境設定のptrlcmd_ex_interオペランドの指定値)ごとに監視コマンドを起動します。モニタモードのサーバの障害監視(EXITコードに0を指定した場合)を次の図に示します。
EXITコードに1~9を指定した場合(監視失敗,業務エラー,および判断不可),リトライオーバによって,サーバ障害と判断します。実行間隔(サーバ対応の環境設定のptrlcmd_ex_interオペランドの指定値)に1を足した回数分,監視に失敗するとリトライオーバとなります。モニタモードのサーバの障害監視(EXITコードに1~9を指定した場合)を次の図に示します。この図は,サーバ対応の環境設定のptrlcmd_ex_retryオペランドの指定値を2とした場合の例です。
EXITコードに10~19,または20~29を指定した場合(障害),監視コマンドを再実行しないで,実行サーバのサーバ障害と判断します。モニタモードのサーバの障害監視(EXITコードに10~19,または20~29を指定した場合)を次の図に示します。
サーバ対応の環境設定のptrlcmd_ex_tmoutオペランドに指定した時間が経過してもリターンしない場合,業務アプリケーションのスローダウンまたはハングアップとして検知し,実行サーバのサーバ障害と判断します。モニタモードのサーバの障害監視(サーバ対応の環境設定のptrlcmd_ex_tmoutオペランドに指定した時間が経過してもリターンしない場合)を次の図に示します。
作成したサーバの監視コマンドを,サーバ対応の環境設定のptrlcmd_exオペランドに指定してください。また,次のサーバ対応の環境設定のオペランドも指定してください。
-
ptrlcmd_ex_inter(省略できません)
-
ptrlcmd_ex_retry(省略できます)
-
ptrlcmd_ex_tmout(省略できます)
サーバの監視コマンドによってサーバ障害を検知した場合の,サーバログの確認については,「7.3 サーバログの確認」を参照してください。
サーバの監視コマンドのサンプルファイルを,HAモニタサンプルファイル用ディレクトリの下にpatrol_ex.shというファイル名で格納していますので,必要に応じて利用してください。
#!/bin/sh
#******************************************************************************
#* *
#* Linux(x86) HA Monitor *
#* This is a sample of the patrol command. *
#* This is specified in the ptrlcmd_ex operand. *
#* (For monitor mode server) *
#* Attention: This can not be specified in the patrolcommand operand. *
#* *
#* All Rights Reserved. Copyright (C) 2017, Hitachi, Ltd. *
#* *
#******************************************************************************
set -x
# The object program to monitor
PROGRAM=/home/xxxx/yyyy
# The definition of command
PS=/bin/ps
GREP=/bin/grep
# Is the object program to monitor operating ?
EXIST=`$PS -efl | $GREP $PROGRAM | $GREP -v grep`
# When the object program to monitor is not operating,
# the variable EXIST is empty.
if [ "$EXIST" = "" ]
then
# This patrol command terminates, because the object program
# to monitor is not operating.
exit 10
fi
# Please describe commands and processes that can confirm that applications and tasks are running.
# For example, a command that throws a request to an application and receives a response,
# If it is a database, describe SQL to access the database.
# The end result (EXIT code) is returned according to the command execution result.
# For details, refer to the manual.
#
# ex)
# Describe the SQL to access the database.
# if [ "$?" -ne "0" ]
# then
# exit 1
# fi
exit 0
「EXIST=`$PS -efl | $GREP $PROGRAM | $GREP -v grep`」は,サーバの監視コマンド内でプログラムのプロセスがあるかどうかを確認します。プロセスの確認には,OSのpsコマンドの出力などを使用します。
「Describe the SQL to access the database.」には,アプリケーションや業務が動いていることを確認できるコマンドや処理を記載してください。例えば,アプリケーションに要求を投げて応答をもらうようなコマンドや,データベースであれば,データベースにアクセスするSQLを記載します。コマンドの実行結果によって,終了結果(EXITコード)を返却します。終了結果(EXITコード)については,「表6-11 監視対象の業務の状態に応じて指定できる終了結果(EXITコード)」を参照してください。
(3) サーバの監視コマンドの作成方法(サーバ対応の環境設定のpatrolcommandオペランドで指定する場合)
次に示す項目を満たすように,サーバの監視コマンドを作成してください。
-
プログラムの監視に必要な動作環境があれば設定してください。RHEL7以降ではUnit設定ファイルに環境変数を設定できますが,HAモニタを上書きインストールするとUnit設定ファイルが上書きされます。そのため,シェルの中で動作環境(環境変数)を設定することを推奨します。
サーバの監視コマンドを実行した際に引き継がれる環境変数については,「6.13.2 サーバの停止コマンドの作成」の「(2) サーバの停止コマンドの作成方法」を参照してください。
-
監視対象のプログラムを定期的に監視する。
-
監視によって,プログラムの障害を検知した場合は,監視コマンドを終了(exit)する。
終了コードは任意です。
-
SIGTERMシグナルを受信しない設定にはしない。
HAモニタは,サーバの監視コマンドに対してSIGTERMシグナルを送信することで監視コマンドを停止します。そのため,SIGTERMシグナルを受信できるようにしておいてください。
作成したサーバの監視コマンドを,サーバ対応の環境設定のpatrolcommandオペランドに指定してください。
サーバの監視コマンドのサンプルファイルを,HAモニタサンプルファイル用ディレクトリの下にpatrol.shというファイル名で格納していますので,必要に応じて利用してください。
Bシェルによる監視コマンドの作成例を示します。
#!/bin/sh # The object program to monitor PROGRAM=/home/xxxx/yyyy # The definition of command PS=/bin/ps GREP=/bin/grep # Main loop while true do # Is the object program to monitor operating ? EXIST=`$PS -efl | $GREP $PROGRAM | $GREP -v grep` # When the object program to monitor is not operating, # the variable EXIST is empty. if [ "$EXIST" = "" ] then # This patrol command terminates, because the object program # to monitor is not operating. exit fi # The monitoring is continued, because the object program # to monitor is operating. sleep 5 done
前述のコーディング例では,サーバの監視コマンド内でループを持ち,そのループ内でプログラムのプロセスがあるかどうかを確認します。プロセスの確認には,OSのpsコマンドの出力などを使用します。プログラムのプロセスがあればループを継続し,プロセス生存の確認を続行します。