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

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 状态。