[04] RAC 환경에서 오라클 서비스를 이용한 효율적인 워크로드 관리 방안

리눅스 관련된 자료를 찾다가 “열씨미와 게을러의 리눅스 개발 노하우 탐험기”란 책의 일부 내용을 접하게 됐습니다. 각 주제의 도입부가 문답법으로 진행되는 방식인데, 아주 재미있게 읽었습니다. 저도 이번 포스팅부터는 “궁금이”와 “똘똘이” 캐릭터를 이용해서 묻고 답하기 형태를 접목시켜 보려고 합니다. 🙂

똘똘님! 제가 이번에 RAC 3 노드 구축 프로젝트에 참여하게 됐습니다. 🙂 이번 구축 프로젝트에서 가장 중요하게 생각하는 부분 중의 하나는 워크로드 관리라고 할 수 있습니다. 온라인 서비스는 RAC 1, 2번 노드를 이용해서 골고루 부하를 분산 시키고 싶고, RAC 3번 노드는 배치 서비스용으로 사용하고 싶습니다. 배치 서비스는 대부분 새벽 시간대에만 수행되므로 업무 시간 (9~6)에는 Idle한 편입니다. 따라서, 만일 RAC 1 또는 2번 노드에 장애가 발생할 경우에는 온라인 서비스를 RAC 3번 노드로 Failover하고 싶고, RAC 3번 노드의 장애가 발생할 경우에는 배치 서비스를 RAC 1 또는 2번 노드로 Failover 하고 싶습니다. 어떻게 하면 좋을까요?

궁금님! 말씀하신 부분은 “서비스”를 이용하면 됩니다. 자! 그럼 “서비스”에 대해서 세부적으로 알아보도록 하겠습니다.

4-1. 서비스 사용 목적


서비스는 오라클 10g부터 제공되는 기능으로써, 크게 2가지 목적으로 사용됩니다.

  1. 효과적인 워크로드 관리를 위해 사용됩니다. 이를 위해, 서비스 별로 실행 가능한 노드를 설정하고, Failover 노드를 설정하고, 로드 밸런싱 설정등을 할 수 있는 기능을 제공합니다.
  2. 서비스 별 성능관리를 위해서 사용됩니다. ([07] 소스 수정없이 Connection Pool 별로 성능 현황 및 이력을 확인하는 방법 참조)

4-2. 서비스 생성 및 확인 방법


서비스는 DBMS_SERVICE 패키지, SRVCTL, EM을 이용해서 생성할 수 있습니다. 싱글 인스턴스에서는 DBMS_SERVICE 패키지를 이용해도 되지만, RAC 환경에서는 EM 또는 SRVCTL을 이용해서 생성해야 합니다. 우리는 SRVCTL을 이용해서 온라인 서비스 (ONLINE_SRV)와 배치 서비스 (BATCH_SRV)를 생성하도록 하겠습니다. (테스트 환경은 [01] LAB실 – 3 노드 RAC 설치하기 참고)

SRVCTL을 이용한 서비스 생성

srvctl add service -d OOW -service ONLINE_SRV -preferred OOW1,OOW2 -available OOW3 -failovermethod BASIC
srvctl add service -d OOW -service BATCH_SRV  -preferred OOW3 -available OOW1,OOW2 -failovermethod BASIC

옵션 중에 주목해야할 부분은 preferredavailable입니다.

  • preferred: 서비스 시작 시, 해당 서비스가 수행되는 노드를 지정
  • available: 서비스가 Failover되는 노드를 지정

서비스 시작

srvctl start service -d OOW -s ONLINE_SRV
srvctl start service -d OOW -s BATCH_SRV

GV$ACTIVE_SERVICES 뷰를 이용한 서비스 확인

select inst_id, name
from gv$active_services
where name like '%SRV%'
order by 1,2;

   INST_ID NAME
---------- --------------------
         1 ONLINE_SRV
         2 ONLINE_SRV
         3 BATCH_SRV

SRVCTL를 이용한 서비스 확인

srvctl status service -d OOW

Service BATCH_SRV  is running on instance(s) OOW3
Service ONLINE_SRV is running on instance(s) OOW1,OOW2

서비스 시작 후의 상태를 확인해보면, ONLINE_SRV 서비스는 1, 2번 노드에서 수행되고 있고, BATCH_SRV 서비스는 3번 노드에서만 수행되고 있다는 것을 알 수 있습니다. (그림-1. 참조)

그림-1. 서비스 시작 후의 구성도

04-1

4-3. 클라이언트에서 서비스로 접속하는 방법


