제13장 Tibero Standby Cluster

내용 목차

13.1. 개요
13.2. 프로세스
13.3. 로그 전송 방식
13.4. Primary 설정 및 운용
13.5. Standby 설정 및 운용
13.5.1. Standby의 read only 모드
13.6. TAC-TSC 구성
13.7. 데이터베이스의 역할 전환
13.7.1. Switchover
13.7.2. Failover
13.8. 클라이언트의 설정
13.9. Tibero Standby Cluster 정보 조회
13.10. 제약 사항
13.11. 유용한 추가 기능
13.11.1. Standby Redo Log Group
13.11.2. Snapshot Standby
13.11.3. Cascading Standby

본 장에서는 Tibero Standby Cluster의 구성요소와 동작 및 운영 방법을 설명한다.

Tibero Standby Cluster는 데이터베이스의 고가용성, 데이터의 보호, 재난 복구 등을 목적으로 제공하는 Tibero의 핵심 기능이다.

Tibero Standby 서버는 물리적으로 독립된 장소에 원본 데이터베이스의 복사본을 트랜잭션 단위로 보관한다. 복사할 대상이 되는 원본 데이터베이스를 Primary DB(이하 Primary)라 하고, 복사된 데이터가 저장되는 데이터베이스를 Standby DB(이하 Standby)라고 한다.

Tibero Standby Cluster의 원리는 Primary에서 생성된 Redo 로그를 배경 프로세스가 Standby로 전송하고, Standby는 Redo 로그를 이용해 Primary의 모든 변화를 똑같이 반영하는 것이다.

다음은 Tibero Standby Cluster가 어떻게 동작하는지를 나타내는 그림이다.


데이터의 복사를 통해 Primary는 서비스가 요청한 데이터 처리에 실패했을 경우 Standby의 데이터를 활용해 해당 서비스를 신속히 재개할 수 있다. 또한 Primary의 서버만으로는 손상된 데이터를 복구를 할 수 없는 경우에도 쉽게 대처할 수 있다.

예를 들면 Primary의 서버의 디스크가 손상된 경우 Standby를 통해 손상된 데이터를 보호할 수 있다.

Tibero Standby Cluster의 프로세스는 다음과 같다.

Primary에서 Standby로 로그가 전송되는 방식은 다음과 같다.

로그 전송 방식설명
LGWR SYNCLGWR가 Redo 로그를 디스크에 기록할 때 LNW를 통해 Standby에 Redo 로그를 전송한다.
LGWR ASYNCLNW가 직접 온라인 Redo 로그 파일을 읽어서 Standby로 보낸다.
ARCH ASYNCARCH가 로그 순환을 할 때 아카이브 로그를 만든 후 LNW에게 알려주고, LNW는 아카이브 로그 파일을 읽어 Standby로 보낸다.

Primary DB의 동작 모드에는 다음과 같다.

구성요소설명
PROTECTION 모드

적어도 하나 이상의 LGWR SYNC를 포함해야 한다.

LGWR는 디스크에 기록하는 것 외에도 LGWR SYNC인 Standby 중 적어도 하나의 Standby로부터 성공했다는 응답을 받아야 진행할 수 있다. 모든 LGWR SYNC인 Standby가 실패한 경우 Primary도 같이 실패하고 더 이상 진행하지 않는다.

AVAILABILITY 모드

적어도 하나 이상의 LGWR SYNC를 포함해야 한다.

모든 LGWR SYNC인 Standby가 실패하면 Standby와의 동기화를 포기한다. 하지만 Primary는 계속 진행한다.

PERFORMANCE 모드로그 전송 방식에 제한이 없고 Standby의 실패와 무관하게 Primary는 계속 진행한다.

다음은 Standby로 연결할 데이터베이스의 정보와 각 Standby의 종류 그리고 동작 모드를 설정하는 방법이다.

<<$TB_SID.tip>>

LOG_REPLICATION_MODE   = {PROTECTION|AVAILABILITY|PERFORMANCE}
LOG_REPLICATION_DEST_1 = "hostname_1:port_1 {LGWR SYNC|LGWR ASYNC|ARCH ASYNC}"
LOG_REPLICATION_DEST_2 = "hostname_2:port_2 {LGWR SYNC|LGWR ASYNC|ARCH ASYNC}"
...
LOG_REPLICATION_DEST_N = "hostname_N:port_N {LGWR SYNC|LGWR ASYNC|ARCH ASYNC}"

