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

第 5章 資料服務範例

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

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

本章包含以下資訊:

資料服務範例概觀

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

應用程式重新啟動由程序監視器工具 (PMF) 管理。 如果應用程式失效數超過了故障時間視窗中的故障數,故障監視器會將包含應用程式資源的資源群組故障轉移至其他節點。

資料服務範例以 PROBE 方法的形式提供故障監視功能。 該方法使用 nslookup 指令確保應用程式狀況正常。 如果探測器探測到掛起的 DNS 服務,它會嘗試透過在本機重新啟動 DNS 應用程式來校正此情形。 如果這樣沒有改善情形並且探測器多次探測到服務的問題,則探測器會嘗試將服務故障轉移至該叢集中的其他節點。

具體來說,資料服務範例包含:

定義資源類型註冊檔案

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

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

RTR 檔案概觀

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

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

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

如以下清單所示,RTR 檔案範例以註釋開始,其後跟隨用於定義 HA-DNS 配置的資源類型屬性。

#
# Copyright (c) 1998-2004 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 檔案中的第一個項目。 否則,資源類型的註冊將會失敗。



註解 –

RGM 處理屬性名稱時不區分大小寫。 在 Sun 提供的 RTR 檔案中,除了方法名稱,用於屬性的慣例是名稱的第一個字母大寫,而其餘的字母小寫。 方法名稱以及屬性性質包含的都是大寫字母。


以下是有關這些屬性的某些資訊:

未在此 RTR 檔案中指定的資源類型屬性 (如 Single_instanceInit_nodesInstalled_nodes) 將取得它們的預設值。 請參閱表 A–1,以取得資源類型屬性的完整清單,其中包含它們的預設值。

叢集管理員無法變更 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_timeout 兩個延伸屬性。 Confdir 指定 DNS 配置目錄的路徑。 此目錄包含 in.named 檔案,DNS 需要此檔案才能成功執行。 資料服務範例的 Start 方法與 Validate 方法都將使用此屬性,以驗證在啟動 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 來啟動 (或停止) 資料服務或監視器,並傳送資源的名稱。 每個程序檔都定義一個可傳送至 pmfadm 的變數 PMF_TAG, 以識別資料服務或監視器。

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

所有方法都將以相同的方式定義 SYSLOG_TAG,如以下範例所示。 dns_probedns_svc_startdns_svc_stopdns_monitor_check 方法按如下所示定義 PMF_TAG (pmfadmlogger 的使用源自 dns_svc_stop 方法):


#########################################################################
# 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 方法是使用其他引數 (呼叫 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}'`

控制資料服務

資料服務必須提供 Start 方法或 Prenet_start 方法來啟動叢集上的應用程式常駐程式,並提供 Stop 方法或 Postnet_stop 方法來停止叢集上的應用程式常駐程式。 資料服務範例將實施 Start 方法與 Stop 方法。 請參閱決定要使用的 StartStop 方法,以取得有關您何時要使用 Prenet_start 方法與 Postnet_stop 方法來取代以上兩個方法的資訊。

Start 方法

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

本節說明應用程式範例的 Start 方法之主要部分, 但未說明如為所有方法提供共用功能性中所描述的所有回呼方法的共用功能性,如 parse_args() 函式與獲取 syslog 工具。

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

Start 概觀

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

此回呼方法使用程序監視器工具 (pmfadm) 來啟動 DNS 常駐程式 (in.named)。 如果 DNS 當機或無法啟動,則 PMF 會嘗試在指定的間隔時間啟動 DNS 指定的次數。 重試的次數和間隔時間均由資料服務的 RTR 檔案中的屬性指定。

驗證配置

為了執行作業,DNS 需要配置目錄中 named.conf 檔案的資訊。 因此,Start 方法將執行一些完整檢查,以驗證在嘗試啟動 DNS 之前目錄與檔案是否均可存取。

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_countRetry_interval 的值,並將它們的值儲存於 shell 變數中。 然後它使用 -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 資源的資源群組在叢集節點上處於離線狀態時,或資源群組處於線上狀態而資源被停用時,將在該叢集節點上呼叫 Stop 方法。 此方法將在該節點上停止 in.named (DNS) 常駐程式。

