제15장 Tibero Active Cluster

내용 목차

15.1. 개요
15.2. 구성요소
15.3. 프로세스
15.4. TAC 환경설정
15.5. TAC를 위한 데이터베이스 생성
15.6. TAC 실행
15.6.1. 실행 전 준비 사항
15.6.2. 데이터베이스 생성
15.6.3. TAC 기동
15.6.4. TAC 모니터링

본 장에서는 Tibero Active Cluster의 기본 개념과 구성요소, 프로세스, 실행 및 운영 방법을 설명한다.

Tibero Active Cluster(이하 TAC)는 확장성, 고가용성을 목적으로 제공하는 Tibero의 주요 기능이다. TAC 환경에서 실행 중인 모든 인스턴스는 공유된 데이터베이스를 통해 트랜잭션을 수행하며 공유된 데이터에 대한 접근은 데이터의 일관성과 정합성 유지를 위해 상호 통제하에 이뤄진다.

큰 업무를 작은 업무의 단위로 나누어 여러 노드 사이에 분산하여 수행할 수 있기 때문에 업무 처리 시간을 단축할 수 있다.

여러 시스템이 공유 디스크를 기반으로 데이터 파일을 공유한다. TAC 구성에 필요한 데이터 블록은 노드 간을 연결하는 고속 사설망을 통해 주고받음으로써 노드가 하나의 공유 캐시(shared cache)를 사용하는 것처럼 동작한다. 운영 중에 한 노드가 멈추더라도 동작 중인 다른 노드들이 서비스를 지속하게 된다. 이러한 과정은 투명하고 신속하게 처리된다.

다음은 TAC 구조를 나타내는 그림이다.


TAC의 구조는 다음과 같은 모듈로 구성되어 있다.

TAC는 1개의 프로세스(ACSD, Active Cluster Service Daemon)가 추가로 생성된다. 이 프로세스는 ACCT, NMGR, DIAG, WRCF, CRCF, WLGC, CLGC, WATH, CATH, CMPT 스레드(thread)로 구성되며, 각 스레드는 다음과 같은 그룹에 각각 포함된다.

  • Active Cluster Control Thread

    스레드설명
    ACCTACCT는 클러스터 간 메시지 통신을 담당하는 스레드이다. 클러스터 내의 원격 노드로부터 CWS/CCC의 lock operation과 reconfiguration 요청(request)을 받아 CMPT에게 전달해주거나, 내 노드의 세션으로부터 전송해야 할 메시지를 넘겨 받아 원격 노드로 전송하는 스레드이다. 또한, ACSD 프로세스의 메인 스레드로서 나머지 스레드를 감독하는 역할을 한다.
  • Diagnostic Thread

    스레드설명
    DIAGDIAG는 클러스터 간 주고받는 요청에서 hang이 발생했을 때 이상 여부를 추후에 확인하기 위해 필요한 정보를 자동으로 덤프(dump)하는 스레드이다.
  • Cluster Message Processor(Message handler)

    스레드설명
    CMPT

    CMPT는 다른 노드에서 보낸 메시지의 요청을 처리하는 스레드이다. CMPT 스레드는 ACF_CMPT_CNT 초기화 파라미터에 설정된 값만큼 공통 풀(pool)로 생성된다.

    CMPT는 ACCT로부터 메시지를 받아 주로 다음과 같은 일을 수행한다.

    • CR block request를 받아 주어진 스냅샷(snapshot)에 해당하는 CR block을 생성하고 요청자에게 전송한다.

    • Current block request를 받으면 local block cache에 존재하는 Current block을 읽어서 요청자에게 전송한다.

    • Global write request를 받아 주어진 데이터 블록이 dirty이면 BLKW가 이를 디스크에 기록하도록 지시한다.

    • MTC IIC request를 받아 처리한다.

    • MLD(Master Lookup Directory) lookup/remove request를 받아 처리한다.

  • Asynchronous Thread

    스레드설명
    WATH, CATH

    CWS/CCC에서 세션을 담당하는 워킹 스레드가 처리해야 할 비동기적 업무를 대신 수행하는 스레드이다.

    WATH, CATH 스레드는 다음과 같은 특징이 있다.

    • BAST를 맞거나 스스로 잠금을 설정할 때 캐시된 lock mode를 downgrade하기 전에 BLKW로부터 disk write notification이나 LOGW로부터 log flush를 기다린 후 master에게 lock downgrade를 통보한다(이 특징은 CATH 스레드만이 수행할 수 있다).

    • BLKW가 master로부터 받은 global write request 처리를 완료한 후 CATH에게 통보해 준다. 또한 master에게 write done notify를 보낸다. 이 특징은 CATH 스레드만이 수행할 수 있다.

    • shadow resource block를 reclaim하기 전에 master에게 MC lock에 대한 제거 요청을 보낸다. 요청을 보낸 후 이에 대한 응답을 받아서 처리한다.

  • Garbage Collector

    스레드설명
    WLGC, CLGC

    주기적으로 lock resource을 관리하고 타임아웃을 체크하는 스레드이다.

    WLGC, CLGC 스레드는 다음과 같은 특징이 있다.

    • DDD(Distributed Deadlock Detection)를 수행하기 위해 주기적으로 타임아웃이 발생한 lock waiter를 체크한다. 체크할 때 교착 상태가 발생하면 DDD를 시작한다.

    • MTC retransmission queue에 설정된 메시지를 주기적으로 검사해서 타임아웃이 발생한 메시지를 다시 전송한다.

    • 주기적으로 TSN의 동기화를 수행한다(이 특징은 WLGC 스레드만이 수행할 수 있다).

    • lock resource를 위한 공유 메모리가 부족하게 되면 resource block reclaiming을 시작하여 필요한 리소스를 확보한다.

  • Reconfigurator

    스레드설명
    WRCF, CRCFNMGR 스레드로부터 node join 및 leave event를 받아 CWS/CCC lock remastering/reconfiguration을 수행한다.
  • Node Manager

    스레드설명
    NMGRTBCM과 통신하여 node join 및 leave event를 받아 처리하며 node 멤버십을 관리한다. 또한 WRCF, CRCF 스레드에 의해 수행되는 CWS/CCC reconfiguration을 통제(suspend 또는 resume)한다.