다음은 위 파일에서 설정한 각 초기화 파라미터에 대한 설명이다.

Primary를 NORMAL 모드로 기동하면 $TB_SID.tip 파일에 설정된 각 Standby와 연결이 이루어지고, 배경 프로세스에 의해 자동으로 데이터 이중화(Replication)가 이루어진다. 예를 들어 PROTECTION이나 AVAILABILITY 동작 모드로 기동하고 LGWR SYNC인 Standby가 모두 연결이 불가능한 상태라면 Primary도 운영이 불가능하므로 반드시 Standby를 먼저 기동해야 한다. 그 외의 경우에는 Standby를 나중에 기동하더라도 자동으로 연결되므로 운영이 가능하다.

참고

Primary에서 데이터베이스를 생성하는 동안에는 $TB_SID.tip 파일에 있는 Standby 설정이 무시된다. 따라서 Primary에서 생성된 DB 파일을 DBA가 수동으로 Standby로 복사해야 한다.

Standby를 운영하기 위해 필요한 설정 과정은 다음과 같다.

  1. Primary에서 백업한 DB 파일을 복사해서 Standby를 구성한다.

    컨트롤 파일, 온라인 로그 파일, 패스워드 파일을 포함한 모든 데이터 파일을 복사한다. 패스워드 파일을 함께 복사하는 이유는 Primary가 Standby에 SYS 권한을 가지고 접속하므로 SYS의 패스워드가 서로 일치해야 하기 때문이다.

  2. Standby의 $TB_SID.tip 파일을 열어 DB_NAME이 Primary와 같도록 수정한다.

  3. $TB_SID.tip 파일에서 컨트롤 파일이 위치하는 디렉터리 경로가 1번에서 Primary 파일을 복사한 경로와 일치하는지 확인한다. 또한 DB_BLOCK_SIZE도 Primary에 설정된 것과 같아야 한다. 설정이 같으면 복사한 데이터 파일을 열 수 있다.

    Primary의 백업을 가져다 놓은 Standby의 디렉터리의 경로가 원래와 달라진 경우에는 Standby의 $TB_SID.tip 파일에 다음과 같이 경로 변환을 위한 정보를 추가해야 한다.


    Primary와 Standby의 절대 경로는 각각 Primary와 Standby의 instance 디렉터리의 절대 경로이다.

  4. Standby를 MOUNT 모드로 기동한 후 다음의 DDL 문장을 수행하면 해당 DB를 Standby로 설정하고, 변환된 경로가 컨트롤 파일에 적용된다.


    경로가 다른데도 위의 과정을 수행하지 않고 Standby를 기동하는 경우 컨트롤 파일에 적힌 경로에 데이터 파일을 열 수 없다는 에러가 발생한다.

  5. Standby를 운영하기 위한 설정을 완료하면 다음의 명령을 통해 DB가 Standby로 동작하도록 기동시킨다.


    NORMAL 모드로 Standby를 한 번이라도 기동하게 되면 더 이상 Standby로서의 기능은 할 수 없고, 앞서 설명한 과정을 다시 반복하여 Standby를 설정해야 한다는 점에 주의한다.

    Standby가 기동하기 전에 DB 파일이 이전의 버전이라 하더라도 일관성만 유지한다면 동작에는 문제가 없다. 내부적으로 Primary가 접속하여 Primary와 Standby 사이의 로그 갭(log gap)을 자동으로 맞춰 동작한다. 하지만 이 과정이 모두 Redo 로그에 의존하므로 두 DB 사이의 차이가 크고, Primary가 ARCHIVELOG 모드가 아니라면 필요한 Redo 로그가 존재하지 않아 동작이 불가능할 수 있다. 따라서 Primary는 ARCHIVELOG 모드로 동작시키거나 최근에 백업한 Primary를 Standby로 복사하여 두 DB의 DB 파일을 맞춘 후에 Primary를 동작시키는 것이 바람직하다.