그렇다면 클라이언트에서는 어떻게 해당 서비스로 접속하는 것일까요? 이에 대한 답은 오라클 10g부터 변경된 TNSNAMES.ORA 파일의 내용에서 찾을 수 있습니다. 오라클 10g부터는 SID 대신 SERVICE_NAME을 사용합니다. (물론, SID도 사용 가능합니다) DB가 생성되면 DB명과 동일한 서비스가 생성되고, 해당 서비스명을 이용해서 DB에 접속할 수 있게 됩니다. 따라서, DB 생성 이후에 lsnrctl service 명령어를 수행하면 아래와 같은 결과를 확인할 수 있습니다.

[oracle@racnode01h dbs]$ lsnrctl service

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 25-JUN-2016 08:28:12
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "OOW" has 1 instance(s).
  Instance "OOW1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "OOWXDB" has 1 instance(s).
  Instance "OOW1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: racnode01h, pid: 10243>
         (ADDRESS=(PROTOCOL=tcp)(HOST=racnode01h.oow.local)(PORT=35560))
The command completed successfully
Note
서비스 등록 및 시작 후에는 다음과 같은 결과가 출력됩니다. 즉, OOW1번 노드의 로컬 리스너는 OOW (기본 서비스) 및 ONLINE_SRV 서비스에 대한 접속을 관리하게 됩니다.
[oracle@racnode01h dbs]$ lsnrctl service

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 25-JUN-2016 08:35:48
Copyright (c) 1991, 2014, Oracle.  All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "ONLINE_SRV" has 1 instance(s).
  Instance "OOW1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "OOW" has 1 instance(s).
  Instance "OOW1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "OOWXDB" has 1 instance(s).
  Instance "OOW1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: racnode01h, pid: 10243>
         (ADDRESS=(PROTOCOL=tcp)(HOST=racnode01h.oow.local)(PORT=35560))
The command completed successfully

클라이언트의 TNSNAMEA.ORA 설정 방법은 다음과 같습니다.

ONLINE_SRV =
  (DESCRIPTION =  
   (LOAD_BALANCE=ON)
    (FAILOVER=ON)
    (ADDRESS_LIST=
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode01h-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode02h-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode03h-vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ONLINE_SRV)
    )
  )
BATCH_SRV =
  (DESCRIPTION =
   (LOAD_BALANCE=OFF)
    (FAILOVER=ON)
    (ADDRESS_LIST=
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode01h-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode02h-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = racnode03h-vip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BATCH_SRV)
    )

4-4. 서비스 Failover 동작 방식 테스트


1번 노드에 장애가 발생할 경우에, 1번 노드에서 수행 중인 ONLINE_SRV 서비스가 정상적으로 3번 노드로 Failover 되는지를 확인해 보도록 하겠습니다.

1번 노드 장애 발생 후 서비스 Failover 결과 확인

[oracle@racnode01h dbs]$ ps -ef | grep pmon
oracle   10177     1  0 08:23 ?        00:00:00 ora_pmon_OOW1
oracle   25979     1  0 Jun24 ?        00:00:05 asm_pmon_+ASM1

[oracle@racnode01h dbs]$ kill -9 10177

[oracle@racnode01h dbs]$ srvctl status service -d OOW

Service BATCH_SRV  is running on instance(s) OOW3
Service ONLINE_SRV is running on instance(s) OOW2, OOW3

Note
1번 노드의 장애 발생 직후에, ONLINE_SRV 서비스는 3번 노드로 Failover 된 것을 알 수 있습니다. (그림-2 참조)

그림-2. ONLINE_SRV 서비스 Failover 후의 구성도

04-2
1번 노드의 장애가 복구된 후에는 어떻게 될까요?

3번 노드로 Failover된 ONLINE_SRV 서비스는 1번 노드의 장애가 복구된 후에도 여전히 3번 노드에 존재하게 됩니다. (그림-3. 참조) 오라클은 “서비스”에 대해서는 자동 재배치 (Auto Rebalancing) 기능을 제공하지 않기 때문입니다.

그림-3. 1번 노드 장애 복구 후의 구성도

04-3

그렇다면, “자동 재배치 기능은 어떻게 구현할 수 있을까?” 하는 의문이 생깁니다.

만일, 자동 재배치를 수동으로 해야한다면 “서비스”를 업무에 적용하기에는 현실적인 어려움이 따르기 때문입니다. 이 문제를 해결하기 위해 오라클은 “FAN (Fast Application Notification) Callouts”을 이용한 자동 재배치 기능을 제공하고 있습니다.

해당 내용에 대해서는 다음 포스팅에서 다루도록 하겠습니다.

[05] FAN 콜아웃 (Callouts)을 이용한 서비스 자동 재배치 방법으로바로가기

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s