TAC는 기본적으로 싱글 인스턴스일 때의 설정은 그대로 사용한다. 이 외에는 추가로 설정해야 할 초기화 파라미터와 주의 사항이 있다.

다음은 TAC를 사용하기 위해 추가로 설정해야 하거나 주의해야 하는 초기화 파라미터의 예이다.

<<$TB_SID.tip>>

MEMORY_TARGET=6144M
TOTAL_SHM_SIZE=4096M
DB_CACHE_SIZE=2048M
CLUSTER_DATABASE=Y
THREAD=0
UNDO_TABLESPACE=UNDO0
LOCAL_CLUSTER_ADDR=192.168.1.1
LOCAL_CLUSTER_PORT=12345
CM_PORT=30000
초기화 파라미터설명
MEMORY_TARGET인스턴스가 사용할 전체 메모리의 크기를 설정한다. 이것은 공유 메모리, 정렬 및 해시 등의 메모리를 요구하는 연산에서 사용하는 메모리, DBMS 내부에서 사용되는 기타 메모리를 모두 포함한다. 이 중에 공유 메모리는 DBMS의 부팅과 동시에 점유하게 되지만 나머지 메모리는 필요에 따라 할당 및 해제를 반복하게 된다.
TOTAL_SHM_SIZE인스턴스가 사용할 전체 공유 메모리의 크기를 설정한다.
DB_CACHE_SIZETAC는 버퍼 캐시 이외에도 사용하는 공유 메모리가 많다. 따라서 버퍼 캐시의 크기를 싱글 인스턴스의 경우보다 더 작게 설정해야 한다. 일반적으로 전체 공유 메모리 크기의 절반 정도가 적절하다.
CLUSTER_DATABASETAC를 사용할 때 설정한다. 초기화 파라미터의 값은 반드시 'Y'로 설정해야 한다.
THREADRedo 스레드의 번호로 각 인스턴스마다 고유의 번호를 부여한다.
UNDO_TABLESPACEUndo 테이블 스페이스의 이름으로 각 인스턴스마다 고유하게 부여한다.
LOCAL_CLUSTER_ADDRTAC 인스턴스 간에 통신할 내부 IP 주소를 설정한다.
LOCAL_CLUSTER_PORTTAC 인스턴스 간에 통신할 내부 포트 번호를 설정한다. 이 포트는 노드 간에 열려 있어야 한다.
CM_PORT인스턴스가 CM과 통신하기 위한 포트 번호를 설정한다. 접속할 CM의 초기화 파라미터 중 CM_UI_PORT 파라미터와 동일하게 설정한다.

다음은 TAC를 설정할 때 주의해야 할 사항이다.

TAC는 공유 디스크 기반의 클러스터 데이터베이스이다. 여러 데이터베이스 서버의 인스턴스가 물리적으로 같은 데이터베이스 파일을 보고 사용하기 때문에 데이터베이스 생성은 한 서버에서 한 번만 수행하면 된다.