Standby는 내부적으로 Primary로부터 받은 Redo 로그를 디스크에 기록하고, 이를 복구하여 데이터 파일에도 반영하는 일을 수행하는 RECOVERY 모드로 동작하기 때문에 DB에 사용자의 접근이 제한된다.

Standby를 read only 클러스터용으로 사용하는 경우와 같이 Standby에서 Redo 로그를 반영하는 과정을 중단하지 않고 읽기 작업을 원하는 경우가 있다. 그 때에는 다음의 DDL 문장을 실행하면 Standby는 복구 과정을 멈추지 않고 read only 세션을 허용한다.


Standby가 LGWR SYNC 모드로 설정되어 Primary와 동기화되어 있는 경우라면 Primary에 접속한 경우와 같이 최근에 커밋된 내용을 Standby에서도 볼 수 있다. 이 상태에서는 비록 DB 서버가 read only 모드임에도 불구하고 데이터의 내용이 변경될 수 있다는 사실에 주의해야 한다.

Standby를 다시 RECOVERY 모드로 전환시킬 때는 다음의 DDL 문장을 수행한다. 단, 연결 된 세션이 있다면 세션 작업이 끝날 때까지 기다린 후 RECOVERY 모드로 전환된다.


세션 작업이 끝날 때까지 기다리지 않고 바로 RECOVERY 모드로 전환해야 될 경우 다음의 DDL 문장을 수행한다. 다음의 DDL은 연결 된 모든 세션을 강제로 중지시킨 후 RECOVERY 모드로 전환한다.


Primary가 Single이 아니라 TAC일 때도 Standby를 운용할 수 있다.

다음은 TAC-TSC를 구성하는 절차이다.

  1. TAC-TSC를 구성하기 위해선 Standby도 TAC 구성이어야 한다. 단, Standby에서 복구는 한 노드에서 진행되므로 Standby 쪽은 1-node TAC로 구성한다. TAC 구성 방법은 “14.6. TAC 구성”을 참고한다.

  2. Primary 모든 노드의 $TB_SID.tip 파일에 LOG_REPLICATION_MODE와 LOG_REPLICATION_DEST_N 파라미터를 설정한다. 가급적이면 모든 노드에 대해 동일하게 설정해 주는 것을 권장한다.

  3. “13.5. Standby 설정 및 운용”과 마찬가지로 Primary에서 백업한 DB 파일로 Standby를 구성하고, DB_NAME 수정, 파일 경로 변환 등을 수행한 후 기동한다.

TAC-TSC 구성에서 Primary 쪽에 다운되어 있는 노드가 있다면 Standby 노드는 해당 노드의 Redo 로그를 전송받지 못하고, 복구를 정상적으로 수행할 수 없다. Primary 쪽에서 아래의 파라미터를 활성화시켜주면 Primary의 다른 노드가 다운되어있는 노드의 Redo 로그를 대신 전송해주어 Standby 쪽에서 복구가 정상적으로 수행될 수 있다. Primary 노드가 일부 다운된 상황에서도 동기화를 이어가고 싶다면 필수적으로 설정해주어야 한다.

<<$TB_SID.tip>>

STANDBY_ENABLE_LOG_RECOVERY=Y

이렇게 다운된 노드의 로그를 대신 전송해주는 방식을 LGWR PROXY라고 하며, 위의 파라미터를 적용한 채 Primary를 기동하면 기본적으로 생성되어 있는 LGWR PROXY LNW들 중 자기 자신을 제외한 노드 개수 만큼의 LNW가 할당된다. 한 노드에서 최대 9개의 LNW가 가능하기 때문에 2-node TAC-TSC 구성에서는 8개의 LGWR PROXY LNW가 생성되고, 그 중 하나가 할당된다. Primary 중 한 노드가 다운되면 다른 노드에서는 다운된 노드에 대한 LGWR PROXY LNW의 상태가 CONNECTED로 바뀌고, 다운된 노드의 로그를 대신 전송해준다.

SQL> select * from v$standby_dest;
STANDBY_ADDR
--------------------------------------------------------------------------------
TYPE                THREAD# FLAGS                              SENT_SEQ
---------------- ---------- -------------------------------- ----------
SENT_BLKNO  ACKED_SEQ ACKED_BLKNO      DELAY
---------- ---------- ----------- ----------
127.0.0.1:11004
LGWR ASYNC                0 CONNECTED                                11
       894         11         894          0

