Sun Cluster 資料服務開發者指南 (適用於 Solaris 作業系統)

第 5 章 資料服務範例

本章說明適用於 in.named 應用程式的 Sun Cluster 資料服務範例 HA-DNS。in.named 常駐程式是網域名稱服務 (DNS) 的 Solaris 實作。資料服務範例展示如何透過使用資源管理 API 來使應用程式具有高可用性。

資源管理 API 支援 shell 程序檔介面與 C 程式介面。本章中的範例應用程式是使用 shell 程序檔介面撰寫的。

本章涵蓋下列主題:

資料服務範例簡介

資料服務範例會針對叢集事件 (如管理動作、應用程式失敗或節點故障),啟動、停止、重新啟動和在叢集的節點之間切換 DNS 應用程式。

應用程式重新啟動由程序監視設備 (PMF) 管理。如果中止的應用程式之數量超過失敗時間間隔內的失敗計數,故障監視器會將含有應用程式資源的資源群組容錯移轉至其他節點。

資料服務範例以使用 nslookup 指令的 PROBE 方法之形式來提供故障監視功能,以確保應用程式運作狀態良好。如果探測方法偵測到 DNS 服務掛機,探測方法會嘗試透過在本機重新啟動 DNS 應用程式來校正此情況。如果在本機重新啟動 DNS 應用程式無法改善情況,並且探測方法重複偵測到服務發生問題,則探測方法會嘗試將服務容錯移轉至叢集中的其他節點。

具體來說,資料服務範例包含以下元素︰

定義資源類型註冊檔案

此範例中的資源類型註冊 (RTR) 檔案定義 DNS 資源類型的靜態配置。此類型的資源將繼承在 RTR 檔案中定義的特性。

當叢集管理員註冊 HA-DNS 檔案服務時,Resource Group Manager (RGM) 將讀取 RTR 檔案中的資訊。

RTR 檔案簡介

RTR 檔案採用明確定義的格式。在此檔案中,首先定義資源類型特性,接著定義系統定義的資源特性,最後定義延伸特性。請參閱 rt_reg(4) 線上手冊以及設定資源特性和資源類型特性,以取得更多資訊。

以下小節將說明 RTR 檔案範例中的特定特性。這些小節提供 RTR 檔案不同部分的清單。如需 RTR 檔案範例內容的完整清單,請參閱資源類型註冊檔案清單

RTR 檔案範例中的資源類型特性

RTR 檔案範例以註釋開頭,其後為定義 HA-DNS 配置的資源類型特性,如以下清單所示。


備註 –

資源群組、資源以及資源類型的特性名稱區分大小寫。當您指定特性名稱時,您可以使用大寫和小寫字母的任意組合。


#
# Copyright (c) 1998-2005 by Sun Microsystems, Inc.
# All rights reserved.
#
# Registration information for Domain Name Service (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;

提示 –

您必須宣告 Resource_type 特性為 RTR 檔案中的第一個項目。否則,資源類型註冊會失敗。


以下資訊說明這些特性︰

未在此 RTR 檔案中指定的資源類型特性 (如 Single_instanceInit_nodesInstalled_nodes) 將設定為預設值。資源類型特性含有資源類型特性的完整清單 (包含其預設值)。

叢集管理員無法變更 RTR 檔案中資源類型特性的值。

RTR 檔案範例中的資源特性

依慣例,您要宣告 RTR 檔案中資源類型特性後面的資源特性。資源特性包含 Sun Cluster 軟體提供之系統定義的特性和您定義的延伸特性。對於任一類型,您可以指定由 Sun Cluster 軟體提供的多個特性屬性,例如最小值、最大值和預設值。

RTR 檔案中系統定義的特性

以下清單顯示了 RTR 檔案範例中系統定義的特性。

# A list of bracketed resource property declarations follows the
# resource type declarations. The property-name declaration must be
# the first attribute after the open curly bracket of each entry.

# The <method>_timeout properties set the value in seconds after which
# the RGM concludes invocation of the method has failed.

# The MIN value for all method timeouts is set to 60 seconds. This
# prevents administrators from setting shorter timeouts, which do not
# improve switchover/failover performance, and can lead to undesired
# RGM actions (false failovers, node reboot, or moving the resource group
# to ERROR_STOP_FAILED state, requiring operator intervention). Setting
# too-short method timeouts leads to a *decrease* in overall availability
# of the data service.
{  
   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;
}

# The number of retries to be done within a certain period before concluding 
# that the application cannot be successfully started on this node.
{
   PROPERTY = Retry_count;
   MIN=0;
   MAX=10;
   DEFAULT=2;
   TUNABLE = ANYTIME; 
}

# Set Retry_interval as a multiple of 60 since it is converted from seconds
# to minutes, rounding up. For example, a value of 50 (seconds)
# is converted to 1 minute. Use this property to time the number of 
# retries (Retry_count).
{
   PROPERTY = Retry_interval;
   MIN=60;
   MAX=3600;
   DEFAULT=300;
   TUNABLE = ANYTIME;
}

{
   PROPERTY = Network_resources_used;
   TUNABLE = AT_CREATION;
   DEFAULT = ““;
}

儘管 Sun Cluster 軟體提供了系統定義的特性,您可以透過使用資源特性屬性設定不同的預設值。請參閱資源特性屬性,以取得您可將其套用至資源特性的屬性之完整清單。

