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

處理屬性更新

資料服務範例實現 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 工具指示對管理工具的更新動作失敗。