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

第 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_timeoutConfdir 用于指定指向 DNS 配置目录的路径。 此目录中包含 DNS 要成功地进行操作所需的 in.named 文件。 在启动 DNS 之前,数据服务样例的 StartValidate 方法将使用此特性来检验配置目录和 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 启动(或停止)数据服务或监视器,并传送资源的名称。 每个脚本中都定义了变量 PMF_TAG,该变量可以传送到 pmfadm 来标识数据服务或监视器。

同样,每个方法脚本都使用 logger 命令通过系统日志记录消息。 每个脚本中都定义了变量 SYSLOG_TAG,该变量可以通过 -t 选项传送到 logger,以标识要记录其消息的资源的资源类型、资源组和资源名称。

所有的方法都用相同的方式定义了 SYSLOG_TAG ,如以下样例所示。 dns_probedns_svc_startdns_svc_stopdns_monitor_check 方法定义的 PMF_TAG 如下所示:(使用的是 dns_svc_stop 方法中的 pmfadmlogger):


#########################################################################
# 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 如下所示(使用的是 dns_monitor_stop 方法中的 pmfadm):


#########################################################################
# 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 方法是使用其它变量(调用该方法的资源和资源组的特性值)调用的。 有关详细信息,请参阅处理特性更新


每个回叫方法都需要一个函数来分析其传送的变量。 因为所有回叫方法都传送相同的变量,所以数据服务提供了一个用于应用程序中所有回叫方法的分析函数。

下面显示了用于应用程序样例中的回叫方法的 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}'`

控制数据服务

数据服务必须提供 StartPrenet_start 方法来激活群集上的应用程序守护程序;还必须提供 StopPostnet_stop 方法来停止群集上的应用程序守护程序。 数据服务样例中实现了 StartStop 方法。 有关何时应使用 Prenet_startPostnet_stop 方法的信息,请参阅决定使用哪种 StartStop 方法

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 文件的信息。 因此,在尝试启动 DNS 之前,Start 方法将执行一些合理性检查,以检验该目录和文件是否可以存取。

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

在启动应用程序守护程序之前,此方法将执行 final 检查,以检验 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_countRetry_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 方法具有幂等性。 虽然如果不先通过调用数据服务的 Start 方法来启动该数据服务,RGM 不应对 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 文件中设置了足够大的 Start_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。 请注意以下关于此函数的信息:

重启数据服务

decide_restart_or_failover() 调用 restart_service() 函数以试图在同一个节点上重新启动数据服务。 该函数执行以下操作。


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 方法

处理特性更新

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

Validate 方法

创建资源时以及通过管理操作更新资源或其资源组的特性时,RGM 将调用 Validate 方法。 在进行创建或更新之前,RGM 将调用 Validate,任何节点上该方法返回失败出口代码都将导致创建或更新操作取消。

仅当通过管理操作更改资源或组特性时(而不是在 RGM 设置特性时或监视器设置资源特性 StatusStatus_msg 时),RGM 才调用 Validate


注意:

PROBE 方法试图将数据服务故障切换到新节点时,Monitor_check 方法还显式调用 Validate 方法。


Validate 概述

RGM 通过不同于传送到其它方法的变量的附加变量(包括所更新的特性和值)调用 Validate。 因此,在数据服务样例中此方法必须实现一个不同的 parse_args() 函数以处理附加变量。

数据服务样例中的 Validate 方法用来检验单个特性 Confdir 扩展特性。 此特性指向 DNS 配置目录,这对于能否成功地进行 DNS 操作来说至关重要。


注意:

因为在 DNS 运行时无法更改配置目录,RTR 文件中 Confdir 特性被声明为 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 需要使用与其它方法的函数不同的函数来分析变量。 有关传送到 Validate 以及其它回叫方法的参数的详细信息,请参阅 rt_callbacks(1HA) 手册页。 以下内容说明了 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) 和用于捕获 RGM 所传送的资源类型的标记 (T)。

将忽略 r 标记(用于表示系统定义的特性)、g 标记(用于表示资源组特性)和 c 标记(用于表示在创建资源时已进行了检验),因为当更新资源时将调用此方法来验证扩展特性。

u 标记将 UPDATE_PROPERTY shell 变量的值设置为 1 (TRUE)。 x 标记捕获所更新的特性的名称和值。 如果 Confdir 是所更新的特性之一,则其值将放置在 CONFDIR shell 变量中,且变量 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,并检查 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 位于命令行上 (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

如果该 final 检查通过,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 工具更新管理工具的操作失败。