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

5장 샘플 데이터 서비스

이 장에서는 in.named 응용 프로그램의 샘플 Sun Cluster 데이터 서비스인 HA-DNS에 대해 설명합니다. in.named 데몬은 도메인 이름 서비스(DNS)의 Solaris 구현입니다. 샘플 데이터 서비스는 자원 관리 API를 사용하여 응용 프로그램의 가용성을 높이는 방법을 보여줍니다.

자원 관리 API는 쉘 스크립트 인터페이스와 C 프로그램 인터페이스를 지원합니다. 이 장의 샘플 응용 프로그램은 쉘 스크립트 인터페이스를 사용하여 작성되었습니다.

이 장은 다음 내용으로 구성되어 있습니다.

샘플 데이터 서비스 개요

샘플 데이터 서비스는 관리 작업, 응용 프로그램 실패 또는 노드 실패와 같은 클러스터 이벤트에 응답하여 클러스터의 노드 사이에서 DNS 응용 프로그램을 시작, 중지, 재시작 및 전환합니다.

응용 프로그램 재시작은 PMF(Process Monitor Facility)에 의해 관리됩니다. 응용 프로그램 중지 수가 실패 시간 창에서 실패 횟수를 초과할 경우 오류 모니터는 응용 프로그램 자원을 포함하는 자원 그룹을 다른 노드로 페일오버합니다.

샘플 데이터 서비스는 nslookup 명령을 사용하여 응용 프로그램 상태가 정상인지 확인하는 PROBE 메소드의 형태로 오류 모니터링 기능을 제공합니다. 정지된 DNS 서비스가 감지된 경우 검사는 DNS 응용 프로그램을 로컬로 재시작하여 문제를 해결하려고 시도합니다. 문제가 해결되지 않고 서비스 문제가 지속적으로 감지되는 경우 검사는 해당 서비스를 클러스터의 다른 노드로 페일오버합니다.

특히 샘플 데이터 서비스는 다음 요소를 포함합니다.

자원 유형 등록 파일 정의

이 예의 자원 유형 등록(RTR) 파일은 DNS 자원 유형의 정적 구성을 정의합니다. 이 유형의 자원은 RTR 파일에 정의된 등록 정보를 상속합니다.

클러스터 관리자가 HA-DNS 데이터 서비스를 등록할 때 RGM은 RTR 파일의 정보를 읽습니다.

RTR 파일 개요

RTR 파일은 잘 정의된 형식을 따릅니다. RTR 파일에서는 지원 유형 등록 정보가 가장 먼저 정의되고 시스템 정의 자원 등록 정보가 그 다음에 정의되며 마지막으로 확장 등록 정보가 정의됩니다. 자세한 내용은 rt_reg(4) 설명서 페이지 및 자원 및 자원 유형 등록 정보 설정을 참조하십시오.

이 절에서는 샘플 RTR 파일의 특정 등록 정보에 대해 설명하며 샘플 RTR 파일의 여러 부분을 보여줍니다. 샘플 RTR 파일 내용의 전체 목록은 자원 유형 등록(RTR) 파일 목록을 참조하십시오.

샘플 RTR 파일의 자원 유형 등록 정보

샘플 RTR 파일은 다음 목록에서처럼 맨 앞에 주석이 있고 HA-DNS 구성을 정의하는 자원 유형 등록 정보가 그 뒤에 옵니다.


주 –

자원 그룹, 자원 및 자원 유형의 등록 정보 이름은 대소문자를 구분하지 않습니다. 등록 정보 이름을 지정하는 경우 대문자와 소문자를 임의로 조합해서 사용할 수 있습니다.


#
# Copyright (c) 1998-2005 by Sun Microsystems, Inc.
# All rights reserved.
#
# Registration information for Domain Name Service (DNS)
#

#pragma ident   “@(#)SUNW.sample   1.1   00/05/24 SMI”

Resource_type = “sample”;
Vendor_id = SUNW;
RT_description = “Domain Name Service on Sun Cluster”;

RT_version =”1.0”; 
API_version = 2;    
Failover = TRUE;

RT_basedir=/opt/SUNWsample/bin;
Pkglist = SUNWsample;

Start         =   dns_svc_start;
Stop          =   dns_svc_stop;

Validate      =   dns_validate;
Update        =   dns_update;

Monitor_start =   dns_monitor_start;
Monitor_stop  =   dns_monitor_stop;
Monitor_check =   dns_monitor_check;

정보 –

RTR 파일의 첫 번째 항목으로 Resource_type 등록 정보를 선언해야 합니다. 그렇지 않으면 자원 유형 등록에 실패합니다.


이러한 등록 정보에 대한 몇 가지 정보는 다음과 같습니다.

Single_instance, Init_nodesInstalled_nodes와 같이 이 RTR 파일에 지정되지 않은 자원 유형 등록 정보는 기본값으로 설정됩니다. 자원 유형 등록 정보에는 자원 유형 등록 정보의 전체 목록이 기본값과 함께 나와 있습니다.

클러스터 관리자는 RTR 파일의 자원 유형 등록 정보 값을 변경할 수 없습니다.

샘플 RTR 파일의 자원 등록 정보

일반적으로 자원 등록 정보는 RTR 파일에서 자원 유형 등록 정보 뒤에 선언됩니다. 자원 등록 정보는 Sun Cluster 소프트웨어가 제공하는 시스템 정의 등록 정보와 개발자가 정의하는 확장 등록 정보를 포함합니다. 어떠한 유형이든 최소값, 최대값 및 기본값과 같이 Sun Cluster 소프트웨어가 제공하는 여러 등록 정보 속성을 지정할 수 있습니다.

