HMS 관리

본 장에서는 HMS를 사용하기 위해서 빌드하는 과정, 기동과 종료 및 상태조회에 대해 설명한다.

1. HMS 빌드

HMS는 신뢰성을 제공하기 위한 목적으로 일부 중요한 정보들을 스토리지를 이용하여 관리한다. 이러한 기능을 지원하기 위해서 HMS는 스토리지 기능이 구현된 라이브러리를 사용한다.

기본적으로 지원되는 스토리지 이외에 사용자의 운영 환경에 설치된 외부 스토리지도 확장하여 사용할 수 있도록 지원되며, 이러한 경우에는 사용할 스토리지의 종류에 따라 지원되는 라이브러리가 달라지기 때문에 해당 스토리지의 라이브러리를 이용하여 HMS를 다시 빌드해야 한다.

1.1. 사전 준비

기본 스토리지가 아닌 외부 스토리지를 사용하는 경우 HMS를 해당 스토리지 라이브러리에 맞추어 새롭게 빌드해야 한다. HMS를 빌드하기 위해서는 운영 시스템에 스토리지가 설치되어 있고 해당 스토리지를 지원하는 라이브러리가 있어야 한다. 또한 운영 시스템에 설치된 스토리지를 올바르게 사용하기 위한 환경변수 설정을 확인해야 한다.

예를 들어 UNIX 시스템에서 외부 스토리지를 Oracle로 사용할 경우 다음 환경변수 값들을 설정하거나 올바르게 설정되었는지 확인한다.

ORACLE_HOME=/data/home/oracle
PATH=$PATH:$ORACLE_HOME/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

HMS가 사용하게 될 스토리지의 라이브러리 이외에 Tmax에서 각 스토리지 종류에 맞추어 제공하는 HMS 라이브러리도 준비되어 있어야 한다. HMS 라이브러리는 기본 스토리지를 사용할 경우에는 libhms.a 이름으로 제공되고, 외부 스토리지를 사용할 경우에는 libhms_<storage>.a 형태의 이름으로 제공된다.

예를 들어 외부 스토리지로 Oracle을 사용할 경우 HMS 라이브러리는 libhms_ora.a의 이름으로 제공된다.

사용할 외부 스토리지에 대한 HMS 라이브러리가 존재하지 않는다면 Tmax 제품 담당자에게 문의하기 바란다.

1.2. Makefile

외부 스토리지를 사용하여 HMS를 새로 빌드하는 경우 Makefile을 이용한다. Makefile은 사용자의 플랫폼 및 개발 환경에 맞게 수정해서 사용한다.

다음은 Linux 환경에서 외부 스토리지로 Oracle을 사용하기 위한 HMS Makefile의 예제이다.

# HMS Makefile for Oracle
# Linux
TARGET  = hms_ora
APOBJ   = dumy.o
APPDIR  = $(TMAXDIR)/appbin
TMAXLIBD= $(TMAXDIR)/lib
TMAXLIBS= -lhms_ora -lpthread

CFLAGS  =

all: $(TARGET)

include $(ORACLE_HOME)/precomp/lib/env_precomp.mk
ORALIBDIR = $(LIBHOME)
ORALIB  = $(PROLDLIBS)

$(TARGET): $(APOBJ)
    $(CC) $(CFLAGS) -o $(TARGET) -L$(TMAXLIBD) -L$(ORALIBDIR) $(ORALIB) $(APOBJ)
    $(TMAXLIBS)
    mv $(TARGET) $(APPDIR)/.

$(APOBJ):
    $(CC) $(CFLAGS) -c dumy.c

clean:
    -rm -f core $(TARGET) $(APPDIR)/$(TARGET)
~
~

1.3. HMS 빌드 및 확인

HMS Makefile을 이용할 경우 빌드된 HMS는 $TMAXDIR 아래 appbin 디렉터리로 옮겨진다. appbin 디렉터리로 옮겨지지 않았다면 빌드된 HMS를 appbin으로 복사해준다.

HMS의 파일명은 사용자가 지정할 수 있다. 지정한 HMS의 이름은 Tmax 환경설정 파일에 SVRGROUP 절의 HMSNAME 항목에 대한 값이 된다.

2. HMS 기동 및 종료

HMS는 Tmax가 운영 중인 상황에서 동작한다. 만약 Tmax가 종료되어 있다면 Tmax를 먼저 기동시켜야한다. 옵션 없이 tmboot 명령을 통해 기동시키면 HMS도 함께 기동되지만, Tmax 시스템 프로세스만 기동되어 있다면 HMS는 별도로 기동시켜야 한다.

지정한 HMS를 기동 및 종료하는 명령은 다음과 같다.

  • 기동

    tmboot -q <SVGNAME>
  • 종료

    tmdown -q <SVGNAME>

기동과 종료 명령어에 사용되는 <SVGNAME>은 Tmax 환경설정 파일에 정의한 SVRGROUP 절의 이름이다. 자세한 내용은 SVRGROUP 절을 참고한다.

3. HMS 상태 조회

HMS가 운영 중인 상황에서 현재 환경설정에 대한 정보를 확인하고 시스템에 대한 상태, HMS 시스템에 접속되어 있는 클라이언트의 정보, 전송된 메시지 또는 처리된 메시지, 실패한 메시지 등의 현황 정보를 관리할 필요가 있다.

로컬 및 글로벌 HMS의 정보를 관리하기 위해서 Tmax에서 제공하는 tmadmin 프로그램을 이용한다.

