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

7장 자원 유형 정의

이 장에서는 자원 유형을 디자인 및 구현하는 데 있어 DSDL(Data Service Development Library)의 일반적인 용도를 살펴봅니다. 또한 자원 유형을 디자인하여 자원 구성을 검증하고 자원을 시작, 정지 및 모니터링하는 것에 초점을 맞추어 설명합니다. 마지막으로 DSDL을 사용하여 자원 유형 콜백 메소드를 구현하는 방법에 대해 설명합니다.

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

이러한 작업을 수행하려면 자원의 등록 정보 설정에 액세스해야 합니다. DSDL 유틸리티 scds_initialize()는 이러한 자원 등록 정보에 액세스하기 위한 일관된 방법을 제공합니다. 각 콜백 메소드의 시작 부분에서 호출되도록 설계된 이 유틸리티 함수는 클러스터 프레임워크에서 자원의 모든 등록 정보를 검색하여 scds_getname() 함수 계열에 사용할 수 있게 합니다.

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

자원 유형 등록(RTR) 파일

자원 유형 등록(RTR) 파일은 Sun Cluster에 대해 자원 유형의 세부 정보를 지정합니다. 이러한 세부 정보에는 다음 정보가 포함됩니다.

DSDL과 함께 제공되는 샘플 RTR 파일은 대부분의 자원 유형 구현에 충분합니다. 개발자는 자원 유형 이름 및 자원 유형 콜백 메소드의 경로 이름과 같은 몇 가지 기본 요소만 편집하면 됩니다. 자원 유형을 구현하기 위해 새 등록 정보가 필요한 경우 자원 유형 구현의 RTR 파일에서 이를 확장 등록 정보로 선언한 다음 scds_get_ext_property() 유틸리티를 사용하여 새 등록 정보에 액세스할 수 있습니다.

Validate 메소드

자원 유형 구현의 Validate 콜백 메소드의 목적은 제안된 자원 설정(자원의 제안된 등록 정보 설정에 지정된 대로)이 자원 유형에 허용되는지 확인하는 것입니다.

자원 유형 구현의 Validate 메소드는 다음 두 조건 중 하나에서 RGM에 의해 호출됩니다.

이러한 두 시나리오는 자원의 Validate 메소드에 전달되는 -c(작성) 또는 -u(업데이트) 명령줄 옵션이 있는지에 따라 구별할 수 있습니다.

Validate 메소드는 자원 유형 등록 정보 Init_nodes의 값으로 정의되는 노드 집합의 각 노드에서 호출됩니다. Init_nodesRG_PRIMARIES 로 설정된 경우 Validate는 자원을 포함하는 자원 그룹을 호스팅할 수 있는(즉, 이러한 그룹의 기본이 될 수 있는) 각 노드에서 호출됩니다. Init_nodesRT_INSTALLED_NODES로 설정된 경우에는 자원 유 형 소프트웨어가 설치된 각 노드(일반적으로 클러스터의 모든 노드)에서 Validate가 호출됩니다.

Init_nodes의 기본값은 RG_PRIMARIES입니다(rt_reg(4) 설명서 페이지 참조). Validate 메소드가 호출되는 시점에 RGM은 아직 자원을 만들지 않았거나(작성 콜백의 경우) 업데이트 중인 등록 정보의 업데이트된 값을 아직 적용하지 않았습니다(업데이트 콜백의 경우).


주 –

HAStoragePlus 자원 유형에서 관리하는 로컬 파일 시스템을 사용 중이면 scds_hasp_check() 함수를 사용하여 해당 자원 유형의 상태를 확인합니다. 자원에 대해 정의된 Resource_dependencies 또는 Resource_dependencies_weak 시스템 등록 정보를 사용하여 자원이 의존하는 모든 SUNW.HAStoragePlus 자원의 상태(온라인 또는 기타)에서 이 정보를 가져옵니다. scds_hasp_check () 함수에서 반환된 전체 상태 코드 목록은 scds_hasp_check(3HA) 설명서 페이지를 참조하십시오.


DSDL 함수 scds_initialize()는 다음과 같은 방법으로 이러한 상황을 처리합니다.

자원 등록 정보의 검증을 구현하는 함수를 svc_validate()라고 하고 이 함수가 scds_get_name() 계열의 함수를 사용하여 검증할 등록 정보를 찾는다고 가정합니다. 허용되는 자원 설정이 이 함수의 반환 코드 0으로 표시된다고 가정하면 자원 유형의 Validate 메소드는 다음 코드 단편과 같이 나타날 수 있습니다.

int
main(int argc, char *argv[])
{
   scds_handle_t handle;
   int rc;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* Initialization Error */
   }
   rc = svc_validate(handle);
   scds_close(&handle);
   return (rc);
}

