この付録では、データサービスの各メソッドの完全なコード例を示します。また、リソースタイプ登録 (RTR) ファイルの内容も示します。
この付録の内容は次のとおりです。
RTR ファイルには、クラスタ管理者がデータサービスを登録するとき、データサービスの初期構成を定義するリソースとリソースタイプのプロパティー宣言が含まれています。
# # Copyright (c) 1998-2006 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 メソッドを実行します。また、リソースが有効になったときも、RGM は同じ動作をします。サンプルのアプリケーションでは、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}'` # $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_NAMÈ # RTR ファイルから Retry_interval の値を取得する。この値の単位は秒 # であり、pmfadm に渡すときは分に変換する必要がある。変換時、端数は # 切り上げられるので注意すること。たとえば、50 秒は 1 分に切り上げられる。 ((RETRY_INTRVAL = `scha_resource_get -O Retry_interval -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ 60)) # PMF の制御下で in.named デーモンを起動する。$RETRY_INTERVAL の期 # 間、$RETRY_COUNT の回数だけ、クラッシュおよび再起動できる。どちら # かの値以上クラッシュした場合、PMF は再起動を中止する。 # というタグですでにプロセスが登録されて # いる場合、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 |
RGM は、HA-DNS リソースのあるリソースグループがクラスタノードまたはゾーン上でオフラインになると、そのノードまたはゾーン上で Stop メソッドを実行します。また、リソースが無効になったときも、RGM は同じ動作をします。このメソッドは、そのノードまたは大域ゾーン上で 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_NAMÈ # 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 UNSUCCESSFUL” 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 コマンドを使用して、データサービスの可用性を検査します (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_NAMÈ STOP_METHOD=`scha_resource_get -O STOP \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ 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_NAMÈ START_METHOD=`scha_resource_get -O START \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ 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/gettimè 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/gettimè time_diff=`expr $current_time - $start_timè 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_NAMÈ # 検証用のタイムアウト値を取得する。この値は 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_NAMÈ # システム定義プロパティー Retry_count から再試行最大回数を取得する。 RETRY_COUNT =`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # システム定義プロパティー Retry_interval から再試行最大期間を取得する。 Retry_interval RETRY_INTERVAL=scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # リソースタイプの RT_basedir プロパティーから gettime ユーティリティーの # 完全パスを取得する。 RT_BASEDIR=scha_resource_get -O RT_basedir -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # 検証は無限ループで動作し、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 # # Monitor start Method for HA-DNS. # # このメソッドは、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_NAMÈ # 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 を呼び出します。また、潜在的なマスターとなっているノードまたはゾーンを検査する場合にも、RGM は同じ動作をします。
#!/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_NAMÈ # 当該リソースの Validate メソッド名を取得する。 VALIDATE_METHOD=`scha_resource_get -O VALIDATE -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # データサービスを起動するための 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_NAMÈ # 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 |