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 的成功操作是必需的。

该回调方法使用 PMF (pmfadm) 启动 DNS 守护进程 (in.named)。如果 DNS 崩溃或无法启动,则 PMF 将在指定的时间间隔内尝试按指定的次数启动 DNS 守护进程。重试的次数和时间间隔都是由数据服务的 RTR 文件中的属性指定的。

检验配置

要进行操作,DNS 需要位于配置目录下的 named.conf 文件中的信息。因此,Start 方法在尝试启动 DNS 之前,将执行一些完整性检查,以验证目录和文件是否可访问。

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_count 指定尝试重新启动应用程序的次数,Retry_interval 指定执行此操作的时间间隔。

Start 方法使用 scha_resource_get() 函数检索 Retry_countRetry_interval 的值,并将其值存储于 shell 变量中。Start 方法使用 -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 资源的资源组在群集节点上脱机时,或当该资源组处于联机状态但资源已被禁用时,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 方法来启动数据服务的情况下两次调用 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 文件中设置了足够大的 Start_timeout 属性值,使应用程序有足够长的时间在停止时进行清除。

如果此方法无法停止 DNS 并在失败状态下退出,RGM 将检查用来确定如何作出反应的 Failover_mode 属性。数据服务样例不会明确设置 Failover_mode 属性,因此该属性的默认值为 NONE(除非群集管理员覆盖了默认值并指定了其他值)。这种情况下,RGM 仅将数据服务的状态设置为 Stop_failed,而不会采取其他操作。群集管理员需要强制停止应用程序并清除 Stop_failed 状态。