검증 함수는 또한 자원 검증이 실패한 이유를 기록해야 합니다. 이에 대한 세부 정보는 제외하고(8 장, 샘플 DSDL 자원 유형 구현에서 Validation 함수에 대한 실제적인 처리 방법 설명) svc_validate() 함수를 다음과 같이 구현할 수 있습니다.

int
svc_validate(scds_handle_t handle)
{
   scha_str_array_t *confdirs;
   struct stat    statbuf;
   confdirs = scds_get_confdir_list(handle);
   if (stat(confdirs->str_array[0], &statbuf) == -1) {
   return (1);   /* Invalid resource property setting */
   }
   return (0);   /* Acceptable setting */
}

따라서 개발자는 svc_validate() 함수의 구현만 신경 쓰면 됩니다.

Start 메소드

자원 유형 구현의 Start 콜백 메소드는 자원을 시작하기 위해 선택된 클러스터 노드에서 RGM에 의해 호출됩니다. 명령줄에 자원 그룹 이름, 자원 이름 및 자원 유형 이름이 전달됩니다. Start 메소드는 클러스터 노드에서 데이터 서비스 자원을 시작하는 데 필요한 작업을 수행합니다. 일반적으로 여기에는 자원 등록 정보 검색, 응용 프로그램 특정 실행 파일 및/또는 구성 파일 찾기, 해당 명령줄 인자로 응용 프로그램 시작 등의 작업이 포함됩니다.

DSDL의 경우 자원 구성은 이미 scds_initialize() 유틸리티에 의해 검색됩니다. 응용 프로그램에 대한 시작 작업은 svc_start() 함수에 포함될 수 있습니다. 다른 함수 svc_wait()를 호출하여 응용 프로그램이 실제로 시작되었는지 확인할 수 있습니다. Start 메소드에 대한 단순화된 코드는 다음과 같이 나타납니다.

int
main(int argc, char *argv[])
{
   scds_handle_t handle;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* Initialization Error */
   }
   if (svc_validate(handle) != 0) {
   return (1);   /* Invalid settings */
   }
   if (svc_start(handle) != 0) {
   return (1);   /* Start failed */
   }
   return (svc_wait(handle));
}

이 시작 메소드 구현에서 svc_validate()를 호출하여 자원 구성을 검증합니다. 실패할 경우 자원 구성과 응용 프로그램 구성이 일치하지 않거나 해당 클러스터 노드에 시스템과 관련된 문제가 있는 것입니다. 예를 들어, 자원에 필요한 클러스터 파일 시스템을 현재 해당 클러스터 노드에서 사용하지 못할 수 있습니다. 이러한 경우 해당 클러스터 노드에서 자원을 시작하려는 시도는 아무 소용이 없으며 RGM으로 하여금 다른 노드에서 자원을 시작하도록 하는 것이 좋습니다.

그러나 위에서는 svc_validate()가 응용 프로그램에 절대적으로 필요한 클러스터 노드의 자원만 검사하도록 제한되어 있으며 그렇지 않을 경우 모든 클러스터 노드에서 자원이 시작되지 않아 START_FAILED 상태가 될 수 있다고 가정합니다. 이 상태에 대한 자세한 내용은 scswitch(1M) 설명서 페이지 및 Sun Cluster Data Services Planning and Administration Guide for Solaris OS를 참조하십시오.

svc_start() 함수는 노드에서 자원 시작에 성공한 경우 0을 반환해야 하며 문제가 발생한 경우에는 0이 아닌 값을 반환해야 합니다. 이 함수가 실패할 경우 RGM은 다른 클러스터 노드에서 해당 자원을 시작하려고 합니다.

DSDL을 가능한 많이 활용하기 위해 svc_start() 함수는 scds_pmf_start() 유틸리티를 호출하여 PMF(Process Management Facility)에서 응용 프로그램을 시작할 수 있습니다. 이 유틸리티는 또한 PMF의 실패 콜백 작업 기능을 사용하여 프로세스 실패를 감지합니다. 자세한 내용은 pmfadm(1M) 설명서 페이지에서 -a 작업 인자에 대한 설명을 참조하십시오.

Stop 메소드

자원 유형 구현의 Stop 콜백 메소드는 응용 프로그램을 중지하기 위해 클러스터 노드에서 RGM에 의해 호출됩니다. Stop 메소드의 콜백 의미는 다음을 요구합니다.

DSDL 유틸리티 scds_pmf_stop()SIGTERM을 통해 응용 프로그램을 유연하게 중지하려고 시도한 다음 프로세스에 SIGKILL을 전달하므로 대부분의 응용 프로그램을 중지할 수 있습니다. 이 함수는 응용 프로그램이 scds_pmf_start()를 통해 PMF에서 시작되었다고 가정합니다. 이 유틸리티에 대한 자세한 내용은 PMF 함수를 참조하십시오.

