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

控制資料服務

資料服務必須提供 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 狀態。