關於 RTR 檔案範例中系統定義的資源特性,請注意以下各點︰

RTR 檔案中的延伸特性

RTR 檔案範例的結尾部分為延伸特性,如下列清單所示。

# Extension Properties

# The cluster administrator must set the value of this property to point to the
# directory that contains the configuration files used by the application.
# For this application, DNS, specify the path of the DNS configuration file on
# PXFS (typically named.conf).
{
   PROPERTY = Confdir;
   EXTENSION;
   STRING;
   TUNABLE = AT_CREATION;
   DESCRIPTION = “The Configuration Directory Path”;
}

# Time out value in seconds before declaring the probe as failed.
{
   PROPERTY = Probe_timeout;
   EXTENSION;
   INT;
   DEFAULT = 120;
   TUNABLE = ANYTIME;
   DESCRIPTION = “Time out value for the probe (seconds)”;
}

RTR 檔案範例定義兩個延伸特性,ConfdirProbe_timeoutConfdir 特性指定 DNS 配置目錄的路徑。此目錄含有 in.named 檔案,DNS 需要此檔案才能成功作業。資料服務範例的 StartValidate 方法在啟動 DNS 前使用此特性驗證配置目錄和 in.named 檔案是否可存取。

配置資料服務時,Validate 方法將驗證新目錄是否可存取。

資料服務範例的 PROBE 方法不是 Sun Cluster 回呼方法,而是使用者定義的方法。因此,Sun Cluster 不提供該方法的 Probe_timeout 特性。您需要定義 RTR 檔案中的延伸特性,以便叢集管理員配置 Probe_timeout 值。

為所有方法提供共用功能性

本小節說明在資料服務範例的所有回呼方法中使用的以下功能性︰

識別指令解譯程式與匯出路徑

Shell 程序檔的第一行必須識別指令解譯程式。資料服務範例中的每個方法程序檔識別指令解譯器,如下所示︰

#!/bin/ksh

應用程式範例中的所有方法程序檔將路徑匯出至 Sun Cluster 二進位檔和程式庫,而非依據使用者的 PATH 設定。

#######################################################################
# MAIN
#######################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

宣告 PMF_TAGSYSLOG_TAG 變數

所有方法程序檔 (Validate 除外) 均使用 pmfadm 啟動或停止資料服務或監視器,同時傳送資源名稱。每個程序檔均會定義變數 PMF_TAG,該變數可以被傳送至 pmfadm 以識別是資料服務還是監視器。

同樣地,每個方法程序檔均使用 logger 指令在系統記錄檔中記錄訊息。每個程序檔均定義變數 SYSLOG_TAG,可以透過 -t 選項將該變數傳送至 logger,以識別記錄訊息的資源之資源類型、資源名稱以及資源群組。

所有方法以相同方式定義 SYSLOG_TAG,如以下程式碼範例所示。dns_probedns_svc_startdns_svc_stopdns_monitor_check 方法如下定義 PMF_TAG (使用 dns_svc_stop 方法的 pmfadmlogger)。

#########################################################################
# MAIN
#########################################################################

PMF_TAG=$RESOURCE_NAME.named

SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

   # Send a SIGTERM signal to the data service and wait for 80% of the
   # total timeout value.
   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”

dns_monitor_startdns_monitor_stopdns_update 方法如下定義 PMF_TAG (使用的 pmfadm 來自 dns_monitor_stop 方法)︰

#####################################################################
# MAIN
#####################################################################

PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME
...
# See if the monitor is running, and if so, kill it. 
if pmfadm -q $PMF_TAG.monitor; then
   pmfadm -s $PMF_TAG.monitor KILL

剖析函數引數

RGM 執行所有回呼方法 (Validate 除外),如下所示︰

method-name -R resource-name -T resource-type-name -G resource-group-name

方法名稱是實施回呼方法的程式之路徑名稱。資料服務為 RTR 檔案中的每個方法指定路徑名稱。這些路徑名稱與由 RT_basedir 特性指定的目錄相對,也位於 RTR 檔案。例如,在資料服務範例的 RTR 檔案中,基底目錄和方法名稱指定如下︰

RT_basedir=/opt/SUNWsample/bin;
Start = dns_svc_start;
Stop =  dns_svc_stop;
...

所有回呼方法引數將作為已標幟的值傳送。-R 引數表示資源實例的名稱。-T 引數表示資源類型。-G 引數表示將資源配置到的群組。請參閱 rt_callbacks(1HA) 線上手冊,以取得有關回呼方法的更多資訊。


備註 –

將使用附加引數 (即呼叫方法時所在的資源和資源群組之特性值) 呼叫 Validate 方法。請參閱處理特性更新,以取得更多資訊。


每個回呼方法均需要一個函數來剖析傳送函數的引數。由於傳送給所有回呼相同的引數,因此資料服務提供一個單一剖析函數,該函數用於應用程式內的所有回呼中。

以下範例顯示在應用程式範例中用於回呼方法的 parse_args() 函數。

#########################################################################
# Parse program arguments.
#
function parse_args # [args ...]
{
      typeset opt

      while getopts 'R:G:T:' opt
      do
             case "$opt" in
             R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
             G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
             T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
             *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                      ;;
             esac
    done
}

備註 –