RTR 파일의 시스템 정의 등록 정보

다음 목록은 샘플 RTR 파일의 시스템 정의 등록 정보를 보여줍니다.

# A list of bracketed resource property declarations follows the
# resource type declarations. The property-name declaration must be
# the first attribute after the open curly bracket of each entry.

# The <method>_timeout properties set the value in seconds after which
# the RGM concludes invocation of the method has failed.

# The MIN value for all method timeouts is set to 60 seconds. This
# prevents administrators from setting shorter timeouts, which do not
# improve switchover/failover performance, and can lead to undesired
# RGM actions (false failovers, node reboot, or moving the resource group
# to ERROR_STOP_FAILED state, requiring operator intervention). Setting
# too-short method timeouts leads to a *decrease* in overall availability
# of the data service.
{  
   PROPERTY = Start_timeout; 
   MIN=60; 
   DEFAULT=300;
}

{
   PROPERTY = Stop_timeout; 
   MIN=60; 
   DEFAULT=300;
}
{
   PROPERTY = Validate_timeout;
   MIN=60;
   DEFAULT=300;
}
{
   PROPERTY = Update_timeout;
   MIN=60;
   DEFAULT=300;
}
{
   PROPERTY = Monitor_Start_timeout;
   MIN=60;
   DEFAULT=300;
}
{
   PROPERTY = Monitor_Stop_timeout;
   MIN=60;
   DEFAULT=300;
}
{
   PROPERTY = Thorough_Probe_Interval;
   MIN=1;
   MAX=3600;
   DEFAULT=60;
   TUNABLE = ANYTIME;
}

# The number of retries to be done within a certain period before concluding 
# that the application cannot be successfully started on this node.
{
   PROPERTY = Retry_count;
   MIN=0;
   MAX=10;
   DEFAULT=2;
   TUNABLE = ANYTIME; 
}

# Set Retry_interval as a multiple of 60 since it is converted from seconds
# to minutes, rounding up. For example, a value of 50 (seconds)
# is converted to 1 minute. Use this property to time the number of 
# retries (Retry_count).
{
   PROPERTY = Retry_interval;
   MIN=60;
   MAX=3600;
   DEFAULT=300;
   TUNABLE = ANYTIME;
}

{
   PROPERTY = Network_resources_used;
   TUNABLE = AT_CREATION;
   DEFAULT = ““;
}

Sun Cluster 소프트웨어가 시스템 정의 등록 정보를 제공하기는 하지만 자원 등록 정보 속성을 사용하여 다른 기본값을 설정할 수 있습니다. 자원 등록 정보에 적용할 수 있는 전체 속성 목록은 자원 등록 정보 속성을 참조하십시오.

샘플 RTR 파일의 시스템 정의 자원 등록 정보에 대한 다음 사항에 주의하십시오.

RTR 파일의 확장 등록 정보

샘플 RTR 파일의 끝에는 다음과 같은 확장 등록 정보가 있습니다.

# Extension Properties

# The cluster administrator must set the value of this property to point to the
# directory that contains the configuration files used by the application.
# For this application, DNS, specify the path of the DNS configuration file on
# PXFS (typically named.conf).
{
   PROPERTY = Confdir;
   EXTENSION;
   STRING;
   TUNABLE = AT_CREATION;
   DESCRIPTION = “The Configuration Directory Path”;
}

# Time out value in seconds before declaring the probe as failed.
{
   PROPERTY = Probe_timeout;
   EXTENSION;
   INT;
   DEFAULT = 120;
   TUNABLE = ANYTIME;
   DESCRIPTION = “Time out value for the probe (seconds)”;
}

샘플 RTR 파일은 두 개의 확장 등록 정보인 ConfdirProbe_timeout을 정의합니다. Confdir 등록 정보는 DNS 구성 디렉토리의 경로를 지정합니다. 이 디렉토리는 DNS가 성공적으로 작동하는 데 필요한 in.named 파일을 포함합니다. 샘플 데이터 서비스의 StartValidate 메소드는 DNS를 시작하기 전에 이 등록 정보를 사용하여 구성 디렉토리와 in.named 파일에 액세스할 수 있는지 확인합니다.

데이터 서비스가 구성되면 Validate 메소드는 새 디렉토리에 액세스할 수 있는지 확인합니다.

샘플 데이터 서비스의 PROBE 메소드는 Sun Cluster 콜백 메소드가 아니라 사용자 정의 메소드입니다. 따라서 Sun Cluster는 이 메소드에 대한 Probe_timeout 등록 정보를 제공하지 않습니다. 개발자는 클러스터 관리자가 Probe_timeout 값을 구성할 수 있도록 RTR 파일에 확장 등록 정보를 정의해야 합니다.

모든 메소드에 공통 기능 제공

이 절에서는 샘플 데이터 서비스의 모든 콜백 메소드에 사용되는 다음 기능에 대해 설명합니다.

명령 인터프리터 식별 및 경로 내보내기

쉘 스크립트의 첫 번째 줄은 명령 인터프리터를 식별해야 합니다. 샘플 데이터 서비스의 각 메소드 스크립트는 다음과 같이 명령 인터프리터를 식별합니다.

#!/bin/ksh