응용 프로그램을 중지하는 응용 프로그램 특정 함수를 svc_stop()이라고 가정할 경우 Stop 메소드를 다음과 같이 구현합니다.

if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR)
{
   return (1);   /* Initialization Error */
}
return (svc_stop(handle));

앞의 svc_stop() 함수 구현에 scds_pmf_stop() 함수를 포함할지 여부는 여기서 다루지 않습니다. 응용 프로그램이 Start 메소드를 통해 PMF에서 시작되었는지에 따라 scds_pmf_stop() 함수의 포함 여부가 결정될 것입니다.

svc_validate() 메소드는 Stop 메소드 구현에 사용되지 않습니다. 이는 시스템에 문제가 있는 경우에도 Stop 메소드가 해당 노드에서 응용 프로그램의 중지를 시도해야 하기 때문입니다.

Monitor_start 메소드

RGM은 자원에 대한 오류 모니터를 시작하기 위해 Monitor_start 메소드를 호출합니다. 오류 모니터는 자원이 관리하는 응용 프로그램의 상태를 모니터합니다. 자원 유형 구현은 일반적으로 백그라운드에서 실행되는 별도의 데몬으로 오류 모니터를 구현합니다. Monitor_start 콜백 메소드는 이 데몬을 적절한 인자로 시작하는 데 사용됩니다.

모니터 데몬 자체에 오류가 발생할 수 있으므로(예를 들어, 모니터 데몬이 중지되어 응용 프로그램이 모니터되지 않을 수 있음) PMF를 사용하여 모니터 데몬을 시작해야 합니다. DSDL 유틸리티 scds_pmf_start()는 오류 모니터를 시작하기 위한 지원을 기본으로 제공합니다. 이 유틸리티는 모니터 데몬 프로그램의 자원 유형 콜백 메소드 구현 위치로 RT_basedir에 대한 상대 경로 이름을 사용하고 데몬의 무제한 재시작을 방지하기 위해 DSDL에서 관리하는 Monitor_retry_intervalMonitor_retry_count 확장 등록 정보를 사용합니다.

또한 모니터 데몬이 RGM에 의해 직접 호출되지 않더라도 모든 콜백 메소드에 정의된 명령줄 구문(즉, -R resource -G resource-group -T resource-type)이 모니터 데몬에 동일하게 적용됩니다. 마지막으로 이 유틸리티는 모니터 데몬 구현 자체에서 scds_initialize() 유틸리티를 사용하여 고유한 환경을 설정할 수 있게 합니다. 작업을 위한 노력의 대부분은 모니터 데몬 자체를 디자인하는 데 필요합니다.

Monitor_stop 메소드

RGM은 Monitor_start 메소드를 통해 시작된 오류 모니터 데몬을 중지하기 위해 Monitor_stop 메소드를 호출합니다. 이 콜백 메소드의 실패는 Stop 메소드의 실패와 동일한 방식으로 처리됩니다. 따라서 Monitor_stop 메소드는 멱등원이어야 하며 Stop 메소드와 같이 견고해야 합니다.

scds_pmf_start() 유틸리티를 사용하여 오류 모니터 데몬을 시작한 경우 scds_pmf_stop() 유틸리티를 사용하여 오류 모니터 데몬을 중지합니다.

Monitor_check 메소드

RGM은 클러스터 노드가 자원을 마스터할 수 있는지를 확인하기 위해 지정한 자원의 노드에서 자원에 대한 Monitor_check 콜백 메소드를 실행합니다. 즉, RGM은 이 메소드를 실행하여 자원에서 관리 중인 응용 프로그램을 노드에서 성공적으로 실행할 수 있는 지를 확인합니다.

이 경우 일반적으로 응용 프로그램에 필요한 모든 시스템 자원을 클러스터 노드에서 사용할 수 있는지도 확인해야 합니다. Validate 메소드에 설명된 것처럼 개발자가 구현하는 svc_validate() 함수의 목적은 최소한 이러한 점을 확인하는 데 있습니다.

자원 유형 구현에 의해 관리되는 특정 응용 프로그램에 따라 Monitor_check 메소드를 작성하여 몇 가지 추가 작업을 수행할 수 있습니다. Monitor_check 메소드는 동시에 실행되는 다른 메소드와 충돌하지 않도록 구현해야 합니다. DSDL을 사용 중이면 Monitor_check 메소드에서 자원 등록 정보의 응용 프로그램 특정 검증을 구현하는 svc_validate() 함수를 호출해야 합니다.

Update 메소드

RGM은 클러스터 관리자에 의한 모든 변경 사항을 활성 자원의 구성에 적용하기 위해 자원 유형 구현의 Update 메소드를 호출합니다. Update 메소드는 자원이 현재 온라인 상태인 노드(있을 경우)에서만 호출됩니다.

