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

등록 정보 업데이트 처리

샘플 데이터 서비스는 클러스터 관리자에 의한 등록 정보 업데이트를 처리하기 위해 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() 함수를 통해 업데이트 작업이 실패했음을 관리 도구에 표시합니다.