LOGMIRROR

LOGMIRROR

LOGMIRROR는 GOLDILOCKS가 생성하는 redo log를 원격지에 복제하여 동일한 redo log file을 구성하는 redo log 이중화 툴이다.

개요

CDC 방식을 사용하는 CYCLONE은 GOLDILOCKS가 운영 중에 생성하는 redo log file을 분석하여 이중화한다. 따라서 redo log file을 분석하지 못한 상태에서 운영 서버에 장애가 발생할 경우, 분석하지 못한 redo log 만큼의 데이터는 이중화하지 못하고 이는 데이터 손실로 이어진다.

그러나 LOGMIRROR를 이용하여 손실없이 원격지에 redo log를 전송하고 redo log file을 구성할 수 있다면 CYCLONE의 데이터 손실 문제를 해결할 수 있다.

즉, LOGMIRROR는 CYCLONE이 ASYNC 방식을 사용함으로써 발생하는 데이터 손실을 완벽하게 방지하기 위한 툴이며 CYCLONE과 함께 동작해야 한다.

운영상 특징

LOGMIRROR 운영시 GOLDILOCKS 성능저하 요인

LOGMIRROR는 GOLDILOCKS가 운영 중에 생성하는 redo log를 파일로 저장하기 전에 원격지로 보내고 정상적으로 처리된 이후에 다음 처리과정을 수행한다. 따라서 이중화하는 장비간의 네트워크 속도가 성능의 주요 요인이며 LOGMIRROR 없이 운영되는 GOLDILOCKS보다 성능이 저하될 수 있다. 이에, 네트워크 속도가 빠른 Infiniband까지 지원함으로써 성능 저하를 최소화하였다.

준비사항

GOLDILOCKS 준비사항

LOGMIRROR를 수행하기 전에 GOLDILOCKS에 다음과 같은 사항이 설정되어 있어야 한다.

LOG_MIRROR_MODE

LOG_MIRROR_MODE 프로퍼티는 GOLDILOCKS에서 LOGMIRROR를 사용하기 위한 설정이다. 이 설정이 활성화되면 GOLDILOCKS가 생성하는 redo log를 LOGMIRROR가 원격지로 전송하기 전에 임시로 저장할 자원이 할당된다.

또는 gSQL에서 다음을 수행한다.

gSQL> ALTER SYSTEM SET LOG_MIRROR_MODE=1 SCOPE=FILE;

System altered.

LOG_MIRROR_SHARED_MEMORY_STATIC_SIZE

LOG_MIRROR_SHARED_MEMORY_STATIC_SIZE는 LOGMIRROR에서 사용할 임시 저장 공간을 설정한다.

또는 gSQL에서 다음을 수행한다.

gSQL> ALTER SYSTEM SET LOG_MIRROR_SHARED_MEMORY_STATIC_SIZE = 200M SCOPE=FILE;

System altered.

LOG_MIRROR_TIMEOUT

GOLDILOCKS는 LOGMIRROR와 연동될 때 LOGMIRROR의 응답을 기다리는 과정을 포함한다. 이 응답이 너무 느리면 이 과정을 포함하는 GOLDILOCKS 또한 느려진다. LOG_MIRROR_TIMEOUT은 응답 대기시간을 지정하고 이 시간을 경과할 때까지 응답이 오지 않을 경우 LOGMIRROR 서비스를 중단한 채 GOLDILOCKS의 서비스만 계속 수행한다.

LOGMIRROR를 다시 수행하려면 LOGMIRROR를 재구동하여 recovery 과정을 거치면 정상적으로 다시 운영할 수 있다.

또는 gSQL에서 다음을 수행한다.

gSQL> ALTER SYSTEM SET LOG_MIRROR_TIMEOUT = 20;

System altered.

CYCLONE을 운영할 때 필요한 GOLDILOCKS 준비사항 역시 적용되어 있어야 한다.

환경설정

환경설정 파일

LOGMIRROR를 실행할 때 환경 설정 파일을 사용하여 운영에 필요한 정보와 옵션을 설정할 수 있다.

설정 내용

이름

설명

적용범위

PORT

Master/ slave 통신에 사용할 port를 설정한다.

Master/ slave

DSN

Data Source Name을 설정한다.

Master

HOST_IP

GOLDILOCKS가 운영 중인 host IP address를 설정한다.

