Solaris OS용 Sun Cluster 데이터 서비스 개발 안내서

Stop 메소드

Stop 메소드는 HA-DNS 자원을 포함하는 자원 그룹이 노드에서 오프라인이 되거나 자원 그룹이 온라인이 된 상태에서 자원이 비활성화되는 경우 해당 클러스터 노드에서 호출됩니다. 이 메소드는 해당 노드에서 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 메소드는 멱등성이 보장됩니다. 먼저 Start 메소드 호출을 통해 데이터 서비스를 시작하지 않은 채 RGM에서 Stop 메소드를 두 번 호출해서는 안 되지만 자원이 시작된 적이 없거나 저절로 중지된 경우에도 해당 자원에서 Stop 메소드를 호출할 수 있습니다. 따라서 이 Stop 메소드는 DNS가 실행 중이 아닌 경우에도 성공 상태로 종료합니다.

응용 프로그램 중지

Stop 메소드는 데이터 서비스를 중지하기 위한 2계층 방식, 즉 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 데몬이 실행 중인지 확인합니다. DNS 데몬이 실행 중이면 Stop 메소드는 우선적으로 DNS 프로세스를 종료하기 위해 pmfadm -s를 사용하여 TERM 신호를 보냅니다. 시간 초과값의 80%가 지난 후에도 이 신호가 프로세스를 종료하지 못할 경우 Stop은 SIGKILL 신호를 보냅니다. 시간 초과값의 15% 이내에 이 신호도 프로세스를 종료하지 못할 경우 이 메소드는 오류 메시지를 기록하고 오류 상태로 종료합니다.

pmfadm이 프로세스를 종료할 경우 이 메소드는 프로세스가 중지되었다는 메시지를 기록하고 성공 상태로 종료합니다.

DNS 프로세스가 실행 중이 아니면 이 메소드는 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 파일의 Stop_timeout 등록 정보 값을 충분히 높게 설정해야 합니다.

이 메소드가 DNS를 중지하지 못하고 실패 상태로 종료할 경우 RGM은 대응 방법을 결정하는 Failover_mode 등록 정보를 검사합니다. 샘플 데이터 서비스는 Failover_mode 등록 정보를 명시적으로 설정하지 않으므로 클러스터 관리자가 기본값을 무시하고 다른 값을 지정하지 않은 경우 이 등록 정보는 기본값 NONE을 가집니다. 이 경우 RGM은 데이터 서비스의 상태를 Stop_failed로 설정하는 것 외에 다른 조치를 취하지 않습니다. 응용 프로그램을 강제로 중지하고 Stop_failed 상태를 지우려면 사용자 작업이 필요합니다.