샘플 응용 프로그램의 모든 메소드 스크립트에서는 사용자의 PATH 설정을 사용하는 대신 Sun Cluster 이진 및 라이브러리에 대한 경로를 내보냅니다.

#######################################################################
# MAIN
#######################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

PMF_TAGSYSLOG_TAG 변수 선언

Validate를 제외한 모든 메소드 스크립트는 pmfadm을 사용하여 데이터 서비스 또는 모니터를 시작하거나 중지하여 자원 이름을 전달합니다. 각 스크립트는 pmfadm에 전달할 수 있는 PMF_TAG 변수를 정의하여 데이터 서비스나 모니터를 식별합니다.

마찬가지로 각 메소드 스크립트는 logger 명령을 사용하여 시스템 로그에 메시지를 기 록합니다. 각 스크립트는 -t 옵션과 함께 logger에 전달할 수 있는 SYSLOG_TAG 변수를 정의하여 메시지가 기록되는 자원의 자원 유형, 자원 이름 및 자원 그룹을 식별합니다.

모든 메소드는 다음 샘플 코드에 표시된 것처럼 동일한 방법으로 SYSLOG_TAG를 정의합니다. dns_probe, dns_svc_start , dns_svc_stopdns_monitor_check 메소드는 다음과 같이 PMF_TAG를 정의합니다(dns_svc_stop 메소드에서 pmfadmlogger를 사용한 경우).

#########################################################################
# MAIN
#########################################################################

PMF_TAG=$RESOURCE_NAME.named

SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

   # Send a SIGTERM signal to the data service and wait for 80% of the
   # total timeout value.
   pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then
      logger -p ${SYSLOG_FACILITY}.info \
          -t [$SYSLOG_TAG] \
          “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \
           SIGKILL”

dns_monitor_start, dns_monitor_stopdns_update 메소드는 다음과 같이 PMF_TAG를 정의합니다(dns_monitor_stop 메소드에서 pmfadm을 사용한 경우).

#####################################################################
# MAIN
#####################################################################

PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME
...
# See if the monitor is running, and if so, kill it. 
if pmfadm -q $PMF_TAG.monitor; then
   pmfadm -s $PMF_TAG.monitor KILL

함수 인자 구문 분석

RGM은 Validate를 제외한 모든 콜백 메소드를 다음과 같이 실행합니다.

method-name -R resource-name -T resource-type-name -G resource-group-name

메소드 이름은 콜백 메소드를 구현하는 프로그램의 경로 이름입니다. 데이터 서비스는 RTR 파일의 각 메소드에 대한 경로 이름을 지정합니다. 이러한 경로 이름은 마찬가지로 RTR 파일에 있는 RT_basedir 등록 정보에 지정된 디렉토리에 상대적입니다. 예를 들어, 샘플 데이터 서비스의 RTR 파일에서 기본 디렉토리 및 메소드 이름은 다음과 같이 지정됩니다.

RT_basedir=/opt/SUNWsample/bin;
Start = dns_svc_start;
Stop =  dns_svc_stop;
...

모든 콜백 메소드 인자는 다음과 같이 플래그가 지정된 값으로 전달됩니다. -R 인자는 자원 인스턴스의 이름을 나타냅니다. -T 인자는 자원 유형을 나타냅니다. -G 인자는 자원이 구성되는 그룹을 나타냅니다. 콜백 메소드에 대한 자세한 내용은 rt_callbacks(1HA) 설명서 페이지를 참조하십시오.


주 –

Validate 메소드는 추가 인자, 즉 메소드가 호출되는 자원 및 자원 그룹의 등록 정보 값과 함께 호출됩니다. 자세한 내용은 등록 정보 업데이트 처리를 참조하십시오.


각 콜백 메소드에는 전달되는 인자를 구분 분석하기 위한 함수가 필요합니다. 모든 콜백에 동일한 인자가 전달되므로 데이터 서비스는 응용 프로그램의 모든 콜백에서 사용되는 단일 구분 분석 함수를 제공합니다.

다음은 샘플 응용 프로그램의 콜백 메소드에 사용되는 parse_args() 함수를 보여줍니다.

#########################################################################
# Parse program arguments.
#
function parse_args # [args ...]
{
      typeset opt

      while getopts 'R:G:T:' opt
      do
             case "$opt" in
             R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
             G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
             T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
             *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                      ;;
             esac
    done
}

주 –

샘플 응용 프로그램의 PROBE 메소드는 Sun Cluster 콜백 메소드가 아니라 사용자 정의 메소드이지만 콜백 메소드와 동일한 인자와 함께 호출됩니다. 따라서 이 메소드는 다른 콜백 메소드에 사용되는 것과 동일한 구문 분석 함수를 포함합니다.


구문 분석 함수는 다음과 같이 MAIN에서 호출됩니다.

parse_args “$@”

오류 메시지 생성

콜백 메소드는 syslog() 함수를 사용하여 오류 메시지를 최종 사용자에게 출력해야 합니다. 샘플 데이터 서비스의 모든 콜백 메소드는 다음과 같이 scha_cluster_get 명령을 사용하여 클러스터 로그에 사용되는 syslog() 함수 번호를 검색합니다.

SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

이 값은 쉘 변수 SYSLOG_FACILITY에 저장되며 logger 명령 기능으로 사용되어 메시지를 클러스터 로그에 기록할 수 있습니다. 예를 들어, 샘플 데이터 서비스의 Start 메소드는 다음과 같이 syslog() 함수를 검색하고 데이터 서비스가 시작되었다는 메시지를 기록합니다.

SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`
...
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} HA-DNS successfully started"
fi

자세한 내용은 scha_cluster_get(1HA) 설명서 페이지를 참조하십시오.

등록 정보에 대한 정보 얻기

대부분의 콜백 메소드는 데이터 서비스의 자원 및 자원 유형 등록 정보에 대한 정보를 얻어야 합니다. API는 이러한 정보를 얻을 수 있도록 scha_resource_get() 함수를 제공합니다.

시스템 정의 등록 정보와 확장 등록 정보를 사용할 수 있습니다. 시스템 정의 등록 정보는 미리 정의되어 있는 반면 확장 등록 정보는 RTR 파일에서 개발자가 직접 정의합니다.

scha_resource_get()을 사용하여 시스템 정의 등록 정보의 값을 얻을 때는 -O 옵션과 함께 등록 정보의 이름을 지정합니다. 이 경우 명령은 등록 정보의 만 반환합니다. 예를 들어, 샘플 데이터 서비스에서 Monitor_start 메소드는 검사 프로그램을 찾아야만 시작할 수 있습니다. 검사 프로그램은 RT_basedir 등록 정보에서 가리키는 데이터 서비스의 기본 디렉토리에 있으므로 Monitor_start 메소드는 다음과 같이 RT_basedir의 값을 검색하여 RT_BASEDIR 변수에 저장합니다.

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

확장 등록 정보의 경우 -O 옵션을 사용하여 확장 등록 정보라고 지정하고 등록 정보의 이름을 마지막 인자로 제공해야 합니다. 이때 명령은 등록 정보의 유형을 모두 반환합니다. 예를 들어, 샘플 데이터 서비스에서 검사 프로그램은 다음과 같이 Probe_timeout 확장 등록 정보의 유형과 값을 검색한 다음 awk 명령을 사용하여 값만 PROBE_TIMEOUT 쉘 변수에 저장합니다.

probe_timeout_info=`scha_resource_get -O Extension \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAME Probe_timeout`
PROBE_TIMEOUT=`echo $probe_timeout_info | awk '{print $2}'`

데이터 서비스 제어

데이터 서비스는 클러스터의 응용 프로그램 데몬을 활성화하기 위한 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 상태를 지워야 합니다.

오류 모니터 정의

샘플 응용 프로그램은 DNS 자원(in.named)의 안정성을 모니터하기 위해 기본 오류 모니터를 구현합니다. 오류 모니터는 다음 요소로 구성됩니다.

검사 프로그램 작동 방식

dns_probe 프로그램은 샘플 데이터 서비스가 제어하는 DNS 자원이 실행 중인지 확인하는 지속적으로 실행되는 프로세스를 구현합니다. dns_probe는 샘플 데이터 서비스가 온라인 상태가 된 후 RGM에서 자동으로 실행하는 dns_monitor_start 메소드에 의해 시작됩니다. 데이터 서비스는 RGM에서 샘플 데이터 서비스를 오프라인 상태로 전환하기 전에 호출하는 dns_monitor_stop 메소드에 의해 중지됩니다.

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

PROBE 메소드의 전체 목록은 PROBE 프로그램 코드 목록을 참조하십시오.

검사 프로그램의 기능

검사는 무한 루프로 실행되며 nslookup을 사용하여 적절한 DNS 자원이 실행 중인지 확인합니다. DNS가 실행 중인 경우 검사는 Thorough_probe_interval 시스템 정의 등록 정보에 의해 설정된 지정된 간격 동안 일시 정지했다가 다시 검사를 수행합니다. DNS가 실행 중이 아닌 경우 이 프로그램은 DNS를 로컬로 다시 시작하기 위해 시도하거나 재시작 시도 횟수에 따라 데이터 서비스를 다른 노드에 재할당하도록 RGM에 요청합니다.

등록 정보 값 얻기

이 프로그램에는 다음 등록 정보 값이 필요합니다.

scha_resource_get() 함수는 다음과 같이 이러한 등록 정보의 값을 검색하여 쉘 변수에 저장합니다.

PROBE_INTERVAL=`scha_resource_get -O Thorough_probe_interval \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAME`

PROBE_TIMEOUT_INFO=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Probe_timeout` 
Probe_timeout=`echo $probe_timeout_info | awk '{print $2}'`

DNS_HOST=`scha_resource_get -O Network_resources_used -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME`

