| Don Turnbull |
|
소개
서비스 관리 설비(SMF) 는 새로운 서비스 통합 관리 모델이고 솔라리스 운영체제에 포함되어 있습니다. SMF 는 좀 더 심화되고 기능적인 뷰를 솔라리스 시스템의 시동 혹은 종료시의 프로세스 관리에 제공합니다. 추가적으로 SMF 로 관리되는 프로세스들은 의존성을 가지고 있고 프로세스에 오류가 생기거나 비정상적으로 정지했을때 재시작을 할 수 있도록 모니터링 됩니다.
SMF 는 자가 예측 치료 기술(predictive self-healing) 의 핵심적인 부분으로 솔라리스10 에서 사용 가능합니다. 또한 소프트웨어 혹은 하드웨어 오류와 관리적인 오류에서 자동으로 복구될 수 있는 기능을 제공 합니다. 또한 SMF가 관리하는 서비스들은 비-root 유저들에게 권한위임을 할 수 있습니다. 결과적으로 SMF 는 서비스를 시작하고 정지하는 기존의 방법에 추가적인 기능이고 /etc/rc 스크립트는 과거 호환성을 위해 계속적으로 실행될 것입니다.
SMF 를 통한 서비스의 배치는 좀 더 일관적이고 견고한 환경을 제공합니다. 첫째로 사용자는 서비스가 현재 실행중인지 알기 위해 접속을 시도하고 접속이 성공적인지 궁금해할 필요 없이 솔라리스가 제공하는 간단한 커맨드(svcs -a)를 통해 질의 할 수 있습니다. 추가적으로 중요한 서비스들은 누군가가 부주의하게 서비스를 종료시키거나 버그가 코어 덤프를 유발하거나 혹은 다른 프로세스 오류가 발생하는 것 같은 문제가 발생했을때 자동적으로 재시작 될 수 있습니다. 또한 SMF 는 더 심화되고 공용의 로깅을 견고한 에러 처리와 함께 제공함으로써 시스템의 상태가 변경됐을때 서비스에 hang 이 걸리는 상황을 방지할 수 있습니다. smf(5) 의 멘 페이지 에서 자세한 정보를 확인하시기 바랍니다.
일반적인 소프트웨어 설치 후에는 시스템 시작 혹은 종료 시에 시작되거나 정지되어야 할 많은 프로세서들이 존재할 것입니다. 또한 이러한 프로세스들은 각각에 의존적이고 모니터링 될 필요가 있으며 오류가 발생시 재시작되어야할 필요가 있을 수 있습니다. 각각의 프로세에서 다음의 논리적인 단계들은 SMF 에 이러한 서비스들을 편입시키기 위해 수행되어야 합니다:
- 서비스 manifest 파일 생성하기.
- 서비스의 start, stop, restart 방법을 정의 하는 스크립트 파일 생성하기.
svccfg(1M) 를 이용해서 서비스 manifest 파일을 검증하고 import 하기svcadm(1M) 을 이용해서 서비스를 활성화 시키거나 시작시키기.svcs(1) 를 이용해서 서비스가 실행중인지 확인하기.
SAS 프로세스들을 예제로 사용해서, 우리는 두개의 서비스를 생성할 것입니다. 하나는 SAS Metadata Server (OMR) 을 위해, 하나는 SAS Object Spawner 를 위해서 입니다. 이 예제에서 Object Spawner 는 OMR 이 시작 되기 전에는 시작될 수 없고 OMR 이 정지 된 다음에는 반드시 정지되어야 합니다.
OMR 서비스 설정하기
단계 1
manifest 파일을 smf_method(5) 멘 페이지에 기술된 방법을 통해서 생성합니다. 명확하게 설명하자면 이 파일은 어플리케이션과 관련된 파일들에 종속된 디렉토리에 위치시켜야 합니다. 사실 서비스는 SMF 내에서 놀리 폴더로 구성되므로 어플리케이션과 관련된 파일들을 종속된 폴더에 가지고 있는 것이 이치에 맞습니다. 그러나 SMF 내에서는 어떠한 특정 디록토리 이름 혹은 위치 요구사항은 존재하지 않습니다.
이 예제에서 OMR 서비스는 SMF 에서 SAS 어플리케이션 폴더의 일부로서 구성될 것입니다. 이것은 논리적인 그룹핑입니다; 실제로 SMF 와 연관되어 있는 sas 라는 이름의 물리적 폴더는 존재하지 않습니다. 그러나 서비스를 관리할때 서비스는 application/sas/metadata 라는 이름으로 참조될 것입니다. 다른 SAS 관련 프로세스들은 나중에 추가될 수 있고 application/sas 로 구분될 수 있습니다. 예를 들어 파일 /var/svc/manifest/application/sas/metadata.xml 은 다음과 같은 내용을 포함하고 있어야 합니다:
<?xml version="1.0"?>
<!DOCTYPE service_bundle
SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='SAS:Metadata'>
<service
name='application/sas/metadata'
type='service'
version='1'>
<create_default_instance enabled='false' />
<single_instance />
<dependency
name='multi-user-server'
grouping='optional_all'
type='service'
restart_on='none'>
<service_fmri value='svc:/milestone/multi-user-server' />
</dependency>
<exec_method
type='method'
name='start'
exec='/lib/svc/method/sas/metadata %m'
timeout_seconds='60'>
<method_context>
<method_credential user='sas' />
</method_context>
</exec_method>
<exec_method
type='method'
name='restart'
exec='/lib/svc/method/sas/metadata %m'
timeout_seconds='60'>
<method_context>
<method_credential user='sas' />
</method_context>
</exec_method>
<exec_method
type='method'
name='stop'
exec='/lib/svc/method/sas/metadata %m'
timeout_seconds='60' >
<method_context>
<method_credential user='sas' />
</method_context>
</exec_method>
<property_group name='startd' type='framework'>
<propval name='duration' type='astring' value='contract' />
</property_group>
<template>
<common_name>
<loctext xml:lang='C'>
SAS Metadata Service
</loctext>
</common_name>
<documentation>
<doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
/>
<doc_link name='sas_metadata_install' uri=
'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
</documentation>
</template>
</service>
</service_bundle>
manifest 파일은 기본적으로 프로세스가 어떻게 시작되고 정지되고 재시작 되는지 에 대한 방법을 정의한 속성이 담긴 두개의 tag 절로 구성되어 있고 또한 의존성에 대해서도 정의되어 있습니다. 첫번째 태그 <service_bundle> 은 그룹 서비스에서 사용될 서비스 번들의 이름을 정의합니다. 그리고 svcs 커맨드 (svcs, svcmgr 등등) 파라미터의 일부로 사용 됩니다. 안쪽의 태그 <service> 는 특정 프로세스, 의존성, 그리고 어떻게 프로세스를 다룰지에 대해서 정의 합니다. service_bundle(4) 의 멘 페이지 를 통해서 manifest 파일의 포맷에 대한 정보를 참고하시기 바랍니다.
단게 2
method 스크립트를 생성합니다. 이 파일은 이전버전의 솔라리스에서 사용해 왔던 전통적인 rc 스크립트와 유사합니다. 이 파일은 반드시 프로세스를 성공적으로 시작, 정지, 재시작 할 수 있는 스크립트여야 합니다. 스크립트는 반드시 서비스를 관리할 유저에 의해 실행 가능해야 하고 manifest 파일의 속성인 exec 에 의해 참조될 수 있는 디렉토리, 파일 이름으로 위치되어 있어야 합니다. 예를 들어 우리의 과정에서 올바른 파일은 /lib/svc/method/sas/metadata 로 단계 1 에서 빌드한 manifest 파일을 기반으로 하고 있습니다. smf_method(5) 의 멘 페이지 에서 method 스크립트의 자세한 정보를 확인하시기 바랍니다.
#!/sbin/sh
# Start/stop client SAS MetaData service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=MSrvr
CFG=$SASDIR/SASMain/"$SRVR".sh
case "$1" in
'start')
$CFG start
sleep 2
;;
'restart')
$CFG restart
sleep 2
;;
'stop')
$CFG stop
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit $SMF_EXIT_OK
단게 3
manifest 파일의 검증하고 솔라리스의 서비스 저장소에 import 해서 SMF 의 서비스를 생성한 다음 서비스를 다룰 수 있도록 합니다. 다음의 커맨드는 이 예제에서 사용되는 manifest 파일의 정확한 파일 이름을 보여주고 있습니다.
# svccfg svc:> validate /var/svc/manifest/application/sas/metadata.xml svc:> import /var/svc/manifest/application/sas/metadata.xml svc:> quit
단계 4
svcadm 커맨드를 사용해서 서비스를 활성화 합니다. -t 스위치는 여러분의 서비스 정의를 테스트 할 수 있도록 도와 줍니다. 여러분은 -t 스위치를 제거함으로써 서비스 정의가 재부팅 사이에 정의가 저장소에 저장되도록 할 수 있습니다.
# svcadm enable -t svc:/application/sas/metadata
단계 5
서비스가 온라인인지 확인하고 프로세스가 정말로 실제로 실행중인지 svcs 를 통해 확인합니다.
# svcs -a | grep sas online 8:44:37 svc:/application/sas/metadata:default # ps -ef | grep sas ..... sas 26791 1 0 08:44:36 ? 0:00 /bin/sh /d0/SASMain/MSrvr.sh .....
Object Spawner 서비스 설정하기
이제 OMR 프로세스 (위에서) 와 Object Spawner 프로세스가 설정되었습니다. Object Spawner 는 OMR 에 의존적입니다. 이 글의 나머지 부분은 Object Spawner 프로세스의 의존성을 설정하는 방법에 대해 설명합니다.
단계 1
Object Spawner 서비스를 위한 manifest 파일은 OMR 서비스에서 사용했었던 파일과 유사합니다. 몇가지 작은 곳이 변경되었고 dependency 가 다르게 정의 되었습니다. 아래에서 달라진 부분들을 강조해 놓았습니다:
<?xml version="1.0">
<!DOCTYPE service_bundle
SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='SAS:ObjectSpawner'>
<service
name='application/sas/objectspawner'
type='service'
version='1'>
<create_default_instance enabled='false' />
<single_instance />
<dependency
name='sas-metadata-server'
grouping='optional_all'
type='service'
restart_on='none'>
<service_fmri value='svc:/application/sas/metadata' />
</dependency>
<exec_method
type='method'
name='start'
exec='/lib/svc/method/sas/objectspawner %m'
timeout_seconds='60'>
<method_context>
<method_credential user='sas' />
</method_context>
</exec_method>
<exec_method
type='method'
name='restart'
exec='/lib/svc/method/sas/objectspawner %m'
timeout_seconds='60'>
<method_context>
<method_credential user='sas' />
</method_context>
</exec_method>
<exec_method
type='method'
name='stop'
exec='/lib/svc/method/sas/ objectspawner %m'
timeout_seconds='60' >
<method_context>
<method_credential user='sas' />
<method_context>
<exec_method>
<property_group name='startd' type='framework'>
<propval name='duration' type='astring' value='contract' />
</property_group>
<template>
<common_name>
<loctext xml:lang='C'>
SAS Object Spawner Service
</loctext>
</common_name>
<documentation>
<doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
/>
<doc_link name='sas_metadata_install' uri=
'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
</documentation>
</template>
</service>
</service_bundle>
단계 2
manifest 파일을 생성한다음 /lib/svc/method/sas/objectspawner 스크립트를 생성합니다:
#!/sbin/sh
# Start/stop client SAS Object Spawner service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=ObjSpa
CFG=$SASDIR/SASMain/"$SRVR".sh
case "$1" in
'start')
$CFG start
sleep 2
;;
'restart')
$CFG restart
sleep 2
;;
'stop')
$CFG stop
;;
*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac
exit $SMF_EXIT_OK
단계 3
manifest 파일을 OMR 서비스에서 했던 것과 동일한 방법으로 검증하고 import 합니다:
# svccfg svc:> validate /var/svc/manifest/application/sas/objectspawner.xml svc:> import /var/svc/manifest/application/sas/objectspawner.xml svc:> quit
단계 4
새로운 서비스를 OMR 서비스와 마찬가지 방법으로 활성화 합니다:
# svcadm enable -t svc:/application/sas/objectspawner
단게 5
마지막으로 서비스가 온라인인지 OMR 서비스와 마찬가지 방법으로 확인합니다:
# svcs -a | grep sas online 10:28:39 svc:/application/sas/metadata:default online 10:38:20 svc:/application/sas/objectspawner:default # ps -ef | grep sas ..... sas 26791 1 0 18:44:36 ? 0:00 /bin/sh /d0/SASMain/MSrvr.sh sas 26914 1 0 18:18:49 ? 0:00 /bin/sh /d0/SASMain/ObjSpa.sh .....
실제 상황에서는 SAS 에 의해 소유되고 있는 다른 프로세스들이 존재하고 있을 것이고 서비스 프로세스를 부모 프로세스로 가지고 있을 것입니다. 어쨌든 method 스크립트에 정의된 스크립트들이 실행중이라는 것은 svcs -a 의 출력 결과가 올바른 것임을 증명합니다; 서비스는 실행중입니다.
SMF 기능 증명하기
설정한대로 서비스들이 자동으로 시작되는지 보기 위해 현재의 Metadata 서버를 죽여 보겠습니다 (PID 26791).
# kill 26791
ps(1) 커맨드는 이전의 Metdata (PID 26791) 이 더이상 존재하지 않음을 나타내고 새로운 PID 27035 가 실행중임을 보여주고 있습니다. 사용자의 어떠한 간섭 없이 자동으로 재시작 되었습니다.
# ps -ef | grep sas ..... sas 27035 1 0 18:44:36 ? 0:00 /bin/sh /d0/SASMain/MSrvr.sh sas 26914 1 0 18:18:49 ? 0:00 /bin/sh /d0/SASMain/ObjSpa.sh .....
SAS 9 배치에 Metadata 서버가 중요한 컴포넌트라고 봤을때 SMF 는 SAS 어플리케이션 환경에 엄청난 가용성을 안겨 준것입니다. 대부분의 어플리케이션들은 비슷한 상황을 가지고 있습니다 SMF 를 통해서 어플리케이션의 프로세스는 자동화 되고 모니터링되고 솔라리스 관리자의 아주 적은 오버헤드 만으로도 관리될 수 있습니다.
"관리자코너" 카테고리의 다른 글
- 솔라리스에서 램디스크 사용 (댓글 0개 / 트랙백 0개) 2008/04/17
- 플래쉬 어카이브를 이용한 솔라리스 시스템의 재해 복구 2 (댓글 1개 / 트랙백 0개) 2006/06/23
- 스크립트를 이용한 자동화된 시스템 체크 (댓글 0개 / 트랙백 0개) 2008/06/16
- 솔라리스9 혹은 그 이상 버전을 운용하는 시스템상의 하드 디스크로 부터 WAN 부트이용하기 (댓글 0개 / 트랙백 0개) 2007/12/14
- AC97 기반 오디오 컨트롤러를 가진 x86 시스템에서 오디오 드라이버 설치 (댓글 4개 / 트랙백 0개) 2007/05/18
- 솔라리스 8 마이그레이션 어시스턴트 (댓글 0개 / 트랙백 0개) 2008/03/13
- 솔라리스 10 에서 TCP Wrapper 사용하기 (댓글 1개 / 트랙백 0개) 2006/01/23
- JBOSS 어플리케이션 서버를 썬 파이어 T2000 서버에 배치하기 (댓글 5개 / 트랙백 0개) 2007/06/13
- pkgman 유틸리티를 이용한 패키지 관리 (댓글 0개 / 트랙백 0개) 2008/03/11
- LSI MegaRAIS SAS 1078 컨트롤러를 가진 인텔 플랫폼에서의 솔라리스10 설치 (댓글 0개 / 트랙백 0개) 2008/01/21
댓글을 달아 주세요
이번에 서버가 모두 솔라리스 10으로 바뀌면서, 기존의 패키지를 smf 형태로 서비스 하려고 합니다. 영문서만 보다가 한글 문서를 접하게 되니 그냥 먼가 뚫리는 기분이네요 ㅎㅎ
2007/09/04 08:32자바는 알면 알수록 재미가 있어지네요. 무궁무진한 자바의 세계로 빠져들어 갑니다. 좋은 자료 잘 활용하겠습니다.
2007/09/17 23:48좋은 정보 감사해요~
2007/09/19 03:28