儘管應用程式範例中的 PROBE 方法是使用者定義的方法 (而不是 Sun Cluster 回呼方法),但是也可透過與回呼方法使用相同的引數來呼叫。因此,該方法含有與其他回呼方法所使用的剖析函數相同的剖析函數。


該剖析函數在 MAIN 中稱為:

parse_args “$@”

產生錯誤訊息

回呼方法應該使用 syslog() 函數將錯誤訊息輸出至一般使用者。資料服務範例中的所有回呼方法均使用 scha_cluster_get 指令擷取用於叢集記錄檔的 syslog() 函數之編號,如下所示︰

SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

該值儲存於 shell 變數 SYSLOG_FACILITY 中,可以用做 logger 指令來在叢集記錄檔中記錄訊息。例如,資料服務範例中的 Start 方法擷取 syslog() 函數並記錄資料服務已啟動的訊息,如下所示︰

SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`
...
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} HA-DNS successfully started"
fi

請參閱 scha_cluster_get(1HA) 線上手冊,以取得更多資訊。

獲取特性資訊

大多數回呼方法需要獲取有關資料服務之資源與資源類型特性的資訊。API 將為此目的提供 scha_resource_get() 函數。

系統定義的特性和延伸特性均可用。系統定義的特性是預先定義的。您可以定義 RTR 檔案中的延伸特性。

當您使用 scha_resource_get() 獲取系統定義的特性值時,您可以透過 -O 選項指定特性名稱。指令將僅傳回特性的。例如,在資料服務範例中,Monitor_start 方法需要找到探測程式,這樣才能啟動該程式。探測程式位於資料服務的基底目錄中,RT_basedir 特性指向該基底目錄。Monitor_start 方法擷取 RT_basedir 的值並將其放入 RT_BASEDIR 變數,如下所示︰

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

對於延伸特性,您必須使用 -O 選項指定某一特性為延伸特性。您還必須提供特性名稱作為最後一個引數。對於延伸特性,指令將傳回特性的類型。例如,在資料服務範例中,探測程式擷取 Probe_timeout 延伸特性的類型和值,並使用 awk 指令將該值僅放入 PROBE_TIMEOUT shell 變數中,如下所示︰

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}'`

控制資料服務

資料服務必須提供 StartPrenet_start 方法來啟動叢集上的應用程式常駐程式,以及 StopPostnet_stop 方法來停止叢集上的應用程式常駐程式。資料服務範例將實施 Start 方法與 Stop 方法。請參閱決定使用哪些 StartStop 方法以取得何時使用 Prenet_startPostnet_stop 的資訊。

Start 方法如何工作

當叢集節點上包含資料服務資源的資源群組置於線上或當資源群組已處於線上狀態並已啟用資源時,RGM 將執行該節點上的 Start 方法。在應用程式範例中,Start 方法將啟動該節點上的 in.named DNS 常駐程式。

本節說明應用程式範例的 Start 方法之主要部分,本小節並不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 Start 方法的完整清單,請參閱Start 方法程式碼清單

Start 方法有何作用

在嘗試啟動 DNS 前,資料服務範例中的 Start 方法會驗證配置目錄和配置檔案 (named.conf) 是否可存取並可用。named.conf 中的資訊對於 DNS 成功作業是必要的。

此回呼方法使用 PMF (pmfadm) 啟動 DNS 常駐程式 (in.named)。如果 DNS 當機或無法啟動,PMF 將在指定的間隔內和規定的次數內嘗試啟動 DNS 常駐程式。重試的次數與間隔時間透過資料服務的 RTR 檔案中的特性來指定。

驗證配置

為了作業,DNS 需要配置目錄內 named.conf 檔案的資訊。因此,在嘗試啟動 DNS 之前,Start 方法將執行某些正常性檢查,以驗證目錄和檔案是否可存取。

Confdir 延伸特性提供配置目錄的路徑。特性本身定義在 RTR 檔案中。但是,當叢集管理員配置資料服務時,會指定其實際位置。

在資料服務範例中,Start 方法透過使用 scha_resource_get() 函數擷取配置目錄的位置。


備註 –

由於 Confdir 是一個延伸特性,因此 scha_resource_get() 將傳回類型與值。awk 指令會擷取此值並將其放入 shell 變數 CONFIG_DIR 中。


# find the value of Confdir set by the cluster administrator at the time of
# adding the resource.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`

# scha_resource_get returns the "type" as well as the "value" for the
# extension properties. Get only the value of the extension property 
CONFIG_DIR=`echo $config_info | awk '{print $2}'`

Start 方法使用 CONFIG_DIR 的值來驗證目錄是否可存取。如果不可存取,Start 會記錄錯誤訊息並以錯誤狀態結束。請參閱Start 退出狀態