RETRY_COUNT=`scha_resource_get -O Retry_count -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

RETRY_INTERVAL=`scha_resource_get -O Retry_interval -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
 $RESOURCEGROUP_NAME`

주 –

Thorough_probe_interval과 같은 시스템 정의 등록 정보의 경우 scha_resource_get() 함수는 값만 반환합니다. Probe_timeout과 같은 확장 등록 정보의 경우 scha_resource_get() 함수는 유형과 값을 반환합니다. 값만 검색하려면 awk 명령을 사용합니다.


서비스의 안정성 검사

검사 자체는 nslookup 명령의 무한 while 루프입니다. while 루프 앞에서 nslookup 응답을 저장하기 위한 임시 파일이 설정됩니다. probefailretries 변수는 0으로 초기화됩니다.

# Set up a temporary file for the nslookup replies.
DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe
probefail=0
retries=0

while 루프는 다음 작업을 수행합니다.

다음은 while 루프 코드입니다.

while :
do
   # The interval at which the probe needs to run is specified in the
   # property THOROUGH_PROBE_INTERVAL. Therefore, set the probe to sleep
   # for a duration of THOROUGH_PROBE_INTERVAL.
   sleep $PROBE_INTERVAL

   # Run an nslookup command of the IP address on which DNS is serving.
   hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST \
   > $DNSPROBEFILE 2>&1

      retcode=$?
      if [ $retcode -ne 0 ]; then
            probefail=1
      fi

   # Make sure that the reply to nslookup comes from the HA-DNS
   # server and not from another nameserver mentioned in the 
   # /etc/resolv.conf file.
   if [ $probefail -eq 0 ]; then
# Get the name of the server that replied to the nslookup query.
   SERVER=` awk ' $1=="Server:" { print $2 }' \
   $DNSPROBEFILE | awk -F. ' { print $1 } ' `
   if [ -z "$SERVER" ]; then
      probefail=1
      else
         if [ $SERVER != $DNS_HOST ]; then
            probefail=1
         fi
   fi
fi

재시작 및 페일오버 비교

probefail 변수가 0(성공)이 아닌 다른 값일 경우 nslookup 명령이 시간 초과되었거나 샘플 서비스의 DNS가 아닌 다른 서버에서 응답을 보낸 것입니다. 이러한 경우 DNS 서버는 예상대로 작동하지 않으며 오류 모니터는 decide_restart_or_failover() 함수를 호출하여 데이터 서비스를 로컬로 다시 시작할 것인지 아니면 데이터 서비스를 다른 노드로 재할당하도록 RGM에 요청할 것인지 결정합니다. probefail 변수가 0일 경우 검사에 성공했다는 메시지가 생성됩니다.

   if [ $probefail -ne 0 ]; then
         decide_restart_or_failover
   else
         logger -p ${SYSLOG_FACILITY}.err\
         -t [$SYSLOG_TAG]\
         "${ARGV0} Probe for resource HA-DNS successful"
   fi

decide_restart_or_failover() 함수는 시간 창(Retry_interval)과 실패 횟수(Retry_count)를 사용하여 DNS를 로컬로 재시작할 것인지 아니면 데이터 서비스를 다른 노드로 재할당하도록 RGM에 요청할 것인지 결정합니다. 이 함수는 다음 조건부 논리를 구현합니다. PROBE 프로그램 코드 목록decide_restart_or_failover() 코드 목록에 코드가 들어 있습니다.

시간 간격 동안에 재시작 횟수가 한도에 도달할 경우 이 함수는 데이터 서비스를 다른 노드로 재할당하도록 RGM에 요청합니다. 재시작 횟수가 한도 이내이거나 간격이 초과되어 카운트가 다시 시작된 경우 이 함수는 동일한 노드에서 DNS의 재시작을 시도합니다. 이 함수와 관련하여 다음 사항에 주의하십시오.

데이터 서비스 재시작

동일한 노드에서 데이터 서비스를 재시작하기 위해 decide_restart_or_failover()에 의해 restart_service() 함수가 호출됩니다. 이 함수는 다음 논리를 실행합니다.

function restart_service
{

        # To restart the data service, first verify that the 
        # data service itself is still registered under PMF.
        pmfadm -q $PMF_TAG
        if [[ $? -eq 0 ]]; then
                # Since the TAG for the data service is still registered under
                # PMF, first stop the data service and start it back up again.

                # Obtain the Stop method name and the STOP_TIMEOUT value for
                # this resource.
                STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?
                STOP_METHOD=`scha_resource_get -O STOP \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?
                hatimerun -t $STOP_TIMEOUT $RT_BASEDIR/$STOP_METHOD \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
                        -T $RESOURCETYPE_NAME

                if [[ $? -ne 0 ]]; then
                        logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                                “${ARGV0} Stop method failed.”
                        return 1
                fi

                # Obtain the START method name and the START_TIMEOUT value for
                # this resource.
                START_TIMEOUT=`scha_resource_get -O START_TIMEOUT \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?
                START_METHOD=`scha_resource_get -O START \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?
                hatimerun -t $START_TIMEOUT $RT_BASEDIR/$START_METHOD \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
                        -T $RESOURCETYPE_NAME

                if [[ $? -ne 0 ]]; then
                        logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                                “${ARGV0} Start method failed.”
                        return 1
                fi


        else
                # The absence of the TAG for the dataservice 
                # implies that the data service has already
                # exceeded the maximum retries allowed under PMF.
                # Therefore, do not attempt to restart the
                # data service again, but try to failover
                # to another node in the cluster.
                scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
                        -R $RESOURCE_NAME
        fi

        return 0
}

검사 종료 상태

로컬 재시작 시도에 실패하고 다른 노드로 페일오버하려는 시도 역시 실패한 경우 샘플 데이터 서비스의 PROBE 프로그램은 실패 상태로 종료하고 페일오버 시도가 실패했습니다라는 메시지를 기록합니다.

Monitor_start 메소드 작동 방식

RGM은 샘플 데이터 서비스가 온라인 상태가 된 후 Monitor_start 메소드를 호출하여 dns_probe 메소드를 시작합니다.

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

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

Monitor_start 메소드의 기능

이 메소드는 PMF(pmfadm)를 사용하여 검사를 시작합니다.

검사 시작