모든 서버의 인스턴스가 동일한 컨트롤 파일 및 데이터 파일을 읽고 쓰게 된다. 반면 TAC에서는 공유 디스크에서 데이터 접근의 경합을 최소화하기 위해 Redo 로그 및 Undo에 대해서는 인스턴스마다 별도의 파일을 가지고 있어야 한다. Redo 로그 및 Undo 정보는 각 서버의 인스턴스들이 별도의 파일에 저장하지만 복구 상황 등에 따라 다른 인스턴스의 정보를 읽어야 하므로 반드시 공유 디스크상에 존재해야 한다.

TAC를 위한 데이터베이스 생성 절차는 다음과 같다.

  1. Tibero와 관련된 환경설정 파일을 설정한 후 TBCM을 기동한다. CM을 설정하고 기동하는 자세한 방법은 “제14장 Tibero Cluster Manager”를 참고한다.

    $ tbcm -b

    TBCM을 기동했지만 Tibero를 직접 제어하지는 않는다.

  2. NOMOUNT 모드로 Tibero를 기동한다.

    $ tbboot -t NOMOUNT -c
  3. SYS 사용자로 접속한 후 CREATE DATABASE 문을 통해 데이터베이스를 생성한다.

    [tibero@tester ~]$ tbsql sys/tibero
    
    SQL> CREATE DATABASE "ac"               ... ① ...
         USER sys IDENTIFIED BY tibero
         MAXINSTANCES 8                        ... ② ...
         MAXDATAFILES 256
         CHARACTER SET MSWIN949        
         LOGFILE GROUP 0 'log001' SIZE 50M,
         GROUP 1 'log011' SIZE 50M,
         GROUP 2 'log021' SIZE 50M
         MAXLOGFILES 100
         MAXLOGMEMBERS 8
         NOARCHIVELOG
         DATAFILE 'system001' SIZE 512M
         AUTOEXTEND ON NEXT 8M MAXSIZE 3G
         DEFAULT TEMPORARY TABLESPACE TEMP
         TEMPFILE 'temp001' SIZE 512M
         AUTOEXTEND ON NEXT 8M MAXSIZE 3G
         EXTENT MANAGEMENT LOCAL AUTOALLOCATE
         UNDO TABLESPACE UNDO0
         DATAFILE 'undo001' SIZE 512M
         AUTOEXTEND ON NEXT 8M MAXSIZE 3G
         EXTENT MANAGEMENT LOCAL AUTOALLOCATE
         
    Database created.

    ① DB_NAME을 지정한다.

    ② 접근할 서버의 최대 인스턴스의 개수를 8로 지정한다.

    기존의 CREATE DATABASE 문과 비교해 달라진 부분은 없다. 다만, 데이터베이스 파일을 공유할 인스턴스의 최대 개수를 나타내는 MAXINSTANCE 파라미터를 주의해야 한다. 이 파라미터의 값은 컨트롤 파일과 데이터 파일의 헤더 등에 영향을 미치며 설정된 값 이상으로 Tibero의 인스턴스를 추가할 수 없으므로 TAC를 위해 데이터베이스를 생성할 때 충분한 값을 설정해야 한다.

    앞서 설명한 것처럼 각 서버의 인스턴스는 별도의 Redo 및 Undo 공간을 가져야 한다. CREATE DATABASE 문을 실행한 시점에 생성된 Undo 테이블 스페이스 및 Redo 로그 파일은 첫 번째 인스턴스를 위한 것으로 다른 인스턴스가 데이터베이스에 접근하기 위해서는 별도의 Redo 로그 그룹과 Undo 테이블 스페이스를 생성하는 것이 필요하다.

    생성된 Redo 로그 그룹은 자동으로 0번의 Redo 스레드가 된다. 따라서 CREATE DATABASE 문을 실행하기 전에 서버 인스턴스의 환경설정 파일($TB_SID.tip)의 THREAD 초기화 파라미터와 UNDO_TABLESPACE 초기화 파라미터는 다음과 같이 설정되어 있어야 한다.

    THREAD=0
    UNDO_TABLESPACE=UNDO0
  4. CREATE DATABASE 문을 실행하고 나면 Tibero가 자동으로 종료된다. Tibero를 다시 기동한 후 SYS 사용자로 접속하여 다음과 같이 Undo 테이블 스페이스와 새로운 Redo 로그 그룹을 만들고 DDL 문장을 수행한다.

    [tibero@tester ~]$ tbboot
    [tibero@tester ~]$ tbsql sys/tibero
    
    SQL> CREATE UNDO TABLESPACE UNDO1
         DATAFILE 'undo011' SIZE 512M
         AUTOEXTEND ON NEXT 8M MAXSIZE 3G
         EXTENT MANAGEMENT LOCAL AUTOALLOCATE
         
    Tablespace 'UNDO1' created.
    SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 3 'log031' size 50M;
    Database altered.
    
    SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 'log041' size 50M;
    Database altered.
    
    SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 'log051' size 50M;
    Database altered.
    
    SQL> ALTER DATABASE ENABLE PUBLIC THREAD 1;     ... ① ...
    Database altered.

    ① Redo 스레드를 활성화하는 DDL 문장을 실행한다.

    Redo 로그 그룹을 추가하기 위한 기존의 DDL 문장과 같지만 THREAD 번호를 지정했다는 것에 주의해야 한다. 이 예제에서는 두 번째 인스턴스가 사용할 Undo 테이블 스페이스 UNDO1과 Redo 스레드 1을 위한 Redo 로그 그룹을 추가하고 활성화시키는 과정을 보여주고 있다.

    Redo 스레드는 숫자로 지정하며 CREATE DATABASE 문을 실행할 시점에 생성한 Redo 로그 그룹이 0번 스레드가 되므로 반드시 1부터 지정해야 한다. 0번 스레드는 CREATE DATABASE 문을 실행할 시점에 자동으로 활성화된다.

    주의

    Redo 로그 그룹의 번호는 Redo 스레드 내에서가 아니라 데이터베이스 전체에서 유일해야 하므로 이미 사용된 0, 1, 2를 사용할 수 없다. 또한 최소한 두 개 이상의 Redo 로그 그룹이 존재해야만 해당 Redo 스레드를 활성화시킬 수 있다. 또 다른 인스턴스를 추가하려면 위와 같은 과정을 참고하여 Undo 테이블 스페이스와 Redo 스레드를 생성하고 스레드를 활성화한다.

  5. TAC raw device 환경 또는 공유 파일 시스템이면서 DB_CREATE_FILE_DEST가 적절한 경로로 지정되지 않은 환경에서는 Tibero가 정상적으로 기동되지 않을 수 있다. 이와 같은 경우 다음과 같이 TPR 관련 정보를 저장할 테이블 스페이스(SYSSUB)를 먼저 추가해야 한다.

    [tibero@tester ~]$ tbsql sys/tibero
    
    SQL> CREATE TABLESPACE SYSSUB DATAFILE '<SYSSUB 위치>/syssub001.dtf' ...;
         
    Tablespace 'SYSSUB' created.

    참고

    이 과정을 생략하고 다음 단계를 수행한 경우 "Tibero 설치 안내서"의 "7장 TAC 설치와 제거"와 "Appendix A. 설치 후 문제 해결"을 참고한다.

  6. $TB_HOME/scripts 디렉터리에 있는 system.sh 스크립트 파일을 실행한다. Windows 환경에서는 system.vbs 파일이다.

    [tibero@tester scripts]$ system.sh $TB_HOME/bin/tbsvr
    Creating the role DBA...
    Creating system users & roles...
    Creating virtual tables(1)...
    Creating virtual tables(2)...
    Granting public access to _VT_DUAL...
    Creating the system generated sequences...
    Creating system packages:
        Running /home/tibero/tibero7/scripts/pkg_standard.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_output.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_lob.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_utility.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_obfuscation.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_transaction.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_random.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_lock.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_system.sql...
        Running /home/tibero/tibero7/scripts/pkg_dbms_job.sql...
        Running /home/tibero/tibero7/scripts/pkg_utl_raw.sql...
        Running /home/tibero/tibero7/scripts/pkg_utl_file.sql...
        Running /home/tibero/tibero7/scripts/pkg_tb_utility.sql...
    Creating public synonyms for system packages...
       ............................................
  7. 다른 서버의 인스턴스를 기동하고 운영한다.