# Check if $CONFIG_DIR is accessible.
if [ ! -d $CONFIG_DIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFIG_DIR is missing or not mounted"
   exit 1
fi

在啟動應用程式常駐程式之前,該方法將執行最後的檢查,以驗證 named.conf 檔案是否存在。如果檔案不存在,Start 會記錄一條錯誤訊息並以錯誤狀態結束。

# Change to the $CONFIG_DIR directory in case there are relative
# pathnames in the data files.
cd $CONFIG_DIR

# Check that the named.conf file is present in the $CONFIG_DIR directory
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

啟動應用程式

此方法使用程序管理員功能 (pmfadm) 啟動應用程式。pmfadm 指令可讓您設定在指定的時間框架內可以嘗試重新啟動應用程式的次數。RTR 檔案含有兩個特性︰Retry_count 指定嘗試重新啟動某一應用程式的次數,而 Retry_interval 則指定嘗試重新啟動某一應用程式的時間期間。

Start 方法透過使用 scha_resource_get () 函數擷取 Retry_count Retry_interval 的值並將這些值儲存於 shell 變數中。Start 方法透過使用 -n-t 選項將這些值傳送至 pmfadm

# Get the value for retry count from the RTR file.
RETRY_CNT=`scha_resource_get -O Retry_count -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME`
# Get the value for retry interval from the RTR file. This value is in seconds
# and must be converted to minutes for passing to pmfadm. Note that the 
# conversion rounds up; for example, 50 seconds rounds up to 1 minute.
((RETRY_INTRVAL=`scha_resource_get -O Retry_interval -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME` / 60))

# Start the in.named daemon under the control of PMF. Let it crash and restart
# up to $RETRY_COUNT times in a period of $RETRY_INTERVAL; if it crashes
# more often than that, PMF will cease trying to restart it.
# If there is a process already registered under the tag
# <$PMF_TAG>, then PMF sends out an alert message that the
# process is already running.
pmfadm -c $PMF_TAAG -n $RETRY_CNT -t $RETRY_INTRVAL \
    /usr/sbin/in.named -c named.conf

# Log a message indicating that HA-DNS has been started.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} HA-DNS successfully started"
fi
exit 0

Start 退出狀態

直到基本的應用程式確實執行並且可用時,特別是當其他資料服務附屬於該應用程式時,Start 方法才應以成功狀態結束。驗證是否成功的一個方法是在結束 Start 方法前,探測應用程式以確保其正在執行。對於複雜的應用程式 (如資料庫),請確定將 RTR 檔案中 Start_timeout 特性的值設定得足夠高,為應用程式初始化和從當機中回復留出時間。


備註 –

由於資料服務範例中的應用程式資源 (DNS) 啟動很快,資料服務範例將不會輪詢以驗證在以成功狀態結束前該資源是否正在執行。


如果該方法無法啟動 DNS 並以失敗狀態退出,RGM 將檢查 Failover_mode 特性 (其決定如何反應)。資料服務範例沒有明確設定 Failover_mode 特性,因此該特性具有預設值 NONE (除非叢集管理員置換預設值並指定不同的值)。在這種情況下,RGM 僅會設定資料服務的狀態,而不採取其他任何動作。叢集管理員需要對在同一節點上進行重新啟動或容錯移轉至其他節點。

Stop 方法如何工作

當含有 HA-DNS 資源的資源群組在該節點上處於離線狀態,或如果資源群組處於線上狀態而資源被停用時,RGM 將在叢集節點上執行 Stop 方法。此方法將停止該節點上的 in.named (DNS) 常駐程式。

本節說明應用程式範例的 Stop 方法之主要部分,本小節並不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 Stop 方法的完整清單,請參閱Stop 方法程式碼清單

Stop 方法有何作用

當嘗試停止資料服務時,有兩個需要考量的主要問題。第一個需要考量的問題是提供一個順序關機。完成順序關機的最佳方式是透過 pmfadm 傳送 SIGTERM 訊號。

第二個需要考量的問題是確保資料服務確實已停止,以避免將資料服務置於 Stop_failed 狀態。將資料服務置於此狀態的最佳方式是透過 pmfadm 傳送 SIGKILL 訊號。

資料服務範例中的 Stop 方法會考量這兩項注意事項。它首先傳送 SIGTERM 訊號。如果該訊號無法停止資料服務,則方法將傳送 SIGKILL 訊號。

在嘗試停止 DNS 之前,這個 Stop 方法會確認程序確實正在執行。如果程序正在執行,Stop 將使用 PMF (pmfadm) 來停止程序。

這個 Stop 方法被保證是等冪的。RGM 沒有透過呼叫 Start 方法來首先啟動資料服務,則 RGM 不應呼叫 Stop 方法兩次,但是 RGM 可以呼叫資源上的 Stop 方法,即使資源從未啟動或資源由於其自身原因而中止。因此,即使 DNS 不在執行,這個 Stop 方法仍會以成功狀態退出。

停止應用程式

Stop 方法提供一個停止資料服務的雙重方法:順序方法或平滑方法是透過 pmfadm 使用 SIGTERM 訊號,突然方法或強制方法是使用 SIGKILL 訊號。Stop 方法會獲取 Stop_timeout 值 (Stop 方法必須傳回的時間)。Stop 將此時間的 80% 配置給平滑停止,15% 配置給突然停止 (將 5% 保留),如下程式碼範例所示。

STOP_TIMEOUT='scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME'
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))
((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

Stop 方法使用 pmfadm -q 來 確認 DNS 常駐程式是否正在執行。如果 DNS 常駐程式正在執行,Stop 將首先使用 pmfadm -s 傳送 TERM 訊號以終止 DNS 程序。如果在逾時值的 80% 過期後,此訊號無法終止該程序,則 Stop 將傳送 SIGKILL 訊號。如果在逾時值的 15% 過期後,此訊號也無法終止該程序,則方法將記錄錯誤訊息並以錯誤狀態結束。

如果 pmfadm 終止了程序,則方法將記錄一條程序已停止的訊息並以成功狀態退出。

如果 DNS 程序未在執行,則方法會記錄一條程序未在執行的訊息並無論如何會以成功狀態退出。以下程式碼範例顯示了 Stop 如何使用 pmfadm 停止 DNS 程序。

# See if in.named is running, and if so, kill it. 
if pmfadm -q $PMF_TAG; then
   # Send a SIGTERM signal to the data service and wait for 80% of the
   # total timeout value.
   pmfadm -s $RESOURCE_NAME.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then
      logger -p ${SYSLOG_FACILITY}.err \
          -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
          “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \
           SIGKILL”
      
      # Since the data service did not stop with a SIGTERM signal, use 
      # SIGKILL now and wait for another 15% of the total timeout value.
      pmfadm -s $PMF_TAG -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 
   # The data service is not running as of now. Log a message and 
   # exit success.
   logger -p ${SYSLOG_FACILITY}.err \
           -t [$SYSLOG_TAG] \
           “HA-DNS is not started”

   # Even if HA-DNS is not running, exit success to avoid putting
   # the data service resource in STOP_FAILED State.
   exit 0
fi

# Could successfully stop DNS. Log a message and exit success.
logger -p ${SYSLOG_FACILITY}.err \
    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
    “HA-DNS successfully stopped”
exit 0

Stop 退出狀態

直到基本的應用程式確實停止,特別是當其他資料服務附屬於該應用程式時,Stop 方法才應以成功狀態結束。無法執行此作業將導致資料毀壞。

對於複雜的應用程式 (如資料庫),請確定將 RTR 檔案中 Stop_timeout 特性的值設定的足夠高,以允許應用程式在停止時進行清除所用的時間。

如果此方法無法停止 DNS 並以失敗狀態退出,則 RGM 將檢查 Failover_mode 特性 (其決定如何反應)。資料服務範例沒有明確設定 Failover_mode 特性,因此該特性具有預設值 NONE (除非叢集管理員置換預設值並指定不同的值)。在這種情況下,RGM 只能將資料服務狀態設定為 Stop_failed。叢集管理員需要強制停止應用程式並清除 Stop_failed 狀態。

定義故障監視器

應用程式範例實作基本故障監視器,以監視 DNS 資源 (in.named) 的穩定性。故障監視器由下列元素構成︰

探測程式如何工作

dns_probe 程式將實作一個連續執行的程序,來驗證由資料服務範例控制的 DNS 資源是否正在執行。dns_probedns_monitor_start 方法啟動,當資料服務範例置於離線後,該方法將由 RGM 自動執行。資料服務由 dns_monitor_stop 方法停止,在 RGM 將資料服務範例置於離線前,RGM 會執行該方法。

本節說明應用程式範例的 PROBE 方法之主要部分,不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 PROBE 方法的完整清單,請參閱PROBE 程式程式碼清單

探測程式有何作用

探測在無窮迴圈中執行。它使用 nslookup 驗證正確的 DNS 資源是否正在執行。如果 DNS 正在執行,探測方法將暫停規定的時間間隔 (由 Thorough_probe_interval 系統定義的特性設定) 並再次檢查。如果 DNS 未在執行,此程式將嘗試在本機重新啟動 DNS,或依據嘗試重新啟動的次數,要求 RGM 將資料服務重新置於其他節點。

獲取特性值

此程式需要以下特性的值︰

scha_resource_get() 函數獲取這些特性的值並將其儲存於 shell 變數中,如下所示︰

PROBE_INTERVAL=`scha_resource_get -O Thorough_probe_interval \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAME`

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}'`

DNS_HOST=`scha_resource_get -O Network_resources_used -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME`

RETRY_COUNT=`scha_resource_get -O Retry_count -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

RETRY_INTERVAL=`scha_resource_get -O Retry_interval -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
 $RESOURCEGROUP_NAME`

備註 –

對於系統定義的特性 (如 Thorough_probe_intervalu),scha_resource_get() 函數會僅傳回值。對於延伸特性 (如 Probe_timeout),scha_resource_get() 函數會傳回類型和值。使用 awk 指令將僅獲取值。


檢查服務的可靠性

探測本身是 nslookup 指令的無窮 while 迴圈。在 while 迴圈之前,將會設置一個暫存檔以存放 nslookup 回覆。變數 probefailretries 初始化為 0。

# Set up a temporary file for the nslookup replies.
DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe
probefail=0
retries=0

while 迴圈執行以下作業︰

以下是 while 迴圈碼。

while :
do
   # The interval at which the probe needs to run is specified in the
   # property THOROUGH_PROBE_INTERVAL. Therefore, set the probe to sleep
   # for a duration of THOROUGH_PROBE_INTERVAL.
   sleep $PROBE_INTERVAL

   # Run an nslookup command of the IP address on which DNS is serving.
   hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST \
   > $DNSPROBEFILE 2>&1

      retcode=$?
      if [ $retcode -ne 0 ]; then
            probefail=1
      fi

   # Make sure that the reply to nslookup comes from the HA-DNS
   # server and not from another nameserver mentioned in the 
   # /etc/resolv.conf file.
   if [ $probefail -eq 0 ]; then
# Get the name of the server that replied to the nslookup query.
   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 指令逾時或回覆來自於伺服器而非服務範例的 DNS。在其中任何一種情況下,DNS 伺服器都不會發揮預期的功能,而故障監視器會呼叫 decide_restart_or_failover() 函數,以決定是在本機重新啟動資料服務還是要求 RGM 將資料服務重新置於其他節點。如果 probefail 變數為 0,將產生探測成功的訊息。

   if [ $probefail -ne 0 ]; then
         decide_restart_or_failover
   else
         logger -p ${SYSLOG_FACILITY}.err\
         -t [$SYSLOG_TAG]\
         "${ARGV0} Probe for resource HA-DNS successful"
   fi

decide_restart_or_failover() 函數使用時間間隔 (Retry_interval) 和失敗計數 (Retry_count) 來決定是否在本機上重新啟動 DNS,或要求 RGM 將資料服務遷移至其他節點。此函數將實作以下條件式邏輯。PROBE 程式程式碼清單中的 decide_restart_or_failover() 程式碼清單含有此程式碼。

如果重新啟動的次數達到了時間間隔內的限制次數,函數將要求 RGM 將資料服務重新置於其他節點。如果重新啟動的次數在限制範圍之內,或已超出間隔從而計數器重新開始計數,函數將嘗試重新啟動相同節點上的 DNS。請注意以下有關此函數的資訊:

重新啟動資料服務

restart_service() 函數由 decide_restart_or_failover() 呼叫,用來嘗試在同一節點上重新啟動資料服務。此函數執行以下邏輯︰

function restart_service
{

        # To restart the data service, first verify that the 
        # data service itself is still registered under PMF.
        pmfadm -q $PMF_TAG
        if [[ $? -eq 0 ]]; then
                # Since the TAG for the data service is still registered under
                # PMF, first stop the data service and start it back up again.

                # Obtain the Stop method name and the STOP_TIMEOUT value for
                # this resource.
                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

                # Obtain the START method name and the START_TIMEOUT value for
                # this resource.
                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
                # The absence of the TAG for the dataservice 
                # implies that the data service has already
                # exceeded the maximum retries allowed under PMF.
                # Therefore, do not attempt to restart the
                # data service again, but try to failover
                # to another node in the cluster.
                scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
                        -R $RESOURCE_NAME
        fi

        return 0
}

探測退出狀態

如果資料服務範例的 PROBE 程式嘗試在本機上重新啟動失敗,並且嘗試容錯移轉至其他節點也失敗,則它將以失敗狀態結束。該程式記錄訊息 Failover attempt failed

Monitor_start 方法如何工作

在資料服務範例被置於線上之後,RGM 將呼叫 Monitor_start 方法來啟動 dns_probe 方法。

本小節說明應用程式範例之 Monitor_start 方法的主要部分。本小節並不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 Monitor_start 方法的完整清單,請參閱Monitor_start 方法程式碼清單

Monitor_start 方法有何作用

此方法使用 PMF (pmfadm) 啟動探測。

啟動探測

Monitor_start 方法將獲取 RT_basedir 特性的值,以建構 PROBE 程式的完整路徑名稱。此方法透過使用 pmfadm 的無限重試選項 (-n -1-t -1) 啟動探測, 也就是說,如果探測無法啟動, PMF 將在無限時間內無數次嘗試啟動探測。

# Find where the probe program resides by obtaining the value of the
# RT_basedir property of the resource.
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

# Start the probe for the data service under PMF. Use the infinite retries
# option to start the probe. Pass the resource name, type, and group to the
# probe program. 
pmfadm -c $RESOURCE_NAME.monitor -n -1 -t -1 \
   $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
   -T $RESOURCETYPE_NAME

Monitor_stop 方法如何工作

在資料服務範例置於離線時,RGM 將呼叫 Monitor_stop 方法來停止 dns_probe 的執行。

本小節說明應用程式範例之 Monitor_stop 方法的主要部分。本小節並不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 Monitor_stop 方法的完整清單,請參閱Monitor_start 方法程式碼清單

Monitor_stop 方法有何作用

該方法使用 PMF (pmfadm) 檢查探測是否正在執行,如果探測正在執行,該方法會將其停止。

停止監視器

Monitor_stop 方法使用 pmfadm -q 查看探測是否正在執行,如果是,則使用 pmfadm -s 來停止探測。如果探測已停止,則該方法無論如何會以成功狀態結束,這樣會保證該方法的等?性。


注意 – 注意 –

請確定透過 pmfadm 使用 KILL 訊號來停止探測,而不要使用可以被遮罩的訊號 (如 TERM)。否則,Monitor_stop 方法可能會無限期掛機並最終逾時。原因是當必須重新啟動資料服務或容錯移轉資料服務時,PROBE 方法將呼叫 scha_control()。作為將資料服務置於離線的程序之一部分,scha_control() 呼叫 Monitor_stop 時,如果 Monitor_stop 使用可以被遮罩的訊號,Monitor_stop 會掛機並等待 scha_control() 完成,而 scha_control() 會掛機並等待 Monitor_stop 完成。


# See if the monitor is running, and if so, kill it.
if pmfadm -q $PMF_TAG; then
   pmfadm -s $PMF_TAG 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
         # could successfully stop the monitor. Log a message.
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} Monitor for resource " $RESOURCE_NAME \
            " successfully stopped"
   fi
fi
exit 0

Monitor_stop 退出狀態

如果 Monitor_stop 方法無法停止 PROBE 方法,則前者會記錄一條錯誤訊息。RGM 在主要節點上將資料服務範例置於 MONITOR_FAILED 狀態,這樣可能導致節點發生錯誤。

Monitor_stop 應該在停止探測之後結束。

Monitor_check 方法如何工作

每當 PROBE 方法嘗試將含有資料服務的資源群組容錯移轉至新節點時,RGM 均會呼叫 Monitor_check 方法。

本小節說明應用程式範例之 Monitor_check 方法的主要部分。本小節並不說明所有回呼方法的共用功能性,例如 parse_args() 函數。本小節也不說明如何使用 syslog() 函數。為所有方法提供共用功能性說明共用功能性。

如需 Monitor_check 方法的完整清單,請參閱Monitor_start 方法程式碼清單

必須實作 Monitor_check 方法,這樣其才不會與同步運作的其他方法發生衝突。

Monitor_check 方法呼叫 Validate 方法以驗證 DNS 配置目錄在新節點上是否可用。Confdir 延伸特性指向 DNS 配置目錄。因此,Monitor_check 獲取 Validate 方法的路徑和名稱以及 Confdir 的值。它將傳送此值至 Validate,如以下清單所示。

# Obtain the full path for the Validate method from
# the RT_basedir property of the resource type.
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME \
   -G $RESOURCEGROUP_NAM?

# Obtain the name of the Validate method for this resource.
VALIDATE_METHOD=`scha_resource_get -O Validate \
   -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?

# Obtain the value of the Confdir property in order to start the
# data service. Use the resource name and the resource group entered to
# obtain the Confdir value set at the time of adding the resource.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
 -G $RESOURCEGROUP_NAME Confdir`

# scha_resource_get returns the type as well as the value for extension
# properties. Use awk to get only the value of the extension property.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Call the validate method so that the dataservice can be failed over
# successfully to the new node.
$RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
   -T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR

請參閱Validate 方法如何工作,以瞭解應用程式範例如何驗證節點是否適合於執行資料服務。

處理特性更新

資料服務範例實作 Validate 方法與 Update 方法來處理由叢集管理員進行的特性更新。

Validate 方法如何工作

當建立資源時以及當管理動作更新資源或資源所在群組的特性時,RGM 將呼叫 Validate 方法。在套用建立或更新之前,RGM 將呼叫 Validate,並且在任何節點上此方法的故障退出碼將導致取消建立或更新。

僅當叢集管理員變更資源或資源特性時,RGM 呼叫 Validate,而當 RGM 設定特性或監視器設定資源特性 StatusStatus_msg 時,RGM 不會呼叫 Validate


備註 –

每當 PROBE 方法嘗試將資料服務容錯移轉至新節點時,Monitor_check 方法也會明確呼叫 Validate 方法。


Validate 方法有何作用

RGM 使用附加引數將 Validate 呼叫至傳送到其他方法的引數,包含正在更新的特性和值。因此,資料服務範例中的此方法必須實作不同的 parse_args() 函數來處理附加引數。

資料服務範例中的 Validate 方法確認單一特性 (Confdir 延伸特性)。此特性指向 DNS 配置目錄,該目錄對於 DNS 的成功作業非常重要。


備註 –

由於配置目錄無法在 DNS 正在執行時進行變更,因此 Confdir 特性在 RTR 檔案中宣告為 TUNABLE = AT_CREATION。因此,作為更新結果,永遠不呼叫 Validate 方法來驗證 Confdir 特性,但僅當建立資料服務資源時才可以呼叫此方法。


如果 Confdir 是 RGM 傳送至 Validate 的特性之一,parse_args() 函數將擷取並儲存其值。Validate 驗證 Confdir 的新值所指向的目錄是否可存取以及 named.conf 檔案是否存在於該目錄以及是否含有資料。

如果 parse_args() 函數無法從 RGM 所傳送的指令行引數中擷取 Confdir 的值,則 Validate 仍將嘗試驗證 Confdir 特性。Validate 使用 scha_resource_get() 從靜態配置中獲取 Confdir 的值。Validate 執行相同的檢查以驗證配置目錄是否可存取以及是否含有不為空的 named.conf 檔案。

如果 Validate 以失敗狀態退出,則所有特性 (而非僅僅 Confdir) 的更新或建立都將失敗。

Validate 方法剖析函數

由於 RGM 傳送至 Validate 方法的引數集與傳送至其他回呼方法的引數集不同,所以 Validate 需要與其他方法不同的函數來剖析引數。請參閱 rt_callbacks(1HA) 線上手冊,以取得有關傳送至 Validate 和其他回呼方法之引數的更多資訊。以下程式碼範例顯示了 Validate parse_args() 函數。

#########################################################################
# Parse Validate arguments.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # The method is not accessing any system defined
                  # properties so this is a no-op
                  ;;
         g)
                  # The method is not accessing any resource group
                  # properties, so this is a no-op
                  ;;
         c)
                  # Indicates the Validate method is being called while
                  # creating the resource, so this flag is a no-op.
                  ;;
         u)
                  # Indicates the updating of a property when the
                  # resource already exists. If the update is to the
                  # Confdir property then Confdir should appear in the
                  # command-line arguments. If it does not, the method must
                  # look for it specifically using scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Extension property list. Separate the property and
                  # value pairs using "=" as the separator.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # If the Confdir extension property is found on the
                  # command line, note its value.
                  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
}

正如其他方法具有 parse_args() 函數一樣,此函數提供了旗標 (R) 來擷取資源名稱,(G) 來擷取資源群組名稱和 (T) 來擷取由 RGM 傳送的資源類型。

忽略 r 旗標 (表示系統定義的特性)、g 旗標 (表示資源群組特性) 以及 c 旗標 (表示在建立資源的過程中進行驗證)。忽略它們是因為正在更新資源時會呼叫此方法來驗證延伸特性。

u 旗號將 UPDATE_PROPERTY shell 變數的值設定為 1 (TRUE)。x 旗標將擷取正在更新的特性之名稱和值。如果 Confdir 是正在更新的特性之一,則其值將被放入 CONFDIR shell 變數中,變數 CONFDIR_FOUND 將設定為 1 (TRUE)。

驗證 Confdir

在其 MAIN 函數中,Validate 首先將 CONFDIR 變數設定為空字串,將 UPDATE_PROPERTYCONFDIR_FOUND 設定為 0

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validate 呼叫 parse_args() 來剖析由 RGM 傳送的引數。

parse_args “$@”

Validate 檢查 Validate 是否正在作為特性的更新結果被呼叫。Validate 還檢查 Confdir 延伸特性是否位於指令行上。Validate 驗證 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

# Verify that the Confdir property has a value. If not there is a failure
# and exit with status 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi

備註 –

具體來說,上述程式碼會檢查 Validate 是否正在作為更新結果被呼叫 ($UPDATE_PROPERTY == 1),以及該特性是否在指令行上 (CONFDIR_FOUND == 0)。在這種情況下,程式碼將透過使用 scha_resource_get() 擷取 Confdir 的現有值。如果 Confdir 位於指令行上 (CONFDIR_FOUND == 1),則 CONFDIR 的值會來自 parse_args() 函數,而非 scha_resource_get()


Validate 方法使用 CONFDIR 的值來驗證目錄是否可存取。如果目錄不可存取,Validate 會記錄錯誤訊息並以錯誤狀態結束。

# Check if $CONFDIR is accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

在驗證 Confdir 特性的更新之前,Validate 將執行最終檢查來驗證 named.conf 檔案是否存在。如果檔案不存在,此方法會記錄錯誤訊息並以錯誤狀態結束。

# Check that the named.conf file is present in the Confdir directory
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 會記錄表示成功的訊息並以成功狀態結束。

# Log a message indicating that the Validate method was successful.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

Validate 退出狀態

如果 Validate 以成功狀態 (0) 結束,則將使用新值建立 Confdir。如果 Validate 以失敗狀態 (1) 結束,則不會建立 Confdir 和任何其他特性,並將產生表示原因的訊息。

Update 方法如何工作

RGM 執行 Update 方法來通知正在執行的資源其特性已變更。在叢集管理員成功設定某一資源或其群組的特性後,RGM 執行 Update。將在資源處於線上狀態的節點上呼叫此方法。

Update 方法有何作用

Update 方法不會更新特性。RGM 會更新特性。Update 方法通知正在執行的程序已經發生更新。資料服務範例中唯一受特性更新影響的程序是故障監視器。因此,故障監視器程序是 Update 方法停止並重新啟動的程序。

Update 方法必須驗證故障監視器是否正在執行,然後透過使用 pmfadm 指令強制結束此程序。此方法獲取實作故障監視器之探測程式的位置,然後透過使用 pmfadm 指令將其重新啟動。

使用 Update 停止監視器

Update 方法使用 pmfadm -q 來驗證監視器是否正在執行,如果正在執行,則使用 pmfadm -s TERM 將其強制結束。如果監視器成功終止,會將成功終止的訊息傳送給叢集管理員。如果監視器無法停止,Update 將以失敗狀態結束並將錯誤訊息傳送給叢集管理員。

if pmfadm -q $RESOURCE_NAME.monitor; then

# Kill the monitor that is running already
pmfadm -s $PMF_TAG TERM
    if [ $? -ne 0 ]; then
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$SYSLOG_TAG] \
                 "${ARGV0} Could not stop the monitor"
       exit 1
    else
    # could successfully stop DNS. Log a message.
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                 "Monitor for HA-DNS successfully stopped"
    fi

重新啟動監視器

若要重新啟動監視器,Update 方法必須找到實現探測程式的程序檔。探測程式位於資料服務的基底目錄中,RT_basedir 特性指向該基底目錄。Update 擷取 RT_basedir 的值,並將其儲存於變數 RT_BASEDIR 中,如下所示。

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

Update 透過 pmfadm 使用 RT_BASEDIR 的值來重新啟動 > to restart the dns_probe 程式。如果成功,Update 將以成功狀態結束,並將成功的訊息傳送給叢集管理員。如果 pmfadm 無法啟動探測程式,Update 將以失敗狀態結束並記錄錯誤訊息。

Update 退出狀態

Update 方法失敗將導致資源被置於「更新失敗」狀態。這種狀態對資源的 RGM 管理沒有影響,而是表示透過 syslog() 函數對管理工具所採取的更新動作失敗。