Monitor_start 메소드는 RT_basedir 등록 정보 값을 가져와서 PROBE 프로그램에 대한 전체 경로 이름을 구성합니다. 이 메소드는 pmfadm의 무한 재시도 옵션(-n -1, -t -1)을 사용하여 검사를 시작하며 이는 검사를 시작하는 데 실패할 경우 PMF에서 시간 제한 없이 검사 시작을 무한대로 시도한다는 것을 의미합니다.

# Find where the probe program resides by obtaining the value of the
# RT_basedir property of the resource.
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

# Start the probe for the data service under PMF. Use the infinite retries
# option to start the probe. Pass the resource name, type, and group to the
# probe program. 
pmfadm -c $RESOURCE_NAME.monitor -n -1 -t -1 \
   $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
   -T $RESOURCETYPE_NAME

Monitor_stop 메소드 작동 방식

RGM은 샘플 데이터 서비스가 오프라인 상태가 되었을 때 Monitor_stop 메소드를 호출하여 dns_probe의 실행을 중지합니다.

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

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

Monitor_stop 메소드의 기능

이 메소드는 PMF(pmfadm)를 사용하여 검사가 실행 중인지 확인하고 검사가 실행 중일 경우 이를 중지합니다.

모니터 중지

Monitor_stop 메소드는 pmfadm -q를 사용하여 검사가 실행 중인지 확인하고 검사가 실행 중일 경우 pmfadm -s를 사용하여 이를 중지합니다. 검사가 이미 중지된 경우에도 이 메소드는 성공적으로 종료하므로 메소드의 멱등성이 보장됩니다.


주의 – 주의 –

TERM과 같은 마스크 가능한 신호가 아니라 KILL 신호를 pmfadm과 함께 사용하여 검사를 중지해야 합니다. 그렇지 않을 경우 Monitor_stop 메소드가 무한대로 정지되고 결국 시간이 초과될 수 있습니다. 이 문제의 원인은 PROBE 메소드가 데이터 서비스를 재시작하거나 페일오버해야 할 경우 scha_control()을 호출하기 때문입니다. scha_control()이 데이터 서비스를 오프라인 상태로 전환하는 과정의 일부로 Monitor_stop을 호출할 때 Monitor_stop이 마스크 가능한 신호를 사용하면 Monitor_stopscha_control()이 완료되기를 기다리면서 일시 정지되고 scha_control()Monitor_stop이 완료되기를 기다리면서 일시 정지됩니다.


# See if the monitor is running, and if so, kill it.
if pmfadm -q $PMF_TAG; then
   pmfadm -s $PMF_TAG KILL
   if [ $? -ne 0 ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} Could not stop monitor for resource " \
            $RESOURCE_NAME
           exit 1
   else
         # could successfully stop the monitor. Log a message.
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} Monitor for resource " $RESOURCE_NAME \
            " successfully stopped"
   fi
fi
exit 0

Monitor_stop 종료 상태

Monitor_stop 메소드는 PROBE 메소드를 중지할 수 없는 경우 오류 메시지를 기록합니다. RGM은 기본 노드에서 샘플 데이터 서비스를 MONITOR_FAILED 상태로 만들며 이로 인해 기본 노드에 패닉이 발생할 수 있습니다.

Monitor_stop은 검사가 중지되기 전까지 종료해서는 안 됩니다.

Monitor_check 메소드 작동 방식

PROBE 메소드가 데이터 서비스를 포함하는 자원 그룹을 새 노드로 페일오버하려고 시도할 때마다 RGM은 Monitor_check 메소드를 호출합니다.

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

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

동시에 실행되는 다른 메소드와 충돌하지 않도록 Monitor_check 메소드를 구현해야 합니다.

Monitor_check 메소드는 새 노드에서 DNS 구성 디렉토리를 사용할 수 있는지 확인하기 위해 Validate 메소드를 호출합니다. Confdir 확장 등록 정보는 DNS 구성 디렉토리를 가리킵니다. 따라서 Monitor_check은 다음에 나온 것처럼 Validate 메소드의 경로 및 이름과 Confdir의 값을 얻은 다음 이 값을 Validate에 전달합니다.

# Obtain the full path for the Validate method from
# the RT_basedir property of the resource type.
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME \
   -G $RESOURCEGROUP_NAM?

