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

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 狀態。