tmadmin에 대한 자세한 정보는 Tmax Administration Guide를 참고한다.

3.1. Destination 정보 조회

tmadmin의 st 명령을 사용해서 환경설정 파일에서 설정한 Destination의 목록, 각 Destination에서 처리 중인 메시지와 클라이언트의 정보를 확인할 수 있다.

tmadmin st -q

다음은 명령을 수행했을 때 조회되는 로컬 HMS 환경에 대한 정보이다.

$$2 Locke2 (tmadm): st -q
 ----------------------------------------------------------------------------------
 G  dest       cqcount   type   apqcnt   acqcnt  f_dscrd  t_dscrd cons_cnt prod_cnt
 ----------------------------------------------------------------------------------
 -  queue01         58  QUEUE      169      111        0        0       30        5
 -  topic01         32  TOPIC       42      283        0        0       28        3

다음은 조회되는 정보의 각 필드에 대한 설명이다.

필드 설명

G

해당 Destination이 GLOBAL로 설정된 경우 'O’로 표시되고, GLOBAL이 아닌 경우 하이픈(-)으로 표시된다.

dest

Destination의 이름으로, 환경설정 파일의 HMS 절에 설정된 이름이 표시된다.

cqcount

해당 Destination에서 아직 처리되지 않은 메시지 건수이다.

type

해당 Destination의 타입을 표시한다. 'QUEUE’와 'TOPIC’으로 표시된다.

apqcnt

현재까지 전송되어 누적된 총 메시지 건수이다.

acqcnt

소비자에 의해 처리된 메시지의 총 건수로 Topic 타입은 하나의 메시지에 대해서 모든 소비자가 수신받아야 처리완료가 되므로 'apqcnt' 값보다 'acqcnt' 값이 커질 수 있다.

f_dscrd

수신받은 메시지에 대해서 failed 처리를 함으로써 수신이 실패된 메시지 건수이다.

t_dscrd

메시지 전송에 TTL이 설정된 경우, 유효시간이 지남으로 실패된 메시지 건수이다.

cons_cnt

해당 Destination에 접속한 소비자(consumer)의 수이다.

prod_cnt

해당 Destination에 접속한 생산자(producer)의 수이다.

3.2. 클라이언트 정보 조회

tmadmin의 st 명령어를 사용해서 특정 Destination에 대한 각 클라이언트의 상세한 정보를 조회할 수 있다.

tmadmin st -q <DestinationName> -c

다음은 명령을 수행했을 때 조회되는 클라이언트 정보이다.

$$3 Locke2 (tmadm): st -q queue01 -c
   ------------------------------------------------------------------------------
      sesi     clid     cname      clitype qcnt  cnt  f_dscrd t_dscrd   listener
   ------------------------------------------------------------------------------
         0    0x39d prodasync        ARCV    49    0    0    0         ASYNCSVC
       0x1        0 prod41           SND      0   32    0    0
       0x1        0 prod42           SND      0   11    0    0
       0x1        0 cons51           RCV      3    0    0    0
       0x1        0 cons52           RCV      9    0    0    0

$$4 Locke2 (tmadm): st -q topic01 -c
   ------------------------------------------------------------------------------
      sesi     clid     cname      clitype qcnt  cnt  f_dscrd t_dscrd   listener
   ------------------------------------------------------------------------------
       0x1        0 prod11           PUB      0    2    0    0
       0x1        0 prod12           PUB      0    1    0    0
       0x1        0 cons11           SUB     30    0    0    0
       0x2      0x2 prod21           PUB      0   16    0    0
       0x2      0x2 prod22           PUB      0    8    0    0
       0x2      0x2 cons21           SUB     23    0    0    0
       0x3        0 prod31           PUB      0    3    0    0
       0x4      0x4 cons41           ADSUB   32    0    0    0          ASYNCSVC2

다음은 조회되는 정보의 각 필드에 대한 설명이다.

필드 설명

sesi

해당 클라이언트를 생성한 세션의 번호이다.

clid

클라이언트 ID이다.

cname

클라이언트를 생성할 때 지정한 클라이언트명으로 다음 함수의 파라미터로 사용된다.

  • hms_create_consumer, hms_create_sender, hms_create_subscriber, hms_create_producer, hms_create_receiver, hms_create_publisher

clitype

해당 Destination에 연결된 클라이언트의 종류이다.

  • SND : Queue 타입의 송신자(hms_create_sender()로 생성)

  • PUB : Topic 타입의 발행자(hms_create_publisher()로 생성)

  • RCV : Queue 타입의 수신자(hms_create_receiver()로 생성)

  • SUB : Topic 타입의 구독자(hms_create_subscriber()로 생성)

  • DSUB : Topic 타입의 영속적 구독자(hms_create_durable_subscriber()로 생성)

  • ARCV : 비동기 세션에서 생성된 Queue 타입의 수신자

  • ASUB : 비동기 세션에서 생성된 Topic 타입의 구독자

  • ADSUB : 비동기 세션에서 생성된 Topic 타입의 영속적 구독자

qcnt

각 구독자들이 실제로 가지고 있는 메시지 건수이다.

cnt

각 클라이언트가 전송하거나 수신한 메시지 건수이다.

f_dscrd

수신 후 메시지를 failed로 처리함으로써 실패된 메시지 건수이다.

t_dscrd

전송할 때 설정한 TTL(유효시간)이 지나서 실패 처리된 메시지 건수이다.

listener

비동기 세션으로 생성한 소비자(consumer)의 경우 메시지를 수신할 서비스명이다.