127.0.0.1:11004
LGWR PROXY                1 CONNECTED                                 7
       880          7         880          0

Not Assigned:0
LGWR PROXY            65535 NOT CONNECTED                            -1
        -1         -1          -1          0

(중략)

Not Assigned:0
LGWR PROXY            65535 NOT CONNECTED                            -1
        -1         -1          -1          0


9 rows selected.

위의 파라미터를 사용할 때 로그 전송 방식이 ASYNC 모드일 경우 다운된 노드의 아카이브 로그를 대신 읽어야 할 경우가 생길 수 있다. 이를 위해선 Primary 각 노드의 LOG_ARCHIVE_DEST가 동일한 위치로 설정되어 있어야 한다. 하지만 일반적인 공유 디스크 환경에서는 이것이 불가능하므로 TAS를 사용해야 한다. TAS-TAC-TSC를 구성하는 방법은 TASCMD 의 cptolocal, cpfromlocal 명령어를 사용하여 Cold Backup을 이용해 구축하는 방법과 tbrmgr의 --for-standby 옵션을 사용해 Hot Backup으로 구축하는 방법이 있다.

참고

STANDBY_ENABLE_LOG_RECOVERY=Y일 경우 '설정된 DEST의 수'에 'TAC의 노드 수'를 곱한 값이 9를 초과하면 안된다.

멀티노드 TSC

TAC-TSC 구성에서 Standby는 TAC이지만 기본적으로 복구를 담당하는 노드 하나만 부팅이 가능하다. 하지만 Standby를 read only 모드로 사용하고자 할 때 한 노드가 복구와 사용자의 쿼리를 동시에 처리해야 하기 때문에 성능의 저하가 생길 수 있다.

멀티노드 TSC 기능은 TAC-TSC 구성에서 최대 Primary의 노드 개수만큼 Standby 노드를 부팅시킬 수 있는 기능이다.

Standby 쪽에 TAC를 구성 후 Standby 모든 노드의 $TB_SID.tip 파일에 아래 파라미터를 설정해주면 멀티노드 TSC 기능이 활성화된다. 멀티노드 TSC를 구성하는 경우 Primary와 마찬가지로 Standby 각 노드에는 고유의 Redo 스레드가 할당되어야 한다.

<<$TB_SID.tip>>

STANDBY_ENABLE_TAC_MULTINODE=Y

멀티노드 TSC 기능을 사용하면 복구를 담당하는 노드 외에 추가적으로 read only 모드로 동작 가능한 Standby 노드를 부팅시킬 수 있다. 추가로 부팅된 read only 노드를 이용하면 사용자의 쿼리 부하를 분산시킬 수 있어 복구 및 쿼리의 성능이 향상되는 효과를 기대할 수 있다.

Standby에서 복구를 담당하는 노드는 Primary의 $TB_SID.tip 파일에서 설정된 노드이며, 복구는 한 노드가 담당하므로 모든 Primary의 $TB_SID.tip 파일에 동일하게 설정되어 있어야 한다.

Primary를 재기동하지 않고 복구를 담당하는 노드를 바꾸고 싶다면 Primary 모든 노드에서 아래의 sql을 수행해주면 된다. 단, Primary 각 노드에 설정된 LOG_REPLICATION_DEST가 다른 상황은 허용되지 않으므로 모든 노드의 연결 정보를 수정한 후에 동기화를 활성화해야 한다.

sql> alter sysetm set LOG_REPLICATION_1_ENABLE=N; (동기화 비활성화)
sql> alter system set LOG_REPLICATION_DEST_1 = "hostname_1:port_1
{LGWR SYNC|LGWR ASYNC|ARCH ASYNC}"; (연결 정보 수정)
sql> alter system set LOG_REPLICATION_1_ENABLE=Y; (바꾼 설정으로 동기화 활성화)

참고

멀티노드 TSC 기능을 사용하는 Standby는 RECOVERY 모드로 부팅 시 READONLY 모드로 전환되고, RECOVERY 모드로 변경될 수 없다. 따라서 아래의 DDL은 멀티노드 TSC 기능을 사용하는 Standby에서는 수행이 제한된다.

alter database standby;
alter database standby immediate;

