この付録では、データサービスの各メソッドの完全なコード例を示します。また、リソースタイプ登録 (RTR) ファイルの内容も示します。
この付録の内容は、次のとおりです。
RTR ファイルには、クラスタ管理者がデータサービスを登録するとき、データサービスの初期構成を定義するリソースとリソースタイプのプロパティー宣言が含まれています。
#
# Copyright (c) 1998-2005 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 メソッドを実行します。サンプルのアプリケーションでは、 メソッドはそのノード上で 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
|
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_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 を呼び出し、また、潜在マスターであるノードを検査します。
#!/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
|