GOLDILOCKS 데이터베이스 이중화

이중화 소개

본 장에서는 CYCLONE과 LOGMIRROR에 대해 설명한다.

GOLDILOCKS의 이중화는 CDC 방식을 사용하여 transaction을 이중화하는 CYCLONE과 원본 데이터베이스의 redo log file을 이중화하는 LOGMIRROR를 지원한다.

이중화 tool 소개

이름

이중화 대상

설명

CYCLONE

Transaction

CDC 방식을 사용하여 master에 반영된 transaction을 이중화하여 slave에 반영한다.

LOGMIRROR

Redo log file

Master 데이터베이스의 redo log file을 slave에 동일하게 이중화한다.

운영 방법

CYCLONE

일반적인 운영 방법과 옵션에 대한 자세한 내용은 CYCLONE을 참조한다.

노드 추가와 삭제

CYCLONE은 group 단위로 수행되며 이는 이중화 노드와 동일하다. 만약 노드를 추가할 경우에는 group을 추가하고 삭제할 경우에는 group을 삭제하도록 한다.

노드 추가 예

...
...
GROUP_NAME = Group1
{
    PORT = 21102
    CAPTURE_TABLE =
    (
        testTable1,
        testTable2
    )
}
GROUP_NAME = Group2
{
    PORT = 21103
    CAPTURE_TABLE =
    (
        testTable5,
        testTable6
    )
}
...
...
GROUP_NAME = Group1
{
    PORT = 21102    
    APPLY_TABLE = 
    (
        testTable1 To testTable3,
        testTable2 To testTable4
    )
}
{
    PORT = 21103    
    APPLY_TABLE = 
    (
        testTable5 To testTable7,
        testTable6 To testTable8
    )
}
prompt> cyclone --master --start --group Group2
[GROUP2] Startup done as Master.

prompt> cyclone --master --status
======================================
|       CYCLONE STATUS - MASTER      |
======================================
 GROUP1 Running...
 GROUP2 Running...
--------------------------------------
prompt> cyclone --slave --start --group Group2
[GROUP2] Startup done as Slave.

prompt> cyclone --slave --status
======================================
        CYCLONE STATUS - SLAVE        
======================================
 GROUP1 Running...
 GROUP2 Running...
--------------------------------------

노드 삭제 예

prompt> cyclone --slave --stop --group Group2
stop done.

prompt> cyclone --slave --status
======================================
CYCLONE STATUS - SLAVE
======================================
GROUP1 Running...
--------------------------------------
prompt> cyclone --master --stop --group Group2
stop done.

prompt> cyclone --master --status
======================================
CYCLONE STATUS - MASTER
======================================
GROUP1 Running...
--------------------------------------
...
...
GROUP_NAME = Group1
{
    PORT = 21102
    CAPTURE_TABLE =
    (
        testTable1,
        testTable2
    )
}
GROUP_NAME = Group2
{
    PORT = 21103
    CAPTURE_TABLE =
    (
        testTable5,
        testTable6
    )
}
...
...
GROUP_NAME = Group1
{
    PORT = 21102    
    APPLY_TABLE = 
    (
        testTable1 To testTable3,
        testTable2 To testTable4
    )
}
GROUP_NAME = Group2
{
    PORT = 21103    
    APPLY_TABLE = 
    (
        testTable5 To testTable7,
        testTable6 To testTable8
    )
}

이중화 초기화

기존에 이중화를 수행했던 노드나 그룹에 포함된 table이 DDL 수행 등의 이유로 수행을 give up 했을 경우 이중화를 초기화할 수 있다. 특정 노드 또는 전체 노드를 초기화할 수 있다.

이중화 초기화는 slave에서 수행하고 있는 이중화를 --reset 옵션을 사용하여 재시작하는 방식으로 수행한다. Master에서는 특별한 작업을 수행하지 않아도 된다.

특정 노드의 이중화 초기화 예

prompt> cyclone --slave --stop --group Group2
stop done.

prompt> cyclone --slave --status
======================================
        CYCLONE STATUS - SLAVE        
======================================
 GROUP1 Running...
--------------------------------------
prompt> cyclone --slave --start --reset --group Group2
[GROUP2] Startup done as Slave.

prompt> cyclone --slave --status
======================================
        CYCLONE STATUS - SLAVE        
======================================
 GROUP1 Running...
 GROUP2 Running...
--------------------------------------

전체 노드의 이중화 초기화 예

prompt> cyclone --slave --stop
prompt> cyclone --slave --start --reset
[GROUP1] Startup done as Slave.
[GROUP2] Startup done as Slave.

prompt> cyclone --slave --status
======================================
        CYCLONE STATUS - SLAVE        
======================================
 GROUP1 Running...
 GROUP2 Running...
--------------------------------------

LOGMIRROR

일반적인 운영 방법과 옵션에 대한 자세한 내용은 LOGMIRROR를 참조한다.

LOGMIRROR 상태 확인

LOGMIRROR와 연동할 경우 GOLDILOCKS는 LOGMIRROR의 응답 대기 과정을 포함한다. 만약 LOGMIRROR가 응답을 기다리고 있다면 GOLDILOCKS 역시 blocked 된 상태로 대기한다. 이런 상태는 v$system_stat에서 확인할 수 있다.

gSQL> SELECT * FROM V$SYSTEM_STAT WHERE STAT_NAME='LOG_MIRROR_SYNC_STATE';

STAT_NAME             STAT_VALUE COMMENTS                                     
--------------------- ------ ---------------------------------------------
LOG_MIRROR_SYNC_STATE      0 logmirror sync state( 0 : sync, 1 : blocked )


1 row selected.

