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 |
검사의 일지 정지 간격을 설정합니다.
Probe_timeout 값을 전달하고 대상 호스트를 식별하는 nslookup을 hatimerun을 사용하여 시작합니다.
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 프로그램은 실패 상태로 종료하고 “페일오버 시도가 실패했습니다.”라는 메시지를 기록합니다.