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

控制数据服务

数据服务必须提供 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 状态。