本節說明應用程式範例的 Stop 方法之主要部分, 但未說明如為所有方法提供共用功能性中所描述的所有回呼方法的共用功能性,如 parse_args() 函式與獲取 syslog 工具。

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

Stop 概觀

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

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

資料服務範例中的 Stop 方法將考量這兩個問題。 該方法首先發送 SIGTERM 訊號。 如果該訊號無法停止資料服務,則該方法將傳送 SIGKILL 訊號。

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

這個 Stop 方法被保證是等冪的。 儘管 RGM 不應該在未首先透過呼叫資料服務的 Start 方法來啟動資料服務的情況下呼叫 Stop 方法兩次,但他仍可以呼叫資源上的 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_NAM?
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))

((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

Stop 方法使用 pmfadm -q 來 確認 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 UNSUCCESFUL”
          
          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 會在資料服務範例離線之前呼叫該方法。

本節說明應用程式範例的 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_interval),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 程式將以失敗狀態結束。 該程式將會記錄訊息「故障轉移嘗試失敗」。

Monitor_start 方法

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

本節說明應用程式範例的 Monitor_start 方法之主要部分, 但未說明如為所有方法提供共用功能性中所描述的所有回呼方法的共用功能性,如 parse_args() 函式與獲取 syslog 工具。

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

Monitor_start 概觀

該方法將使用程序監視器工具 (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_stop 方法

Monitor_stop 概觀

該方法使用程序監視器工具 (pmfadm) 查看探測是否正在執行,如果是,則停止探測。

停止監視器

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


# 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


小心 – 小心 –

確定搭配 pmfadm 使用 KILL 訊號與而不是遮罩訊號 (如 TERM) 來停止探測。 否則,Monitor_stop 方法可能無限期地掛起並最終逾時。 出現此問題的原因是,當有必要重新啟動資料服務或故障轉移資料服務時,PROBE 方法呼叫 scha_control()。 當 scha_control() 呼叫 Monitor_stop 作為使資料服務離線程序的一部分時,如果 Monitor_stop 使用遮罩訊號,它會掛起等待 scha_control() 完成,scha_control() 會掛起等待 Monitor_stop 完成。


Monitor_stop 退出狀態

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

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

Monitor_check 方法

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

本節說明應用程式範例的 Monitor_check 方法之主要部分, 但未說明如為所有方法提供共用功能性中所描述的所有回呼方法的共用功能性,如 parse_args() 函式與獲取 syslog 工具。

如需 Monitor_check 方法的完整清單,請參閱Monitor_check 方法

必須實現 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 不會呼叫該方法。


註解 –

每當 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 的值。 然後,它將執行相同的檢查,以確認配置目錄是可存取的,並包含非空的 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

ValidateMAIN 函式中,Validate 首先將 CONFDIR 變數設定為空字串,並將 UPDATE_PROPERTYCONFDIR_FOUND 設定為 0。


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

然後 Validate 將呼叫 parse_args(),以剖析 RGM 傳送的引數。


parse_args “$@”

然後 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


註解 –

具體地說,前面的程式碼將檢查是否由於更新 ($UPDATE_PROPERTY == 1 ) 而呼叫 Validate,是否在指令行 (CONFDIR_FOUND == 0) 上找到屬性,在此情況下,它會使用 scha_resource_get() 擷取 Confdir 的現有值。 如果在指令行 (CONFDIR_FOUND == 1) 上找到 Confdir,則 CONFDIR 的值將來自 parse_args() 函式,而非來自 scha_resource_get ()


然後 Validate 方法將使用 CONFIG_DIR 的值來驗證目錄是否可存取。 如果目錄是不可存取的,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 方法必須驗證故障監視器是否正在執行,然後使用 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 的值,來重新啟動 dns_probe 程式。 如果成功,Update 將以成功狀態退出,並將一條大意為此的訊息發送至使用者管理員。 如果 pmfadm 無法啟動探測程式,則 Update 將以失敗狀態退出並記錄一條錯誤訊息。

Update 退出狀態

Update 方法失敗將導致資源被置於「更新失敗」狀態。 該狀態對資源的 RGM 管理沒有影響,但透過 syslog 工具指示對管理工具的更新動作失敗。