# Obtain the name of the Validate method for this resource.
VALIDATE_METHOD=`scha_resource_get -O Validate \
   -R $RESOURCE_NAME -G $RESOURCEGROUP_NAM?

# Obtain the value of the Confdir property in order to start the
# data service. Use the resource name and the resource group entered to
# obtain the Confdir value set 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 extension
# properties. Use awk to get only the value of the extension property.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Call the validate method so that the dataservice can be failed over
# successfully to the new node.
$RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
   -T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR

샘플 응용 프로그램에서 데이터 서비스를 호스트하는 데 특정 노드가 적합한지 확인하는 방법에 대해서는 Validate 메소드 작동 방식을 참조하십시오.

등록 정보 업데이트 처리

샘플 데이터 서비스는 클러스터 관리자에 의한 등록 정보 업데이트를 처리하기 위해 ValidateUpdate 메소드를 구현합니다.

Validate 메소드 작동 방식

RGM은 자원이 만들어질 때와 관리 작업을 통해 자원이나 자원을 포함하는 그룹의 등록 정보가 업데이트될 때 Validate 메소드를 호출합니다. RGM은 작성 또는 업데이트가 적용되기 전에 Validate를 호출하며 임의의 노드에서 이 메소드가 실패 종료 코드를 반환할 경우 작성 또는 업데이트가 취소됩니다.

RGM에서 등록 정보를 설정하거나 모니터가 StatusStatus_msg 자원 등록 정보를 설정할 때가 아니라 클러스터 관리자가 자원 또는 자원 그룹 등록 정보를 변경하는 경우에만 Validate가 호출됩니다.


주 –

Monitor_check 메소드는 PROBE 메소드가 데이터 서비스를 새 노드로 페일오버할 때마다 Validate 메소드를 명시적으로 호출합니다.


Validate 메소드의 기능

RGM은 업데이트 중인 등록 정보와 값을 포함하여 다른 메소드로 전달되는 항목에 대한 추가 인자와 함께 Validate를 호출합니다. 따라서 샘플 데이터 서비스의 이 메소드는 추가 인자를 처리하기 위해 다른 parse_args() 함수를 구현해야 합니다.

샘플 데이터 서비스의 Validate 메소드는 단일 등록 정보, 즉 Confdir 확장 등록 정보를 확인합니다. 이 등록 정보는 DNS의 성공적인 작업에 중요한 DNS 구성 디렉토리를 가리킵니다.


주 –

DNS가 실행 중인 경우 구성 디렉토리를 변경할 수 없기 때문에 Confdir 등록 정보는 RTR 파일에서 TUNABLE = AT_CREATION으로 선언됩니다. 따라서 Validate 메소드는 업데이트 결과로 Confdir 등록 정보를 확인하기 위해 호출되지 않으며 데이터 서비스 자원을 만드는 중에만 호출됩니다.


RGM이 Validate로 전달하는 등록 정보 중 하나가 Confdir인 경우 parse_args() 함수는 해당 값을 검색하여 저장합니다. 그런 다음 ValidateConfdir의 새 값이 가리키는 디렉토리가 액세스 가능한지와 named.conf 파일이 해당 디렉토리에 있으며 데이터를 포함하는지를 확인합니다.

parse_args() 함수가 RGM에서 전달한 명령줄 인자에서 Confdir의 값을 검색할 수 없는 경우에도 ValidateConfdir 등록 정보를 검증하려고 시도합니다. Validatescha_resource_get()을 사용하여 정적 구성에서 Confdir의 값을 얻습니다. 그런 다음 구성 디렉토리가 액세스 가능한지와 비어 있지 않은 named.conf 파일을 포함하는지 확인하기 위해 동일한 검사를 수행합니다.

Validate가 실패 상태로 종료할 경우 Confdir뿐 아니라 모든 등록 정보의 업데이트 또는 작성에 실패합니다.

Validate 메소드 구문 분석 함수

RGM은 다른 콜백 메소드와 달리 여러 인자 집합을 Validate 메소드에 전달하므로 Validate는 다른 메소드에는 없는 인자를 구문 분석하기 위한 함수를 필요로 합니다. Validate 및 다른 콜백 메소드에 전달되는 인자에 대한 자세한 내용은 rt_callbacks(1HA) 설명서 페이지를 참조하십시오. 다음은 Validate parse_args() 함수를 보여주는 코드 샘플입니다.

#########################################################################
# Parse Validate arguments.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # The method is not accessing any system defined
                  # properties so this is a no-op
                  ;;
         g)
                  # The method is not accessing any resource group
                  # properties, so this is a no-op
                  ;;
         c)
                  # Indicates the Validate method is being called while
                  # creating the resource, so this flag is a no-op.
                  ;;
         u)
                  # Indicates the updating of a property when the
                  # resource already exists. If the update is to the
                  # Confdir property then Confdir should appear in the
                  # command-line arguments. If it does not, the method must
                  # look for it specifically using scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Extension property list. Separate the property and
                  # value pairs using "=" as the separator.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # If the Confdir extension property is found on the
                  # command line, note its value.
                  if [ $PROPERTY == "Confdir" ]; then
                           CONFDIR=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                  ;;
         esac
   done
}

다른 메소드의 parse_args() 함수와 마찬가지로 이 함수는 자원 이름을 캡처하는 R 플래그, 자원 그룹 이름을 캡처하는 G 플래그 및 RGM이 전달한 자원 유형을 캡처하는 T 플래그를 제공합니다.

자원을 업데이트하는 동안 확장 등록 정보를 검증하기 위해 이 메소드가 호출되므로 시스템 정의 등록 정보를 나타내는 r 플래그, 자원 그룹 등록 정보를 나타내는 g 플래그 및 자원 작성 도중 수행되는 검증을 나타내는 c 플래그는 무시됩니다.

u 플래그는 UPDATE_PROPERTY 쉘 변수의 값을 1(TRUE)로 설정하며 x 플래그는 업데이트할 등록 정보의 이름과 값을 캡처합니다. 업데이트되는 등록 정보 중 하나가 Confdir인 경우 CONFDIR 쉘 변수에 해당 값이 저장되며 CONFDIR_FOUND 변수가 1(TRUE)로 설정됩니다.

Confdir 검증

MAIN 함수에서 Validate는 먼저 CONFDIR 변수를 빈 문자열로 설정하고 UPDATE_PROPERTY CONFDIR_FOUND0으로 설정합니다.

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

이어서 Validateparse_args()를 호출하여 RGM에서 전달한 인자를 구문 분석합니다.

parse_args “$@”

그런 다음 Validate는 등록 정보 업데이트의 결과로 Validate가 호출되는지와 Confdir 확장 등록 정보가 명령줄에 있었는지를 검사합니다. ValidateConfdir 등록 정보에 값이 있는지 확인한 다음, 값이 없을 경우 오류 메시지와 함께 실패 상태로 종료합니다.

if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Verify that the Confdir property has a value. If not there is a failure
# and exit with status 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi

주 –

특히 앞의 코드는 Validate가 업데이트 결과로 호출되는지($UPDATE_PROPERTY == 1) 및 명령줄에서 등록 정보가 발견되지 않았는지( CONFDIR_FOUND == 0) 확인하여 이에 해당하는 경우 scha_resource_get()을 사용하여 Confdir의 기존 값을 검색합니다. Confdir이 명령줄에서 발견된 경우(CONFDIR_FOUND == 1) scha_resource_get()이 아닌 parse_args() 함수에서 CONFDIR 값을 얻습니다.


그런 다음 Validate 메소드는 CONFDIR 값을 사용하여 디렉토리에 액세스할 수 있는지 확인합니다. 디렉토리에 액세스할 수 없는 경우 Validate는 오류 메시지를 기록하고 오류 상태로 종료합니다.

# Check if $CONFDIR is accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

Confdir 등록 정보의 업데이트를 검증하기 전에 Validatenamed.conf 파일이 존재하는지 확인하는 최종 검사를 수행하여파일이 없는 경우 이 메소드는 오류 메시지를 기록하고 오류 상태로 종료합니다.

# Check that the named.conf file is present in the Confdir directory
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} File $CONFDIR/named.conf is missing or empty"
         exit 1
fi

최종 검사에 통과한 경우 Validate는 성공을 나타내는 메시지를 기록하고 성공 상태로 종료합니다.

# Log a message indicating that the Validate method was successful.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

Validate 종료 상태

Validate가 성공(0) 상태로 종료할 경우 새 값으로 Confdir이 작성됩니다. Validate가 실패(1) 상태로 종료할 경우 Confdir 및 다른 등록 정보가 만들어지지 않으며 그 이유를 나타내는 메시지가 생성됩니다.

Update 메소드 작동 방식

RGM은 해당 등록 정보가 변경되었음을 실행 중인 자원에 알리기 위해 Update 메소드를 실행합니다. RGM은 클러스터 관리자가 자원 또는 자원 그룹의 등록 정보를 설정하는 데 성공한 후에 Update를 실행합니다. 이 메소드는 자원이 온라인 상태인 노드에서 호출됩니다.

Update 메소드의 기능

Update 메소드는 등록 정보를 업데이트하지 않으며 이는 RGM에 의해 수행됩니다. Update 메소드는 실행 중인 프로세스에 업데이트가 발생했음을 알립니다. 샘플 데이터 서비스에서 등록 정보 업데이트의 영향을 받는 유일한 프로세스는 오류 모니터이며, 따라서 오류 모니터 프로세스는 Update 메소드에 의해 중지 및 재시작됩니다.

Update 메소드는 오류 모니터가 실행 중인지 확인한 다음 pmfadm 명령을 사용하여 이를 중지해야 합니다. 이 메소드는 오류 모니터를 구현하는 검사 프로그램의 위치를 검색한 다음 pmfadm 명령을 사용하여 오류 모니터를 재시작합니다.

Update를 사용하여 모니터 중지

Update 메소드는 pmfadm -q를 사용하여 모니터가 실행 중인지 확인하고 모니터가 실행 중일 경우 pmfadm -s TERM을 사용하여 이를 중지합니다. 모니터가 성공적으로 종료하면 해당 결과에 대한 메시지가 클러스터 관리자에게 보내집니다. 모니터를 중지할 수 없는 경우 Update는 실패 상태로 종료하고 오류 메시지를 클러스터 관리자에게 보냅니다.

if pmfadm -q $RESOURCE_NAME.monitor; then

# Kill the monitor that is running already
pmfadm -s $PMF_TAG TERM
    if [ $? -ne 0 ]; then
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$SYSLOG_TAG] \
                 "${ARGV0} Could not stop the monitor"
       exit 1
    else
    # could successfully stop DNS. Log a message.
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                 "Monitor for HA-DNS successfully stopped"
    fi

모니터 다시 시작

모니터를 다시 시작하려면 Update 메소드에서 검사 프로그램을 구현하는 스크립트를 찾아야 합니다. 검사 프로그램은 RT_basedir 등록 정보에서 가리키는 데이터 서비스의 기본 디렉토리에 있으므로 Update는 다음과 같이 RT_basedir의 값을 검색하여 RT_BASEDIR 변수에 저장합니다.

RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

그런 다음 Updatepmfadm과 함께 RT_BASEDIR을 사용하여 dns_probe 프로그램을 재시작합니다. 성공할 경우 Update는 성공 상태로 종료하고 해당 결과에 대한 메시지를 클러스터 관리자에게 보냅니다. pmfadm이 검사 프로그램을 시작할 수 없는 경우 Update는 실패 상태로 종료하고 오류 메시지를 기록합니다.

Update 종료 상태

Update 메소드가 실패하면 자원이 “업데이트 실패” 상태가 됩니다. 이 상태는 자원의 RGM 관리에 영향을 주지 않지만 syslog() 함수를 통해 업데이트 작업이 실패했음을 관리 도구에 표시합니다.