본 절에서는 Standby를 Primary로 전환하는 과정을 두 가지 시나리오로 나누어 설명한다.

Primary와 Standby에 모두 접속하기 위해서는 tbdsn.tbr 파일에 각 DB의 접속 정보를 추가해야 한다.

예를 들면 다음과 같다.

<<tbdsn.tbr>>

PrimaryDB_SID=(
               (INSTANCE=(HOST=primaryDB_hostname)
                         (PORT=primaryDB_port)
                         (DB_NAME=cluster_DB_NAME)
               )
)

StandbyDB_SID=(
               (INSTANCE=(HOST=StandbyDB_hostname)
                         (PORT=StandbyDB_port)
                         (DB_NAME=cluster_DB_NAME)
               )
)

Primary와 Standby의 $TB_SID.tip 파일을 설정할 때 공통의 DB_NAME을 각각 SID 별로 설정해야 한다.

Tibero에서는 Tibero Standby Cluster의 상태 정보를 제공하기 위해 다음 표에 나열된 동적 뷰를 제공하고 있다.

동적 뷰설명
V$STANDBY_DESTPrimary에 설정된 각 Standby의 연결 정보 및 Redo 로그의 전송 상태를 조회하는 뷰이다. Primary에서만 이 뷰를 사용할 수 있다.
V$STANDBYStandby에서 Primary의 연결 정보와 전달 받은 Redo 로그와 이미 반영된 Redo 로그의 상태를 조회하는 뷰이다. Standby에서만 이 뷰를 사용할 수 있다.
V$STANDBY_LOGStandby에서 USE_STANDBY_REDO_LOG 기능을 사용할 경우 Standby Redo 로그의 정보를 조회하는 뷰이다.
V$STANDBY_LOGFILEStandby에서 USE_STANDBY_REDO_LOG 기능을 사용할 경우 Standby Redo 로그 파일의 정보를 조회하는 뷰이다.
V$STANDBY_ARCHIVED_LOGStandby에서 USE_STANDBY_REDO_LOG 기능을 사용할 경우 생성된 아카이브 로그의 정보를 조회하는 뷰이다.

참고

동적 뷰에 대한 자세한 내용은 "Tibero 참조 안내서"를 참고한다.

Tibero Standby Cluster는 Primary에서 생성된 Redo 로그를 그대로 Standby에 전송하므로 서로 간의 컴퓨팅 환경(CPU bus size, endianness, OS 등)이 동일해야 하고, $TB_SID.tip 파일의 데이터베이스 블록의 크기도 동일해야 한다.

Redo 로그를 적용하는 Standby Cluster의 특성으로 데이터베이스 파일의 상태를 변경하는 DDL 중 일부는 허용하지 않는다. 이와 같은 연산은 Standby 없이 수행해야 한다. 즉, 데이터베이스를 백업하여 Standby에 적용해야 하는 제약이 있다.

다음은 Standby Cluster에서 지원하지 않는 작업들이다. 기존에는 로그가 남지 않는 DPL, DPI에 대해 지원하지 않았지만, 현재 Standby가 연결되어 있을 때 강제로 로깅을 하고 있다.

  • 일부 데이터베이스 변경 DDL

    ALTER DATABASE ADD LOGFILE
    ALTER DATABASE DROP LOGFILE
    ALTER DATABASE TEMPFILE
    ALTER DATABASE DATAFILE OFFLINE
  • JAVA EXTERNAL PROCEDURE 컴파일을 수행하는 DDL

    CREATE OR REPLACE AND RESOLVE JAVA SOURCE
    CREATE OR REPLACE AND COMPILE JAVA SOURCE

참고

1. Standby가 Read only 모드일 경우 DB Link 기능은 사용할 수 없다.

2. Standby Cluster에서 암호화 테이블 스페이스를 사용하려면 Primary와 Standby의 보안 지갑 마스터 키가 같아야 한다. 즉, 한 쪽에서 생성된 보안지갑을 복사해서 써야 한다. 또한 Standby에서 보안 지갑이 열려있어야 한다.

TSC 는 다양한 추가 기능들을 제공한다.