STAT_VALUE가 '0'이면 대기 상태가 아닌 일반적인 상황이고 '1'이면 응답을 기다리는 blocked 상태이다. 응답을 기다리는 상황에서 GOLDILOCKS의 서비스를 재개할 경우, LOG_MIRROR_TIMEOUT을 변경하여 LOGMIRROR 서비스를 중단할 수 있다.

gSQL> ALTER SYSTEM SET LOG_MIRROR_TIMEOUT = 20;

System altered.

이중화 초기화

LogMirror의 이중화 초기화는 수동으로 수행해야 한다. 이는 사용자가 옵션을 잘못 사용하여 데이터가 삭제되거나 복구 불능 상태가 되지 않도록 하기 위함이다.

LOGMIRROR의 slave에는 control 파일과 redo log file이 저장되고 control 파일에는 운영에 필요한 정보가 저장 및 갱신된다.

이중화 초기화 예

prompt> logmirror --slave --stop 
stop done.
prompt> logmirror --master --stop 
stop done.

Trace Log

Trace log에 대한 자세한 정보는 다음과 같다.

이름

구분

파일 이름

CYCLONE

Master

cyclone_master_GROUP_NAME.trc

Slave

cyclone_slave_GROUP_NAME.trc

LOGMIRROR

Master

LogMirror_master.trc

Slave

LogMirror_slave.trc

CYCLONE 에러 메시지와 해결 방법

다음은 CYCLONE의 에러 메시지와 해결 방법이다.

에러 메시지

해결 방법

Service is not available

GOLDILOCKS가 정상적으로 실행되어 있는지 확인한다.

table does not exist

환경 파일에 기술한 table 이름을 확인한다.

schema does not exist

환경 파일에 기술한 schema 이름을 확인한다.

previously added. Maybe duplicated

환경 파일에 기술한 table이 중복되었는지 확인한다.

table must have a primary key

환경 파일에 기술한 table에 primary key가 있는지 확인한다.

internal error occurred.

상세 에러를 확인한다.

table must set supplemental log

GOLDILOCKS가 supplemental logging 되어 있는지 확인한다.

group XXX is already running

해당 group이 이미 실행되어 있는지 확인한다.

GOLDILOCKS_DATA system environment is invalid

GOLDILOCKS_DATA 환경 변수가 설정되어 있는지 확인한다.

log file reused or invalid. restart cyclone with '--reset' option

Redo log file이 재사용되었거나 아카이빙 되어있는 redo log file이 없다.

Cyclone을 초기화하여 재시작해야 한다.

fail to analyze flow

비정상적인 redo log를 분석할 경우에 발생하는 에러이며 master와 slave의 GOLDILOCKS 릴리즈 버전이 동일한지 확인한다.

Communication link failure

네트워크 상태를 확인한다. Cyclone을 재시작한다.

Master disconnect abnormally

네트워크 상태를 확인한다. Cyclone을 재시작한다.

Protocol error occurred

상세 에러를 확인한다.

Already slave connected

Slave가 이미 실행되어 있는지 확인한다.

Invalid group name

시작/ 종료할 때 명세한 그룹 이름을 확인한다. 환경 파일에 기술한 그룹 이름과 동일해야 한다.

Invalid capture information

기존의 운영 정보가 비정상적인 경우이며 cyclone을 초기화한 후에 재시작한다.

Redo log file read timeout

아카이빙 된 redo log file이 정상적으로 존재하는지 확인한다.

Invalid archive log file

아카이빙 된 해당 redo log file이 정상적이지 않은 경우이다. Cyclone을 초기화하고 재시작해야 한다.

Fail to write file

디스크의 여유 용량을 확인한 후에 cyclone을 재시작한다.

Invalid Meta File

Cyclone에서 관리하는 메타파일이 손상되었을 때 발생하는 에러이며 cyclone을 초기화하고 재시작해야 한다.

Redo log file does not exist

Master로 동작하는 GOLDILOCKS가 정상적으로 운영되고 있는지 확인한다.

[APPLIER-INSERT] XXX

해당 이유로 인하여 INSERT에 실패했다.

[APPLIER-DELETE] XXX

해당 이유로 인하여 DELETE에 실패했다.

[APPLIER-UPDATE] XXX

해당 이유로 인하여 UPDATE에 실패했다.

LOGMIRROR 에러 메시지와 해결 방법

다음은 LOGMIRROR의 에러 메시지와 해결 방법이다.

에러 메시지

해결 방법

Service is not available

GOLDILOCKS가 정상적으로 실행되어 있는지 확인한다.

Invalid Protocol value

해당 상세 메시지를 확인한다.

file does not eixst

해당 파일이 정상적으로 존재하는지 확인한다.

invalid Control file

컨트롤 파일이 손상된 상태이다. LOGMIRROR를 초기화하고 재시작해야 한다.

Communication link failure

네트워크 상태를 확인한다. LOGMIRROR를 재시작한다.

GOLDILOCKS_DATA system environment is invalid

GOLDILOCKS_DATA 환경 변수가 설정되어 있는지 확인한다.

There is no Shared Memory Area for LogMirror

Master로 운영 중인 GOLDILOCKS의 프로퍼티 중에 LOG_MIRROR_MODE가 정상적으로 enable 되었는지 확인한다.

Master disconnect abnormally

네트워크 상태를 확인한다. LOGMIRROR를 재시작해야 한다.

Invalid Log File

해당 파일이 정상적으로 존재하는지 확인한다.

Connection Information does not exist

환경 파일에 있는 GOLDILOCKS 접속 정보가 정상적인지 확인한다.

Archive Log File does not exist

Master로 운영 중인 GOLDILOCKS의 ARCHIVELOG_MODE가 정상적으로 설정되어 있는지 확인한다.