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

데이터 서비스 제어

데이터 서비스는 클러스터의 응용 프로그램 데몬을 활성화하기 위한 Start 또는 Prenet_start 메소드와 클러스터의 응용 프로그램 데몬을 중지하기 위한 Stop 또는 Postnet_stop 메소드를 제공해야 합니다. 샘플 데이터 서비스는 StartStop 메소드를 구현합니다. Prenet_startPostnet_stop을 대신 사용할 수 있는 경우에 대한 자세한 내용은 사용할 StartStop 메소드 결정을 참조하십시오.

Start 메소드 작동 방식

데이터 서비스 자원을 포함하는 자원 그룹이 노드에서 온라인 상태가 되거나 자원 그룹이 이미 온라인 상태에서 자원이 활성화되는 경우 RGM은 해당 클러스터 노드에서 Start 메소드를 실행합니다. 샘플 응용 프로그램의 Start 메소드는 해당 노드에서 in.named(DNS) 데몬을 활성화합니다.

이 절에서는 샘플 응용 프로그램에 사용된 Start 메소드의 주요 부분에 대해 설명합니다. parse_args() 함수, syslog() 함수와 같이 모든 콜백 메소드에 공통된 기능은 다루지 않습니다. 공통된 기능에 대해서는 모든 메소드에 공통 기능 제공에서 설명합니다.

Start 메소드의 전체 목록은 Start 메소드 코드 목록을 참조하십시오.

Start 메소드의 기능

샘플 데이터 서비스의 Start 메소드는 DNS를 시작하기 전에 구성 디렉토리와 구성 파일(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 명령은 값만 검색하여 쉘 변수인 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

응용 프로그램 데몬을 시작하기 전에 이 메소드는 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 값을 검색하고 이러한 값을 쉘 변수에 저장합니다. 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가 실행 중인지 확인하기 위해 폴링을 수행하지 않습니다.


이 메소드가 DNS를 시작하지 못하고 실패 상태로 종료할 경우 RGM은 대응 방법을 결정하는 Failover_mode 등록 정보를 검사합니다. 샘플 데이터 서비스는 Failover_mode 등록 정보를 명시적으로 설정하지 않으므로 클러스터 관리자가 기본값을 무시하고 다른 값을 지정하지 않은 경우 이 등록 정보는 기본값 NONE을 가집니다. 이 경우 RGM은 데이터 서비스의 상태를 설정하는 것 외에 다른 조치를 취하지 않습니다. 동일한 노드에서 재시작하거나 다른 노드로 페일오버하려면 클러스터 관리자가 해당 작업을 시작해야 합니다.

Stop 메소드 작동 방식

RGM은 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은 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_NAME'
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))
((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

Stop 메소드는 pmfadm -q를 사용하여 DNS 데몬이 실행 중인지 확인합니다. DNS 데몬이 실행 중이면 Stop은 먼저 DNS 프로세스를 종료하기 위해 pmfadm -s를 사용하여 TERM 신호를 보냅니다. 시간 초과값의 80%가 지난 후에도 이 신호가 프로세스를 종료하지 못할 경우 StopSIGKILL 신호를 보냅니다. 이 신호도 시간 초과값의 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 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 파일의 Stop_timeout 등록 정보 값을 충분히 높게 설정해야 합니다.

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