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에 요청합니다.
이 프로그램에는 다음 등록 정보 값이 필요합니다.
Thorough_probe_interval – 검사가 일시 정지하는 기간 설정
Probe_timeout – 검사를 수행하는 nslookup 명령에서 검사의 시간 초과값 적용
Network_resources_used – DNS가 실행 중인 IP 주소 검색
Retry_count 및 Retry_interval – 재시작 시도 횟수 및 이러한 시도가 계산되는 기간 지정
RT_basedir – PROBE 프로그램과 gettime 유틸리티가 포함된 디렉토리 검색
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 응답을 저장하기 위한 임시 파일이 설정됩니다. probefail 및 retries 변수는 0으로 초기화됩니다.
# Set up a temporary file for the nslookup replies. DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe probefail=0 retries=0
while 루프는 다음 작업을 수행합니다.
검사의 일지 정지 간격을 설정합니다.
hatimerun을 사용하여 nslookup을 시작하고 Probe_timeout 값을 전달하며 대상 호스트를 식별합니다.
nslookup 반환 코드의 성공 또는 실패에 기초하여 probefail 변수를 설정합니다.
probefail이 1 (실패)로 설정된 경우 다른 DNS 서버가 아닌 샘플 데이터 서비스에서 nslookup에 대한 응답이 오는지 확인합니다.
다음은 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() 코드 목록에 코드가 들어 있습니다.
첫 번째 실패인 경우 데이터 서비스를 다시 시작합니다. 오류 메시지를 기록하고 retries 변수에서 카운터를 증가시킵니다.
첫 번째 실패가 아니지만 창이 초과된 경우 데이터 서비스를 다시 시작합니다. 오류 메시지를 기록하고 카운터를 재설정한 다음 창을 진행합니다.
시간이 여전히 창 안에 있고 재시도 카운터가 초과된 경우 다른 노드로 페일오버합니다. 페일오버에 실패한 경우 오류를 기록하고 상태 1(실패)로 검사 프로그램을 종료합니다.
시간이 여전히 창 안에 있지만 재시도 카운터가 초과되지 않은 경우 데이터 서비스를 다시 시작합니다. 오류 메시지를 기록하고 retries 변수에서 카운터를 증가시킵니다.
시간 간격 동안에 재시작 횟수가 한도에 도달할 경우 이 함수는 데이터 서비스를 다른 노드로 재할당하도록 RGM에 요청합니다. 재시작 횟수가 한도 이내이거나 간격이 초과되어 카운트가 다시 시작된 경우 이 함수는 동일한 노드에서 DNS의 재시작을 시도합니다. 이 함수와 관련하여 다음 사항에 주의하십시오.
재시작 간의 시간을 추적하기 위해 gettime 유틸리티가 사용됩니다. 이 유틸리티는 RT_basedir 디렉토리에 있는 C 프로그램입니다.
Retry_count 및 Retry_interval 시스템 정의 자원 등록 정보는 재시작 시도 횟수와 이러한 시도가 계산되는 간격을 결정합니다. 이러한 등록 정보의 기본값은 RTR 파일에서 5분(300초) 동안 두 번 시도를 수행하는 것이지만 클러스터 관리자가 값을 변경할 수 있습니다.
동일한 노드에서 데이터 서비스를 다시 시작하기 위해 restart_service() 함수가 호출됩니다. 이 함수에 대한 자세한 내용은 다음 절, 데이터 서비스 재시작을 참조하십시오.
scha_control() API 함수는 GIVEOVER 옵션과 함께 사용되어 샘플 데이터 서비스를 포함하는 자원 그룹을 오프라인 상태로 전환하고 다른 노드에서 다시 온라인 상태로 전환합니다.
동일한 노드에서 데이터 서비스를 재시작하기 위해 decide_restart_or_failover()에 의해 restart_service() 함수가 호출됩니다. 이 함수는 다음 논리를 실행합니다.
데이터 서비스가 여전히 PMF에 등록되어 있는지 확인합니다. 데이터 서비스가 여전히 등록되어 있는 경우 다음 작업을 수행합니다.
데이터 서비스의 Stop 메소드 이름과 Stop_timeout 값을 얻습니다.
hatimerun을 사용하여 데이터 서비스에 대한 Stop 메소드를 시작함으로써 Stop_timeout 값을 전달합니다.
데이터 서비스가 성공적으로 중지된 경우 데이터 서비스의 Start 메소드 이름과 Start_timeout 값을 얻습니다.
hatimerun을 사용하여 데이터 서비스에 대한 Start 메소드를 시작함으로써 Start_timeout 값을 전달합니다.
데이터 서비스가 더 이상 PMF에 등록되지 않은 경우 데이터 서비스가 PMF에서 허용되는 최대 재시도 횟수를 초과했다는 것을 의미합니다. 따라서 scha_control() 함수가 GIVEOVER 옵션과 함께 호출되어 데이터 서비스를 다른 노드로 페일오버합니다.
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 프로그램은 실패 상태로 종료하고 페일오버 시도가 실패했습니다라는 메시지를 기록합니다.