RGM은 Validate 메소드를 실행하기 전에 자원 유형의 Update 메소드를 실행하므로 이제 막 변경된 자원 구성은 자원 유형 구현에 허용될 수 있습니다. Validate 메소드는 자원 또는 자원 그룹 등록 정보가 변경되기 전에 호출되며 제안된 변경 사항이 Validate 메소드에 의해 거부될 수 있습니다. 활성(온라인) 자원이 새 설정을 인식할 수 있도록 변경 사항이 적용된 후에 Update 메소드가 호출됩니다.

동적으로 업데이트할 수 있기를 원하는 등록 정보를 신중하게 결정하고 RTR 파일에서 TUNABLE = ANYTIME 설정으로 이러한 등록 정보에 표시해야 합니다. 일반적으로 오류 모니터 데몬이 사용하는 자원 유형 구현의 모든 등록 정보를 동적으로 업데이트할 수 있어야 한다는 것을 지정할 수 있습니다. 그러나 Update 메소드는 적어도 모니터 데몬을 재시작해야 합니다.

사용할 수 있는 등록 정보는 다음과 같습니다.

이러한 등록 정보는 오류 모니터 데몬이 서비스 상태를 검사하는 방법, 상태를 검사하는 빈도, 오류를 추적하기 위해 사용하는 기록 간격, PMF에 의해 오류 모니터 데몬에 설정되는 재시작 임계값 등에 영향을 미칩니다. 이러한 등록 정보의 업데이트를 구현하기 위해 scds_pmf_restart () 유틸리티가 DSDL에서 제공됩니다.

자원 등록 정보를 동적으로 업데이트할 수 있어야 하지만 해당 등록 정보의 수정으로 인해 실행 중인 응용 프로그램이 영향을 받을 수 있는 경우 해당 등록 정보에 대한 업데이트가 실행 중인 임의의 응용 프로그램 인스턴스에 정확하게 적용되도록 적절한 작업을 구현해야 합니다. 현재로서는 DSDL을 사용하여 이런 방법으로 자원 등록 정보를 동적으로 업데이트할 수 없습니다. Validate와 마찬가지로 명령줄에서는 수정된 등록 정보를 Update로 전달할 수 없습니다.

Init, FiniBoot 메소드에 대한 설명

이러한 메소드는 자원 관리 API 사양에 의해 정의되는 일회성 작업 메소드입니다. DSDL에 포함된 샘플 구현은 이러한 메소드의 사용을 보여주지 않습니다. 그러나 이러한 메소드가 필요한 경우 DSDL의 모든 기능을 이러한 메소드에서도 사용할 수 있습니다. 일반적으로 InitBoot 메소드는 자원 유형 구현에서 일회성 작업을 구현한다는 점에서 동일합니다. Fini 메소드는 일반적으로 Init 또는 Boot 메소드의 작업을 실행 취소하는 작업을 수행합니다.

오류 모니터 데몬 디자인

DSDL을 사용한 자원 유형 구현에는 일반적으로 다음 작업을 담당하는 오류 모니터 데몬이 있습니다.

DSDL 유틸리티는 오류 모니터 데몬의 주 루프가 이 장의 끝에 나오는 의사 코드로 표시될 수 있도록 설계되었습니다.

DSDL을 사용하여 오류 모니터를 구현하는 경우 다음을 명심하십시오.

대부분의 경우 응용 프로그램 특정 상태 검사 작업은 별도의 독립 실행형 유틸리티(예: svc_probe())에서 구현되고 다음과 같은 일반적인 주 루프와 통합될 수 있습니다.

for (;;) {
   /* sleep for a duration of thorough_probe_interval between
   *  successive probes.
   */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));
   /* Now probe all ipaddress we use. Loop over
   * 1. All net resources we use.
   * 2. All ipaddresses in a given resource.
   * For each of the ipaddress that is probed,
   * compute the failure history. 
   */
   probe_result = 0;
   /* Iterate through the all resources to get each
   * IP address to use for calling svc_probe()
   */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Grab the hostname and port on which the
   * health has to be monitored.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS supports only one port and
   * hence obtaint the port value from the
   * first entry in the array of ports.
   */
   ht1 = gethrtime();
   /* Latch probe start time */
   probe_result = svc_probe(scds_handle, hostname, port, timeout);
   /*
   * Update service probe history,
   * take action if necessary.
   * Latch probe end time.
   */
   ht2 = gethrtime();
   /* Convert to milliseconds */
   dt = (ulong_t)((ht2 - ht1) / 1e6);
   /*
   * Compute failure history and take
   * action if needed
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* Each net resource */
   }       /* Keep probing forever */