본 절에서는 TAC 실행에 필요한 사항과 데이터베이스 생성, TAC의 기동 및 모니터링 방법에 대해서 설명한다.

TAC를 처음 기동할 때는 데이터베이스를 생성해야 한다. 클러스터로 사용할 한 노드에서 생성하면 된다. TACTibero를 기동할 때에는 CM이 필수이므로 CM을 먼저 설정한 후 시작하고 Tibero를 NOMOUNT 모드로 기동한다. CM 설정에 관한 내용은 자세한 방법은 “제14장 Tibero Cluster Manager”를 참고한다.

다음은 CM 설정을 마친 후 Tibero를 NOMOUNT 모드로 기동하는 예이다.

tac1@tester ~]$ tbboot -t NOMOUNT
listener port = xxxx
change core dump dir to /home/tibero7/bin/prof

Tibero 7 

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Tibero instance started up (NOMOUNT mode).

tac1@tester ~]$ 

NOMOUNT 모드로 기동된 첫 번째 TAC의 인스턴스에 접속하여 데이터베이스를 만든 후 다른 클러스터의 인스턴스를 위한 Redo 로그, Undo 로그를 생성한다. 인스턴스의 $TB_SID.tip 환경설정 파일에 지정한 THREAD, UNDO_TABLESPACE 초기화 파라미터의 이름과 반드시 일치해야 한다.