Snapshot Standby는 Primary와의 동기화는 계속 진행됨과 동시에 독자적으로 ddl/dml을 수행할 수 있는 Standby이다. 사용자는 자신이 원하는 시점에 Standby를 Snapshot Standby로 전환할 수 있으며, Snapshot Standby로 전환된 후 언제든지 다시 Standby로 전환할 수 있다. Snapshot Standby에서는 Redo 로그는 계속 동기화되지만, 받은 로그에 대한 SMR의 리커버리는 중단된다. Standby로 전환할 때 전환 후에 다시 Primary와의 동기화를 이어가기 위해서 Snapshot Standby로 전환된 후에 발생된 모든 변경 사항은 버려지고, DB는 처음 Snapshot Standby로 전환되었던 시점으로 돌아간다.

Standby는 독자적인 ddl/dml이 불가능한 데에 반해, Snapshot Standby는 독자적으로 ddl/dml을 수행할 수 있어 Standby를 테스트 용도로 사용할 수 있고, 그러면서도 Primary와의 동기화는 계속 유지되므로 DR로서의 본연의 역할도 수행할 수 있다.

Standby에서 Snapshot Standby로 전환하기 위한 절차는 다음과 같다.

  1. 초기화 파라미터 FLASHBACK_LOG_BUFFER와 USE_STANDBY_REDO_LOG를 설정한다. (“11.6.3. 플래시백 데이터베이스 실행 예제” 참고)

    FLASHBACK_LOG_BUFFER=100M
      USE_STANDBY_REDO_LOG=Y
  2. DB를 MOUNT 모드로 기동한다.

  3. Standby Redo Log Group이 구성되어 있지 않다면 구성한다. (“13.11.1. Standby Redo Log Group” 참고)

    sql> alter database add standby logfile thread 0 group 1 
    '/usr/tibero/log/stlog001.slf' size 100M;
    sql> alter database add standby logfile thread 0 group 2 
    '/usr/tibero/log/stlog002.slf' size 100M;
    sql> alter database add standby logfile thread 0 group 3 
    '/usr/tibero/log/stlog003.slf' size 100M;
    sql> alter database add standby logfile thread 0 group 4 
    '/usr/tibero/log/stlog004.slf' size 100M;
    sql> alter database add standby logfile thread 0 group 5 
    '/usr/tibero/log/stlog005.slf' size 100M;
    sql> alter database add standby logfile thread 0 group 6 
    '/usr/tibero/log/stlog006.slf' size 100M;
    sql> alter database enable public standby redo thread 0;
    sql> alter database recover automatic for standby;
  4. 플래시백 로그가 구성되어 있지 않다면 구성한다. (“11.6.3. 플래시백 데이터베이스 실행 예제” 참고)

    sql> alter database add flashback logfile thread 0 group 1 
    '/usr/tibero/log/fblog001.fb' size 512M;
    sql> alter database add flashback logfile thread 0 group 1 
    '/usr/tibero/log/fblog002.fb' size 512M;
    sql> alter database add flashback logfile thread 0 group 1 
    '/usr/tibero/log/fblog003.fb' size 512M;
    sql> alter database enable public flashback thread 0;
  5. Snapshot Standby로의 전환 ddl을 수행한다.

    sql> alter database convert to snapshot standby;
  6. DB를 RESETLOGS 모드로 기동한다.

Snapshot Standby에서 수행된 모든 ddl/dml의 변경 사항은 Redo 로그에 저장된다. 따라서 Primary로부터 받은 Redo 로그를 저장하기 위해선 Standby Redo Log Group 기능을 사용해야 한다. Standby Redo Log Group 기능에서는 로그 스위치의 경우 재사용할 로그 파일에 대한 checkpoint를 기다리지 않기 때문에 Primary로부터 계속 Redo 로그를 받아 놓을 수 있다.

Snapshot Standby를 다시 Standby로 전환한 후에는 SMR의 리커버리가 재개되어야 하는데, 이를 위해서는 SMR의 리커버리가 중단되었던 즉 Snapshot Standby로 전환되었던 시점으로 돌아가야 한다. Standby를 과거로 돌리기 위해 Flashback Database 기능이 사용되며, 이를 위해 플래시백 로그를 구성해야 한다. 또한 전환 ddl 수행 시 Snapshot Standby에서 수행될 변경 사항에 대한 플래시백 로깅이 활성화된다.