Master

HOST_PORT

GOLDILOCKS가 운영 중인 host port를 설정한다.

Master

USER_ID

사용자 이름을 설정한다.

Master

USER_PW

사용자 암호를 설정한다.

Master

USER_ENCRYPT_PW

암호화된 사용자 암호를 설정한다.

Master/ slave

LOG_PATH

이중화된 redo log file이 저장될 경로를 설정한다.

Slave

MASTER_IP

LogMirror master가 운영 중인 장비의 IP address를 설정한다.

Slave

HEARTBEAT_TIMEOUT

이중화 연결 후에 network가 끊기거나 시스템 장애에 의해 연결이 원활하지 않을 경우, 연결을 유지하는 최대 시간 (초)을 설정한다.

Master/ slave

TCP_NODELAY

Socket의 TCP_NODELAY 옵션을 설정한다. (Default는 1 이다)

  • 0: TCP_NODELAY off

  • 1: TCP_NODELAY on

Master

환경설정 옵션

PORT

PORT=21106

DSN

DSN = GOLDILOCKS

HOST_IP

HOST_IP = 127.0.0.1

HOST_PORT

HOST_PORT = 22531

USER_ID

USER_ID = testID

USER_PW

USER_PW = testPW

USER_ENCRYPT_PW

USER_ENCRYPT_PW = 't33KImiqvhqNyfN+uZmFrw=='

LOG_PATH

LOG_PATH = '/data/wal'

MASTER_IP

MASTER_IP = 192.168.0.100

HEARTBEAT_TIMEOUT

HEARTBEAT_TIMEOUT = 40

TCP_NODELAY

TCP_NODELAY = 1

운영하기

LOGMIRROR의 master/ slave 실행 환경은 다음과 같다.

실행환경

구분

GOLDILOCKS

운영여부

설명

Master

O

Master로 운영할 때 반드시 GOLDILOCKS가 운영되고 있는 장비에서 LogMirror를 수행해야 한다.

Slave

X

Slave로 운영할 때 GOLDILOCKS는 운영하고 있지 않아도 되지만 redo log file이 저장될 디스크 여유공간은 반드시 필요하다.

운영 중에 수행되는 내용은 trace log를 통해 확인할 수 있다.

구분

파일

Master

$GOLDILOCKS_DATA/trc/LogMirror_master.trc

Slave

$GOLDILOCKS_DATA/trc/LogMirror_slave.trc

Trace log에 저장되는 에러 메시지와 처리방법은 LOGMIRROR 에러 메시지와 해결 방법을 참조한다.

LOGMIRROR 운영

LOGMIRROR는 GOLDILOCKS의 환경 설정 및 master/ slave 초기화와 운영 이후에도 다음 과정이 완료되어야만 정상적으로 redo log file을 이중화할 수 있다.

이중화를 시작하려면 redo log file을 SWITCH 해야 한다. 즉, 새로운 로그 파일이 생성되어야만 LOGMIRROR의 정상적 운영이 시작된다. 따라서 다음 과정을 수행해야 한다.

gSQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

LOGMIRROR가 이중화하는 redo log file은 지속적으로 저장된다. 즉, 자동으로 지워지지 않는다. 따라서 운영 장비의 환경에 따라 주기적으로 파일을 삭제하거나 이동하는 등의 관리 작업이 필요하다.

실행 옵션

실행 옵션

옵션

설명

비고

--start | -s

LOGMIRROR를 실행한다.

--master | --slave 와 함께 사용해야 한다.

--stop | -t

LOGMIRROR를 종료한다.

--master | --slave 와 함께 사용해야 한다.

--master | -m

Master 모드로 수행한다.

--start | --stop 과 함께 사용해야 한다.

--slave | -l

Slave 모드로 수행한다.

--start | --stop 과 함께 사용해야 한다.

--conf | -c

환경 파일의 경로를 설정한다.

--conf CONFIG_FILE 형식으로 입력한다.

--infiniband | -f

infiniband 네트워크 환경을 사용한다.

TCP/ IP 환경을 사용할 경우, 입력하지 않는다.

--silent | -i

메시지를 출력하지 않도록 한다.

-

--help | -h

도움말을 출력한다.

-

