この付録では、データサービスの各メソッドの完全なコード例を示します。 また、リソースタイプ登録 (RTR) ファイルの内容も示します。
リソースタイプ登録 (RTR) ファイルには、クラスタ管理者がデータサービスを登録するとき、データサービスの初期構成を定義するリソースとリソースタイプのプロパティ宣言が含まれています。
# # Copyright (c) 1998-2004 by Sun Microsystems, Inc. # All rights reserved. # # ドメインネームサービス (DNS) の登録情報 # #pragma ident ”@(#)SUNW.sample 1.1 00/05/24 SMI” RESOURCE_TYPE = ”sample”; VENDOR_ID = SUNW; RT_DESCRIPTION = ”Domain Name Service on Sun Cluster”; RT_VERSION =”1.0”; API_VERSION = 2; FAILOVER = TRUE; RT_BASEDIR=/opt/SUNWsample/bin; PKGLIST = SUNWsample; START = dns_svc_start; STOP = dns_svc_stop; VALIDATE = dns_validate; UPDATE = dns_update; MONITOR_START = dns_monitor_start; MONITOR_STOP = dns_monitor_stop; MONITOR_CHECK = dns_monitor_check; # リソースタイプ宣言のあとに、中括弧に囲まれたリソースプロパティ宣言 # のリストが続く。プロパティ名宣言は、各エントリの左中括弧の直後にある # 最初の属性である必要がある。 # # <method>_timeout プロパティは、RGM がメソッド呼び出しが失敗 # したという結論を下すまでの時間 (秒) を設定する。 # すべてのメソッドタイムアウトの MIN 値は、60 秒に設定されている。 # これは、管理者が短すぎる時間を設定することを防ぐためである。短すぎる # 時間を設定するとスイッチオーバーやフェイルオーバーの性能が上がらず、 # さらには、予期せぬ RGM アクションが発生する可能性がある (間違った # フェイルオーバー、ノードの再起動、リソースグループの # ERROR_STOP_FAILED 状態への移行、オペレータの介入の必要性など)。 # メソッドタイムアウトに短すぎる時間を設定すると、データサービス全体 # の可用性を下げることになる。 { PROPERTY = Start_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Stop_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Validate_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Update_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Monitor_Start_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Monitor_Stop_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Thorough_Probe_Interval; MIN=1; MAX=3600; DEFAULT=60; TUNABLE = ANYTIME; } # 当該ノード上でアプリケーションを正常に起動できないと結論を下すまで # に、ある期間 (Retry_Interval) に行う再試行の回数。 { PROPERTY = Retry_Count; MIN=0; MAX=10; DEFAULT=2; TUNABLE = ANYTIME; } # Retry_Interval には60 の倍数を設定する。これは、秒から分に変換さ # れ、端数が切り上げられるためである。たとえば、50 (秒) という値を # 指定すると、1 分に変換される。 # このプロパティは再試行数(Retry_Count) のタイミングを決定する。 { PROPERTY = Retry_Interval; MIN=60; MAX=3600; DEFAULT=300; TUNABLE = ANYTIME; } { PROPERTY = Network_resources_used; TUNABLE = AT_CREATION; DEFAULT = ””; } # # 拡張プロパティ # # クラスタ管理者はこのプロパティの値を設定して、アプリケーションが使用 # する構成ファイルが入っているディレクトリを示す必要がある。このアプリ # ケーションの場合、DNS は PXFS (通常は named.conf) 上の DNS 構成ファ # イルのパスを指定する。 { PROPERTY = Confdir; EXTENSION; STRING; TUNABLE = AT_CREATION; DESCRIPTION = ”The Configuration Directory Path”; } # 検証が失敗したと宣言するまでのタイムアウト値 (秒) { PROPERTY = Probe_timeout; EXTENSION; INT; DEFAULT = 30; TUNABLE = ANYTIME; DESCRIPTION = ”Time out value for the probe (seconds)”; } |
データサービスリソースを含むリソースグループがオンラインになったとき、あるいは、リソースが有効になったとき、RGM はそのクラスタノード上で Start メソッドを呼び出します。 サンプルのアプリケーションでは、Start メソッドはそのノード上で in.named (DNS) デーモンを起動します。
#!/bin/ksh # # HA-DNS の Start メソッド # # このメソッドはPMF の制御下でデータサービスを起動する。DNS の # in.named プロセスを起動する前に、いくつかの妥当性検査を実行する。 # データサービスのPMF タグは$RESOURCE_NAME.named である。 # PMF は、指定された回数(Retry_count) だけ、サービスを起動しようとす # る。そして、指定された期間(Retry_interval) 内で試行回数がこの値を超えた # 場合、PMF はサービスの起動に失敗したことを報告する。 # Retry_count とRetry_interval は両方ともRTR ファイルに設定されて # いるリソースプロパティである。 #pragma ident ”@(#)dns_svc_start 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソース名。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプ名。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用する syslog 機能番号を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # DNS を起動するため、リソースの Confdir プロパティの値を取得する。 # 入力されたリソース名とリソースグループを使用して、リソースを # 追加するときにクラスタ管理者が設定したConfdir の値を見つける。 # config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` # scha_resource_get は拡張プロパティの「タイプ」と「値」を戻す。 # 拡張プロパティの値だけを取得する。 CONFIG_DIR=`echo $config_info | awk `{print $2}'` # Check if $CONFIG_DIR がアクセス可能であるかどうかを検査する。 if [ ! -d $CONFIG_DIR ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Directory $CONFIG_DIR missing or not mounted” exit 1 fi # データファイルへの相対パスが存在する場合、$CONFIG_DIR # ディレクトリに移動する。 cd $CONFIG_DIR # named.conf ファイルが $CONFIG_DIR ディレクトリ内に存在するか # を検査する。 if [ ! -s named.conf ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} File $CONFIG_DIR/named.conf is missing or empty” exit 1 fi # RTR ファイルから Retry_count の値を取得する。 RETRY_CNT=`scha_resource_get -O Retry_Count -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # RTR ファイルからRetry_interval の値を取得する。この値の単位は秒 # であり、pmfadm に渡すときは分に変換する必要がある。変換時、端数は # 切り上げられるので注意すること。たとえば、50 秒は1 分に切り上げられる。 ((RETRY_INTRVAL = `scha_resource_get -O Retry_Interval -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME 60`)) # PMF の制御下で in.named デーモンを起動する。$RETRY_INTERVAL の期 # 間、$RETRY_COUNT の回数だけ、クラッシュおよび再起動できる。どちら # かの値以上クラッシュした場合、PMF は再起動を中止する。 # <$PMF_TAG> というタグですでにプロセスが登録されて # いる場合、PMF はすでにプロセスが動作していることを示す警告メッセ # ージを送信する。 echo ”Retry interval is ”$RETRY_INTRVAL pmfadm -c $PMF_TAG.named -n $RETRY_CNT -t $RETRY_INTRVAL \ /usr/sbin/in.named -c named.conf # HA-DNS が起動していることを示すメッセージを記録する。 if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} HA-DNS successfully started” fi exit 0 |
HA-DNS リソースを含むリソースグループがクラスタノード上でオフラインになるとき、あるいは、HA-DNS リソースが無効になるとき、RGM は Stop メソッドを呼び出します。 このメソッドは、そのノード上で in.named (DNS) デーモンを停止します。
#!/bin/ksh # # HA-DNS のStop メソッド # # このメソッドは、PMF を使用するデータサービスを停止する。サービス # が動作していない場合、このメソッドは状態 0 で終了する。その他の値 # は戻さない。リソースは STOP_FAILED 状態になる。 #pragma ident ”@(#)dns_svc_stop 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能番号を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # RTR ファイルから Stop_timeout 値を取得する。 STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME -G \ $RESOURCEGROUP_NAME` # PMF 経由で SIGTERM シグナルを使用する規則正しい方法でデータサービ # スを停止しようとする。SIGTERM がデータサービスを停止できるまで、 # Stop_timeout 値の 80% だけ待つ。停止できない場合、SIGKILL を送信 # して、データサービスを停止しようとする。SIGKILL がデータサービス # を停止できるまで、Stop_timeout 値の15% だけ待つ。停止できない場合、 # メソッドは何か異常があったと判断し、0 以外の状態で終了する。 # Stop_timeout の残りの 5% は他の目的のために予約されている。 ((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100)) ((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100)) # in.named が動作しているかどうかを調べて、動作していれば停止する。 if pmfadm -q $PMF_TAG.named; then # シグナルをデータサービスに送信して、合計タイムアウト値 # の80% だけ待つ。 pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \ ”${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \ SIGKILL” # SIGTERM シグナルでデータサービスが停止しないので、今度は # SIGKILL を使用して、合計タイムアウト値の15% だけ待つ。 pmfadm -s $PMF_TAG.named -w $HARD_TIMEOUT KILL if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [SYSLOG_TAG] \ ”${ARGV0} Failed to stop HA-DNS; Exiting UNSUCCESFUL” exit 1 fi fi else # この時点でデータサービスは動作していない。メッセージを記録して、 # 成功で終了する。 logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \ ”HA-DNS is not started” # HA-DNS が動作していない場合でも、成功で終了し、データサービス # リソースがSTOP_FAILED 状態にならないようにする。 exit 0 fi # DNS の停止に成功。メッセージを記録して、成功で終了する。 logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”HA-DNS successfully stopped” exit 0 |
gettime ユーティリティーは、検証の再起動間の経過時間を PROBE プログラムが追跡するための C プログラムです。 このプログラムは、コンパイル後、コールバックメソッドと同じディレクトリ(RT_basedir プロパティが指すディレクトリ) に格納する必要があります。
# # このユーティリティープログラムは、データサービスの検証メソッドによ # って使用され、既知の参照ポイント (基準点) からの経過時間 (秒) を # 追跡する。このプログラムは、コンパイル後、データサービスのコール # バックメソッドと同じディレクトリ (RT_basedir) に格納しておくこと。 #pragma ident ”@(#)gettime.c 1.1 00/05/24 SMI” #include <stdio.h> #include <sys/types.h> #include <time.h> main() { printf(”%d\n”, time(0)); exit(0); } |
PROBE プログラムは、nslookup(1M) コマンドを使用して、データサービスの可用性を検査します。 このプログラムは、Monitor_start コールバックメソッドによって起動され、Monitor_stop コールバックメソッドによって停止されます。
#!/bin/ksh #pragma ident ”@(#)dns_probe 1.1 00/04/19 SMI” # # HA-DNS の Probe メソッド。 # # このプログラムは、nslookup を使用して、データサービスの可用性を検査 # する。nslookup は DNS サーバーに照会することによって、DNS # サーバー自身を探す。サーバーが応答しない場合、あるいは、別のサー # バーが照会に応答した場合、probe メソッドはデータサービスまたはク # ラスタ内の別のノードになんらかの問題が発生したという結論を下す。 # 検証は、RTR ファイルの THOROUGH_PROBE_INTERVAL で設定さ # れた間隔で行われる。 #pragma ident ”@(#)dns_probe 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # restart_service () # # この関数は、まずデータサービスのStop メソッドを呼び出し、 # 次にStart メソッドを呼び出すことによって、データサービスを再起動 # しようとする。データサービスがすでに起動しておらず、 # データサービスのタグがPMF に登録されていない場合、 # この関数はデータサービスをクラスタ内の # 別のノードにフェイルオーバーする。 # function restart_service { # ータサービスを再起動するには、まず、データサービス自身が # PMF 下に登録されているかどうかを確認する。 pmfadm -q $PMF_TAG if [[ $? -eq 0 ]]; then # データサービスのTAG がPMF に登録されている場合、 # データサービスを停止し、起動し直す。 # 当該リソースのStop メソッド名とSTOP_TIMEOUT 値を取得する。 STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` STOP_METHOD=`scha_resource_get -O STOP \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` hatimerun -t $STOP_TIMEOUT $RT_BASEDIR/$STOP_METHOD \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME if [[ $? -ne 0 ]]; then logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Stop method failed.” return 1 fi # 当該リソースのStart メソッド名とSTART_TIMEOUT 値を取得する。 START_TIMEOUT=`scha_resource_get -O START_TIMEOUT \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` START_METHOD=`scha_resource_get -O START \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` hatimerun -t $START_TIMEOUT $RT_BASEDIR/$START_METHOD \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME if [[ $? -ne 0 ]]; then logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Start method failed.” return 1 fi else # データサービスのTAG がPMF に登録されていない場合、 # データサービスがPMF 下で許可されている再試行最大回数を # 超えていることを示す。したがって、データサービスを再起動 # してはならない。その代わりに、同じクラスタ内にある別のノード # にフェイルオーバーを試みる。 scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \ -R $RESOURCE_NAME fi return 0 } ############################################################################### # decide_restart_or_failover () # # この関数は、検証が失敗したときに行うべきアクション、つまり、デー # タサービスをローカルで再起動するか、クラスタ内の別のノードに # フェイルオーバーするかを決定する。 # function decide_restart_or_failover { # 最初の再起動の試行であるかどうかを検査する。 if [ $retries -eq 0 ]; then # 最初の失敗である。 # 最初の試行の時刻を記録する。 start_time=`$RT_BASEDIR/gettime` retries=`expr $retries + 1` # 最初の失敗であるので、データサービスを # 再起動しようと試行する。 restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Failed to restart data service.” exit 1 fi else # 最初の失敗ではない。 current_time=`$RT_BASEDIR/gettime` time_diff=`expr $current_time - $start_time` if [ $time_diff -ge $RETRY_INTERVAL ]; then # この失敗は再試行最大期間後に発生した。 # したがって、再試行カウンタをリセットし、 # 再試行時間をリセットし、さらに再試行する。 retries=1 start_time=$current_time # 前回の失敗が Retry_interval よりも以前に発生しているので、 # データサービスを再起動しようと試行する。 restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG ”${ARGV0} Failed to restart HA-DNS.” exit 1 fi elif [ $retries -ge $RETRY_COUNT ]; then # 再試行最大期間内であり、再試行カウンタは満了 # している。したがって、フェイルオーバーする。 retries=0 scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \ -R $RESOURCE_NAME if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Failover attempt failed.” exit 1 fi else # 再試行最大期間内であり、再試行カウンタは満了 # していない。したがって、さらに再試行する。 retries=`expr $retries + 1` restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Failed to restart HA-DNS.” exit 1 fi fi fi } ############################################################################### # MAIN ############################################################################### export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能番号を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # 証が行われる間隔はシステム定義プロパティ THOROUGH_PROBE_INTERVAL # に設定されている。scha_resource_get でこのプロパティの値を取得する。 PROBE_INTERVAL=`scha_resource_get -O THOROUGH_PROBE_INTERVAL \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` # 検証用のタイムアウト値を取得する。この値は RTR ファイルの # PROBE_TIMEOUT 拡張プロパティに設定されている。nslookup のデフォル # トのタイムアウトは 1.5 分。 probe_timeout_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Probe_timeout` PROBE_TIMEOUT=`echo $probe_timeout_info | awk `{print $2}'` # リソースのNETWORK_RESOURCES_USED プロパティの値を取得して、 # DNS がサービスを提供するサーバーを見つける。 DNS_HOST=`scha_resource_get -O NETWORK_RESOURCES_USED -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # システム定義プロパティRetry_count から再試行最大回数を取得する。 RETRY_COUNT =`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # システム定義プロパティRetry_interval から再試行最大期間を取得する。 RETRY_INTERVAL=scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # リソースタイプの RT_basedir プロパティから gettime ユーティリティーの # 完全パスを取得する。 RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # 検証は無限ループで動作し、nslookup コマンドを実行し続ける。 # nslookup 応答用の一時ファイルを設定する。 DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe probefail=0 retries=0 while : do # 検証が動作すべき期間は THOROUGH_PROBE_INTERVAL プロパティに指 # 定されている。したがって、THOROUGH_PROBE_INTERVAL の間、検証 # プログラムが休眠するように設定する。 sleep $PROBE_INTERVAL # DNS がサービスを提供している IP アドレス上で nslookup コマンド # を実行する。 hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST \ > $DNSPROBEFILE 2>&1 retcode=$? if [ retcode -ne 0 ]; then probefail=1 fi # nslookup への応答が HA-DNS サーバーから来ており、 # /etc/resolv.conf ファイル内に指定されているほかのネームサーバー # から来ていないことを確認する。 if [ $probefail -eq 0 ]; then # nslookup 照会に応答するサーバーの名前を取得する。 SERVER=` awk ` $1==”Server:” {print $2 }' \ $DNSPROBEFILE | awk -F. ` { print $1 } ` ` if [ -z ”$SERVER” ]; then probefail=1 else if [ $SERVER != $DNS_HOST ]; then probefail=1 fi fi fi # probefail 変数が 0 以外である場合、nslookup コマンドがタイム # アウトしたか、あるいは、別のサーバー(/etc/resolv.conf ファイ # ルに指定されている) から照会への応答が来ていることを示す。 # どちらの場合でも、DNS サーバーは応答していないので、 # このメソッドは decide_restart_or_failover を呼び出して、 # データサービスをローカルで起動するか、あるいは、別のノードに # フェイルオーバーするかを評価する。 if [ $probefail -ne 0 ]; then decide_restart_or_failover else logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} Probe for resource HA-DNS successful” fi done |
このメソッドは、データサービスの PROBE プログラムを起動します。
#!/bin/ksh # # HA-DNS のMonitor_start メソッド # # このメソッドは、PMF の制御下でデータサービスのモニター(検証) を # 起動する。モニターは一定の間隔でデータサービスを検証するプロセス # で、問題が発生すると、データサービスを同じノード上で再起動するか、 # クラスタ内の別のノードにフェイルオーバーする。モニター用の PMF # タグは $RESOURCE_NAME.monitor。 #pragma ident ”@(#)dns_monitor_start 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # のメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # データサービスのRT_BASEDIR プロパティを取得することによって、検 # 証メソッドが存在する場所を見つける。 RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # PMF の制御下でデータサービスの検証を開始する。無限再試行オプショ # ンを使用して検証メソッドを起動する。リソースの名前、タイプ、および # グループを検証メソッドに渡す。 pmfadm -c $PMF_TAG.monitor -n -1 -t -1 \ $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME # HA-DNS のモニターが起動されたことを示すメッセージを記録する。 if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} Monitor for HA-DNS successfully started” fi exit 0 |
このメソッドは、データサービスの PROBE プログラムを停止します。
#!/bin/ksh # HA-DNS のMonitor_stop メソッド # PMF を使用して動作しているモニターを停止する。 #pragma ident ”@(#)dns_monitor_stop 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # モニターが動作しているかどうかを調べて、動作していれば停止する。 if pmfadm -q $PMF_TAG.monitor; then pmfadm -s $PMF_TAG.monitor KILL if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Could not stop monitor for resource ” \ $RESOURCE_NAME exit 1 else # モニターは正常に停止している。メッセージを記録する。 logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} Monitor for resource ” $RESOURCE_NAME \ ” successfully stopped” fi fi exit 0 |
このメソッドは、Confdir プロパティが示すディレクトリの存在を確認します。 PROBE メソッドがデータサービスを新しいノードにフェイルオーバーするとき、RGM は Monitor_check を呼び出し、また、潜在マスターであるノードを検査します。
#!/bin/ksh# # DNS の Monitor_check メソッド # # 障害モニターがデータサービスを新しいノードにフェイルオーバー # するとき、RGM はこのメソッドを呼び出す。Monitor_check は # Validate メソッドを呼び出して、新しいノード上で構成ディレク # トリおよびファイルが利用できるかどうかを確認する。 #pragma ident ”@(#)dns_monitor_check 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # リソースタイプの RT_BASEDIR プロパティから Validate メソッドの # 完全パスを取得する。 RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # 当該リソースの Validate メソッド名を取得する。 VALIDATE_METHOD=`scha_resource_get -O VALIDATE -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # データサービスを起動するための Confdir プロパティの値を取得する。 # 入力されたリソース名とリソースグループを使用して、リソースを # 追加するときに設定した Confdir の値を取得する。 config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` # scha_resource_get は、拡張プロパティの値とともにタイプも戻す。 # awk を使用して、拡張プロパティの値だけを取得する。 CONFIG_DIR=`echo $config_info | awk `{print $2}'` # Validate メソッドを呼び出して、データサービスを新しいノードに # フェイルオーバーできるかどうかを確認する。 $RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR # モニター検査が成功したことを示すメッセージを記録する。 if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} Monitor check for DNS successful.” exit 0 else logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Monitor check for DNS not successful.” exit 1 fi |
このメソッドは、Confdir プロパティが示すディレクトリの存在を確認します。 RGM がこのメソッドを呼び出すのは、クラスタ管理者がデータサービスを作成したときと、データサービスのプロパティを更新したときです。 障害モニターがデータサービスを新しいノードにフェイルオーバーしたときは、Monitor_check メソッドは常にこのメソッドを呼び出します。
#!/bin/ksh # # HA-DNS のValidate メソッド # このメソッドは、リソースのConfdir プロパティを妥当性検査する。 # Validate メソッドが呼び出されるのは、リソースが作成されたときと、リソース # プロパティが更新されたときの2 つである。リソースが作成されたとき、 # Validate メソッドは-c フラグで呼び出され、すべてのシステム定義プ # ロパティと拡張プロパティがコマンド行引数として渡される。リソースプロ # パティが更新されたとき、Validate メソッドは-u フラグで呼び出され、 # 更新されるプロパティのプロパティ/値のペアだけがコマンド行引数とし # て渡される。 # # 例: リソースが作成されたとき、コマンド行引数は次のようになる。 # # dns_validate -c -R <..> -G <...> -T <..> -r <sysdef-prop=value>... # -x <extension-prop=value>.... -g <resourcegroup-prop=value>.... # # 例: リソースプロパティが更新されたとき、コマンド行引数は次のようになる。 # # dns_validate -u -R <..> -G <...> -T <..> -r <sys-prop_being_updated=value> # または # dns_validate -u -R <..> -G <...> -T <..> -x <extn-prop_being_updated=value> #pragma ident ”@(#)dns_validate 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `cur:x:g:R:T:G:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; r) #メソッドはシステム定義プロパティにアクセスして # いない。したがって、このフラグは動作なし。 ;; g) # メソッドはリソースグループプロパティにアクセスして # いない。したがって、このフラグは動作なし。 ;; c) # Validate メソッドがリソースの作成中に呼び出されてい # ることを示す。したがって、このフラグは動作なし。 ;; u) # リソースがすでに存在しているときは、プロパティの更新 # を示す。Confdir プロパティを更新する場合、Confdir # がコマンド行引数に現れるはずである。現れない場合、 # メソッドは scha_resource_get を使用して # Confdir を探す必要がある。 UPDATE_PROPERTY=1 ;; x) # 張プロパティのリスト。プロパティと値のペア。 # 区切り文字は「=」。 PROPERTY=`echo $OPTARG | awk -F= `{print $1}'` VAL=echo $OPTARG | awk -F= `{print $2}'` # Confdir 拡張プロパティがコマンド行上に存在する場合、 # その値を記録する。 if [ $PROPERTY == ”Confdir” ]; then CONFDIR=$VAL CONFDIR_FOUND=1 fi ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # CONFDIR の値を NULL に設定する。この後、このメソッドは Confdir # プロパティの値を、コマンド行から取得するか、scha_resource_get を # 使って取得する。 CONFDIR=”” UPDATE_PROPERTY=0 CONFDIR_FOUND=0 # このメソッドに渡された引数を構文解析する。 parse_args ”$@” # プロパティの更新の結果として呼び出されている場合、Validate メソッ # ドはコマンド行から Confdir 拡張プロパティの値を取得する。そうでな # い場合、scha_resource_get を使用して Confdir の値を取得する。 if ( (( $UPDATE_PROPERTY == 1 )) && (( CONFDIR_FOUND == 0 )) ); then config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` CONFDIR=`echo $config_info | awk `{print $2}'` fi # Confdir プロパティが値を持っているかどうかを確認する。持っていな # い場合、状態1 (失敗) で終了する。 if [[ -z $CONFDIR ]]; then logger -p ${SYSLOG_FACILITY}.err \ ”${ARGV0} Validate method for resource ”$RESOURCE_NAME ” failed” exit 1 fi # 実際のConfdir プロパティ値の妥当性検査はここから始まる。 # $CONFDIR がアクセス可能であるかどうかを検査する。 if [ ! -d $CONFDIR ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Directory $CONFDIR missing or not mounted” exit 1 fi # named.conf ファイルが Confdir ディレクトリ内に存在するかどうかを # 検査する。 if [ ! -s $CONFDIR/named.conf ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} File $CONFDIR/named.conf is missing or empty” exit 1 fi # Validate メソッドが成功したことを示すメッセージを記録する。 logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”${ARGV0} Validate method for resource ”$RESOURCE_NAME \ ” completed successfully” exit 0 |
プロパティが変更された場合、RGM は Update メソッドを呼び出して、そのことを動作中のリソースに通知します。
#!/bin/ksh # HA-DNS の Update メソッド # # 実際のプロパティの更新はRGM が行う。更新の影響を受けるのは障害モ # ニターだけである。したがって、このメソッドは障害モニターを再起動 # する必要がある。 #pragma ident ”@(#)dns_update 1.1 00/05/24 SMI” ############################################################################### # プログラム引数を構文解析する。 # function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case ”$opt” in R) # DNS リソースの名前。 RESOURCE_NAME=$OPTARG ;; G) # リソースが構成されているリソース # グループの名前。 RESOURCEGROUP_NAME=$OPTARG ;; T) # リソースタイプの名前。 RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ ”ERROR: Option $OPTARG unknown” exit 1 ;; esac done } ############################################################################### # MAIN ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # メッセージの記録に使用するsyslog 機能を取得する。 SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # このメソッドに渡された引数を構文解析する。 parse_args ”$@” PMF_TAG=$RESOURCE_NAME.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # リソースの RT_BASEDIR プロパティを取得することによって、 # 検証メソッドが存在する場所を見つける。 RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` # Update メソッドが呼び出されると、RGM は更新されるプロパティの値を # 更新する。このメソッドは、障害モニター(検証メソッド) が動作し # ているかどうかを検査し、動作している場合は強制終了し、再起動 # する必要がある。 if pmfadm -q $PMF_TAG.monitor; then # すでに動作している障害モニターを強制終了する。 pmfadm -s $PMF_TAG.monitor TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Could not stop the monitor” exit 1 else # DNS の停止に成功。メッセージを記録する。 logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”Monitor for HA-DNS successfully stopped” fi # モニターを再起動する。 pmfadm -c $PMF_TAG.monitor -n -1 -t -1 $RT_BASEDIR/dns_probe \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME -T $RESOURCETYPE_NAME if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ ”${ARGV0} Could not restart monitor for HA-DNS ” exit 1 else logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ ”Monitor for HA-DNS successfully restarted” fi fi exit 0 |