Sun Cluster 数据服务开发者指南(适用于 Solaris OS)

处理属性更新

数据服务样例执行 ValidateUpdate 方法,以处理群集管理员对属性的更新。

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 的值。Validate 执行同样的检查,验证配置目录是否可访问并且是否包含非空文件 named.conf

如果 Validate 在失败状态下退出,所有属性(而不仅仅是 Confdir)的更新或创建操作都将失败。

Validate 方法分析函数

由于 RGM 向 Validate 方法传递了一组与其他回调方法不同的参数,因此 Validate 需要与其他方法不同的函数来解析这些参数。有关传递给 Validate 和其他回调方法的参数的更多信息,请参见 rt_callbacks(1HA) 手册页。以下样例代码显示了 Validateparse_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 是要更新的属性之一,其值将被放于 shell 变量 CONFDIR 中,并且变量 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 将执行 final 检查来检验 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 使用 RT_BASEDIR 的值和 pmfadm 重新启动 dns_probe 程序。如果成功,Update 将以成功状态退出并向群集管理员发送一条描述该结果的消息。如果 pmfadm 无法启动探测程序,Update 将以失败状态退出并记录一条错误消息。

Update 退出状态

Update 方法的失败将导致资源处于“更新失败”状态。该状态对资源的 RGM 管理没有影响,但是会通过 syslog() 函数将更新操作的失败告知管理工具。