prompt> logmirror --master --start
prompt> logmirror --master --stop
prompt> logmirror --slave --start
prompt> logmirror --slave --stop
prompt> logmirror --master --start --conf TEST_CONFIG --infiniband
prompt> logmirror --slave --start --conf TEST_CONFIG --infiniband

LOGMIRROR를 초기화하는 예는 LOGMIRROR를 참조한다.

CYCLONE과 연동 예

CDC 이중화 툴인 CYCLONE을 redo log file 이중화 툴인 LOGMIRROR와 연동하여 사용할 경우 이중화 데이터 손실을 방지할 수 있다.

TOOL

기능

연동

CYCLONE

CDC 이중화

독립적으로 운영할 경우 데이터가 손실될 수 있다.

LOGMIRROR

REDO LOG FILE 이중화

연동하여 운영할 경우 데이터가 손실되지 않는다.

다음은 연동을 위한 운영 구조의 예이다.

운영 구조도 예제

운영 구조도 예제

운영 순서

  1. 원본 GOLDILOCKS에 CYCLONE 및 LOGMIRROR 환경 설정

  2. LOGMIRROR MASTER/ SLAVE 환경 설정

  3. LOGMIRROR MASTER/ SLAVE 실행

  4. LOGMIRROR를 정상적으로 운영하기 위한 원본 GOLDILOCKS의 LOGFILE SWITCH를 수행

  5. 원격 GOLDILOCKS 환경 설정

  6. CYCLONE MASTER/ SLAVE 환경 설정

  7. CYCLONE MASTER/ SLAVE 실행

원본 GOLDILOCKS에 CYCLONE 및 LOGMIRROR 환경 설정

다음을 참조한다.
• CYCLONE 환경설정: 준비사항
• LOGMIRROR 환경설정: 준비사항

환경 설정을 마친 후, 테스트를 위해 T1, T2 table을 생성한다.

gSQL > CREATE TABLE T1( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL > CREATE TABLE T2( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL > COMMIT;

LOGMIRROR MASTER/ SLAVE 환경 설정

LOGMIRROR MASTER는 반드시 원본 GOLDILOCKS가 운영되는 장비에서 실행되어야 한다.

HOST_IP   = 192.168.0.10
HOST_PORT = 22581
USER_ID = cdc_user
USER_PW = cdc_password
PORT = 21106
MASTER_IP = 192.168.0.10
PORT = 21106
LOG_PATH = '/data/LogMirrorWAL'

LOGMIRROR MASTER/ SLAVE 실행

logmirror --master --start --conf $GOLDILOCKS_DATA/conf/logmirror.master.conf
logmirror --slave --start --conf $GOLDILOCKS_DATA/conf/logmirror.slave.conf

정상적인 LOGMIRROR 운영을 위해 원본 GOLDILOCKS의 LOGFILE SWITCH 수행

gSQL> ALTER SYSTEM SWITCH LOGFILE;

위와 같이 실행할 경우 SLAVE 장비의 설정된 경로에 redo log file이 생성된다. 만약 redo log file이 생성되지 않았으면 디렉토리 권한이나 디렉토리 생성 여부를 확인해봐야 한다.

원격 GOLDILOCKS 환경 설정

Target 장비에서 운영되는 GOLDILOCKS의 정상적인 운영 및 이중화를 위한 테이블 구성, 스키마 정보를 확인한다.

여기에서는 테스트를 위해 T1, T2 table을 생성한다.

gSQL > CREATE TABLE T1( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL > CREATE TABLE T2( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL > COMMIT;

CYCLONE MASTER/ SLAVE 환경 설정

HOST_IP   = 192.168.0.10
HOST_PORT = 22581
USER_ID = cdc_user
USER_PW = cdc_password

GROUP_NAME = GROUP1
{
    PORT = 21102
    CAPTURE_TABLE = 
    (
        T1,
        T2
    )
}
USER_ID = cdc_user
USER_PW = cdc_password
MASTER_IP = 192.168.0.20

GROUP_NAME = GROUP1
{
LOG_PATH = '/data/LogMirrorWAL'
    PORT = 21102
    APPLY_TABLE =
    ( 
        T1 TO T1,
        T2 TO T2
    }
}

CYCLONE MASTER/ SLAVE 실행

cyclone --master --start --conf $GOLDILOCKS_DATA/conf/cyclone.master.conf
cyclone --slave --start --conf $GOLDILOCKS_DATA/conf/cyclone.slave.conf