CYCLONE

CYCLONE

CYCLONE은 Change Data Capture (CDC) 방식을 사용하는 이중화 툴이다.

개요

데이터베이스는 복구작업을 위해 운영 중에 발생하는 데이터 갱신사항을 redo log file에 기록한다. CDC는 이런 redo log file에 기록되는 내용을 분석하여 이중화를 수행하는 방식이다.
CYCLONE은 master와 slave로 나뉘어져 구동된다. Master는 원본 데이터베이스의 redo log file의 갱신사항을 인식하고 분석하여 slave로 전송한다. Slave는 수신된 데이터를 분석하고 ODBC를 이용하여 이중화를 수행한다.

운영상 특징

운영 시 제약사항

DDL 구문에 따른 give up 발생 및 절차에 따른 허용 여부

DDL 분류

Give up 발생 여부

절차에 따른

DDL 허용 여부

DDL 구문

Table DDL

X

-

CREATE TABLE

O

X

DROP TABLE

O

X

TRUNCATE TABLE

O

X

ALTER TABLE .. RENAME

X

-

ALTER TABLE .. STORAGE

X

-

ALTER TABLE .. ADD SUPPLEMENTAL LOG

O

X

ALTER TABLE .. DROP SUPPLEMENTAL LOG

X

-

ALTER TABLE .. READ { ONLY | WRITE }

Column DDL

O

O

ALTER TABLE .. ADD COLUMN

O

X

ALTER TABLE .. SET UNUSED COLUMN

O

-

ALTER TABLE .. RENAME COLUMN

X

-

ALTER TABLE .. ALTER COLUMN .. SET DEFAULT

X

-

ALTER TABLE .. ALTER COLUMN .. DROP DEFAULT

O

X

ALTER TABLE .. ALTER COLUMN .. SET NOT NULL

O

X

ALTER TABLE .. ALTER COLUMN .. DROP NOT NULL

O

X

ALTER TABLE .. ALTER COLUMN .. ALTER IDENTITY

O

X

ALTER TABLE .. ALTER COLUMN .. DROP IDENTITY

O

O

ALTER TABLE .. ALTER COLUMN .. SET DATATYPE

Constraint DDL

O

X

ALTER TABLE .. ADD CONSTRAINT

O

X

ALTER TABLE .. DROP CONSTRAINT

O

X

ALTER TABLE .. ALTER CONSTRAINT

X

-

ALTER TABLE .. RENAME CONSTRAINT

Index DDL

O

X

CREATE UNIQUE INDEX

X

-

CREATE INDEX

O

X

DROP INDEX unique_index

X

-

DROP INDEX non_unique_index

X

-

ALTER INDEX .. STORAGE

X

-

ALTER INDEX .. RENAME

Table의 상위 객체

O

X

DROP USER

O

X

DROP SCHEMA

O

X

DROP TABLESPACE

사용자의 실수를 방지하기 위해, 이중화 give up을 유발하는 DDL을 수행하지 못하도록 DISABLE_DDL_CDC_GIVEUP 서버 프로퍼티를 이용해 제어할 수 있다. 또한 DISABLE_UPDATE_PK_CDC_GIVEUP 서버 프로퍼티를 사용하여 primary key 갱신을 비활성화 할 수 있다.

이중화 운영 중 DDL 처리

이중화가 수행되고 있는 table에 허용 가능한 DDL을 수행할 경우 반드시 다음의 절차에 따라야 한다.

  1. Master 측에서 DDL을 수행하기 전에 master와 slave에서 운영 중인 CYCLONE을 모두 종료한다.

    • 진행 중인 업무 process는 종료할 필요없다.

    • 예: cyclone --master --stop/ cyclone --slave --stop

  2. Master와 slave 양쪽에 DDL을 수행한다. (허용 가능한 DDL 이어야만 한다.)

  3. Master와 slave의 CYCLONE을 다시 기동한다.

    • cyclone --master --start .../ cyclone --slave --start ...

    • --reset 옵션은 필요하지 않다.

    • 다시 구동할 때 1단계에서 종료된 이후부터 recovery를 수행하고 DDL을 처리한다. (Trace log를 참조한다.)

DDL 적용 절차

구분

MASTER CYCLONE

MASTER DB

SLAVE CYCLONE

SLAVE DB

1

CYCLONE STOP

-

-

-

2

-

-

CYCLONE STOP

-

3

-

DDL 수행

-

-

4

-

-

-

DDL 수행

5

CYCLONE START

-

-

-

6

-

-

CYCLONE START

-

DDL 적용 절차를 정상적으로 수행한 후에 CYCLONE master에서 DDL을 수행한 TABLE이 give up 되었다면 다음 두 가지를 확인해야 한다.


  1. Master DB와 slave DB에 수행한 DDL이 모두 동일하고, 수행 후 table의 구조가 동일한지 확인한다. (DDL 수행 순서는 관계없다.)

  2. 수행한 DDL이 허용 가능한 것인지 확인한다.


위와 같은 이유로 table이 give up되었을 경우, table 단위의 reset (예: cyclone --start --master --reset TABLE_NAME)을 사용하여 다시 구동하는 방법으로 give up된 table을 현재 시점부터 다시 이중화해야 한다.

다른 DBMS와 연동할 때 Datatype 호환성

Oracle

Oracle 연동 datatype

GOLDILOCKS

Oracle

비고

Boolean

X

해당 데이터 타입이 없다.

NATIVE_SMALLINT

NUMBER(5)

-

NATIVE_INTEGER

NUMBER(10)

-

NATIVE_BIGINT

NUMBER(19)

-

NATIVE_REAL

BINARY_FLOAT

-

NATIVE_DOUBLE

BINARY_DOUBLE

-

FLOAT

FLOAT

-

SMALLINT

NUMBER(5,0)

-

INTEGER

NUMBER(10,0)

-

BIGINT

NUMBER(19,0)

-

INT2

NUMBER(5,0)

-

INT4

NUMBER(10,0)

-

INT8

NUMBER(19,0)

-

REAL

FLOAT(24)

-

DOUBLE

FLOAT(53)

-

DOUBLE PRECISION

FLOAT(53)

-

FLOAT4

FLOAT(24)

-

FLOAT8

FLOAT(53)

-

DECIMAL

NUMERIC

-

NUMBER

NUMBER

-

NUMERIC

NUMERIC

-

CHAR

CHAR

-

VARCHAR

VARCHAR, VARCHAR2

-

BINARY

RAW

-

VARBINARY

RAW

-

DATE

DATE

-

TIME

X

해당 데이터 타입이 없다.

TIMESTAMP

TIMESTAMP

-

TIMESTAMP WITH TIMEZONE

X

ODBC driver를 지원하지 않는다.

INTERVAL

X

ODBC driver를 지원하지 않는다.

LONG VARCHAR

LONG VARCHAR

-

LONG VARBINARY

LONG RAW

-

MySQL

MySQL 연동 datatype

GOLDILOCKS

MySQL

비고

Boolean

BOOL, BOOLEAN

MySQL에서 해당되는 타입은 TINYINT(1)의 synonym이다

NATIVE_SMALLINT

SMALLINT

-

NATIVE_INTEGER

INT

-

NATIVE_BIGINT

BIGINT

-

NATIVE_REAL

FLOAT

-

NATIVE_DOUBLE

DOUBLE

MySQL에서 해당되는 타입은 DOUBLE PRECISION의 synonym이고 Unsigned를 지원하지 않는다.

FLOAT

X

MySQL에서는 precision 53까지만 지원하며 그 이상인 경우에는 데이터에 오차가 발생한다.

SMALLINT

SMALLINT

-

INTEGER

INTEGER

-

BIGINT

BIGINT

-

INT2

SMALLINT

-

INT4

INTEGER

-

INT8

BIGINT

-

REAL

REAL

-

DOUBLE

DOUBLE

-

DOUBLE PRECISION

DOUBLE PRECISION

-

FLOAT4

FLOAT(24)

데이터 오차가 발생할 수 있다.

FLOAT8

FLOAT(53)

데이터 오차가 발생할 수 있다.

DECIMAL

DECIMAL

-

NUMBER

X

-

NUMERIC

NUMERIC

-

CHAR

TEXT

-

VARCHAR

TEXT

-

BINARY

VARBINARY

-

VARBINARY

VARBINARY

-

DATE

DATETIME

-

TIME

TIME(6)

Fractional seconds precision 설정시 데이터가 손실되지 않는다.

TIMESTAMP

DATETIME(6)

Fractional seconds precision 설정시 데이터가 손실되지 않는다.

TIMESTAMP WITH TIMEZONE

X

ODBC driver를 지원하지 않는다.

INTERVAL

X

ODBC driver를 지원하지 않는다.

LONG VARCHAR

TEXT

-

LONG VARBINARY

BLOB

-

Mysql 설정 중 'lower_case_table_names'가 '0'으로 설정된 경우, 스키마/ 테이블 이름의 대소문자를 구분하므로 환경 파일을 명세할 때 스키마/ 테이블 이름에 double quotation (")을 사용해야 한다.

DB2

DB2 연동 datatype

GOLDILOCKS

DB2

비고

Boolean

X

해당되는 데이터 타입이 없다.

NATIVE_SMALLINT

SMALLINT

-

NATIVE_INTEGER

INT

-

NATIVE_BIGINT

BIGINT

-

NATIVE_REAL

REAL

-

NATIVE_DOUBLE

DOUBLE

-

FLOAT

DOUBLE

-

SMALLINT

DECIMAL(5)

-

INTEGER

DECIMAL(10)

-

BIGINT

DECIMAL(19)

-

INT2

DECIMAL(5)

-

INT4

DECIMAL(10)

-

INT8

DECIMAL(19)

-

REAL

DOUBLE

-

DOUBLE

DOUBLE

-

DOUBLE PRECISION

DOUBLE

-

FLOAT4

DOUBLE

-

FLOAT8

DOUBLE

-

DECIMAL

DECIMAL

DB2의 유효 숫자 자리 수 (significant digit)는 31 이다.

NUMBER

DECIMAL

DB2의 유효 숫자 자리 수 (significant digit)는 31 이다.

NUMERIC

DECIMAL

DB2의 유효 숫자 자리 수 (significant digit)는 31 이다.

CHAR

CHAR

DB2의 최대 사이즈는 254 bytes 이다.

VARCHAR

VARCHAR

-

BINARY

CHAR(n) FOR BIT DATA

DB2의 최대 사이즈는 254 bytes 이다.

VARBINARY

VARCHAR(n) FOR BIT DATA

-

DATE

DATE / TIMESTAMP(0)

DB2의 DATE는 YYYY/MM/DD 형식으로만 저장할 수 있다.

TIME

X

-

TIMESTAMP

TIMESTAMP

-

TIMESTAMP WITH TIMEZONE

X

ODBC driver를 지원하지 않는다.

INTERVAL

X

ODBC driver를 지원하지 않는다.

LONG VARCHAR

CLOB

-

LONG VARBINARY

BLOB

-

기타

이중화 시점은 다음과 같다.

준비사항

원본 GOLDILOCKS에서는 GOLDILOCKS 준비사항과 사용자 등록 및 권한 설정을 모두 수행해야 한다.
원격 GOLDILOCKS에서는 사용자 등록 및 권한 설정만 수행하면 된다.

GOLDILOCKS 준비사항

CYCLONE을 이용한 이중화를 시작하기 전에 GOLDILOCKS에는 다음과 같은 사항이 설정되어 있어야 한다.

SUPPLEMENTAL LOGGING

SUPPLEMENTAL LOGGING은 CYCLONE의 이중화를 위해 redo log file에 부가 정보를 함께 저장한다. 이미 운영 중인 데이터베이스의 해당 설정을 변경하려면 데이터베이스를 다시 시작해야 하는데 특정 테이블에만 SUPPLEMENTAL LOGGING을 설정할 경우에는 데이터베이스를 다시 시작할 필요가 없다.

데이터베이스에 SUPPLEMENTAL LOGGING 설정

이중화에 참여하는 특정 table에 SUPPLEMENTAL LOGGING 설정

<add table supplemental log statement> ::=
    ALTER TABLE table_name 
        ADD SUPPLEMENTAL LOG DATA ( PRIMARY KEY ) COLUMNS
    ;

ARCHIVE LOG

GOLDILOCKS는 redo log file을 순환하며 재사용한다. 만약 CYCLONE이 처리 중인 redo log file을 GOLDILOCKS가 재사용하면 CYCLONE은 더 이상 진행되지 못하고 종료된다. 이런 이중화의 지속적인 운영을 보장하려면 반드시 GOLDILOCKS를 ARCHIVE LOG 모드로 운영해야 한다.

운영 중인 데이터베이스를 ARCHIVE LOG 모드로 변경

gSQL> \startup mount

Startup success

gSQL> alter database archivelog;

Database altered.

데이터베이스 생성 시 ARCHIVE LOG 모드 설정

ARCHIVE LOG 파일이 저장되는 경로는 'ARCHIVELOG_DIR'로 확인하고 변경할 수 있다.

DATA_STORE_MODE

CYCLONE은 GOLDILOCKS의 redo log file을 읽어서 이중화를 수행한다. 따라서 GOLDILOCKS는 Transactional Data Store (TDS) 모드로 동작해야 한다.

DATA_STORE_MODE 변경

DATA_STORE_MODE의 값이 1일 경우 Concurrent Data Store (CDS)를, 2일 경우 Transactional Data Store (TDS)를 의미한다.

사용자 등록 및 권한 설정

CYCLONE은 운영 중에 필요한 정보를 검색하고 조작한다. 따라서 CYCLONE 운영을 위한 사용자가 있어야 하며 해당 사용자에게 특정한 권한을 설정해 주어야 한다.

데이터베이스 User 생성

CYCLONE을 운영하려면 특정 사용자를 추가해야 하는데, CYCLONE이 master, slave 모드로 동작하는 GOLDILOCKS 모두에 해당 사용자가 추가되어야 한다.

<user definition> ::=
    CREATE USER user_identifier IDENTIFIED BY password
    [ DEFAULT TABLESPACE tablespace_name ]
    [ TEMPORARY TABLESPACE tablespace_name ]
    [ INDEX TABLESPACE {tablespace_name|NULL} ]
    [ <schema clause> ]
    ;

<schema clause> ::=
      WITH SCHEMA [schema_name]
    | WITHOUT SCHEMA

다음은 이름이 cdc_user이고 password가 cdc_password인 사용자를 추가하는 예이다.

gSQL> CREATE USER cdc_user IDENTIFIED BY cdc_password;

데이터베이스 권한

사용자의 접속 권한을 설정

다음은 cdc_user에게 접속 권한을 설정하는 예이며 master/ slave 모드로 동작하는 GOLDILOCKS 모두에 설정해야 한다.

gSQL> GRANT CREATE SESSION ON DATABASE TO cdc_user;

TABLE 변경 권한 설정

다음은 cdc_user에게 테이블 변경 권한을 설정하는 예이며 slave 모드로 동작하는 GOLDILOCKS에 설정한다.

gSQL> GRANT INSERT ANY TABLE, DELETE ANY TABLE, UPDATE ANY TABLE ON
DATABASE TO cdc_user;

테이블스페이스 권한

데이터 테이블스페이스와 임시 테이블스페이스에 권한을 설정해야 한다. 다음은 cdc_user에게 기본 테이블스페이스의 사용 권한을 설정하는 예이며 slave 모드로 동작하는 GOLDILOCKS에 설정한다.

gSQL> GRANT CREATE OBJECT ON TABLESPACE mem_data_tbs TO cdc_user;
gSQL> GRANT CREATE OBJECT ON TABLESPACE mem_temp_tbs TO cdc_user;

스키마 권한

CYCLONE에서 관리하는 meta를 생성하고 관리하기 위한 스키마 권한을 설정해야 한다. 다음은 cdc_user 스키마 권한을 설정하는 예이며 slave 모드로 동작하는 GOLDILOCKS에 설정한다.

gSQL> GRANT CREATE TABLE, CREATE INDEX, CREATE SEQUENCE, CREATE VIEW,
ADD CONSTRAINT ON SCHEMA cdc_user TO cdc_user;

환경설정

환경설정 파일

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

설정 내용

이름

설명

적용 범위

COMM_CHUNK_COUNT

통신에 사용될 BUFFER의 크기를 설정한다.

Master/ slave

DSN

Data Source Name을 설정한다.

Master/ slave

GROUP_NAME

그룹 이름을 설정한다.

Master/ slave

HOST_IP

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

Master/ slave

HOST_EXTERNAL_IP

cyclone master가 보는 slave GOLDILOCKS IP가 HOST_IP와 다를 때 사용한다. (Master, slave가 wan 구간에 있는 경우)

Slave

HOST_PORT

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

Master/ slave

PORT

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

Master/ slave

USER_ID

사용자 이름을 설정한다.

Master/ slave

USER_PW

사용자 비밀번호를 설정한다.

Master/ slave

USER_ENCRYPT_PW

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

Master/ slave

CAPTURE_TABLE

이중화할 테이블을 설정한다.

Master

LOG_PATH

LOGMIRROR와 연동할 때 사용되며 redo log file의 위치를 설정한다.

Master

PROTOCOL

GOLDILOCKS에 연결하는 connection type을 설정한다. (D/A or TCP)

Master/ slave

READ_LOG_BLOCK_COUNT

CAPTURE가 동작할 때 한 번에 읽어들일 데이터의 양을 설정한다.

Master

TRANS_SORT_AREA_SIZE

CAPTURE에 할당될 BUFFER의 크기를 설정한다.

Master

TRANS_FILE_PATH

CAPTURE 할 때 임시로 생성되는 file이 저장될 위치를 설정한다.

Master

SYNCHER_COUNT

SYNC 기능을 사용할 때 적용되며, 데이터 INSERT를 동시에 수행하는 SYNCHER의 개수를 설정한다.

Master

SYNC_ARRAY_SIZE

SYNC 기능을 사용할 때 적용되며, 동시에 데이터를 INSERT하는 array의 사이즈를 설정한다.

Master

GIVEUP_INTERVAL

이중화를 수행하는 속도가 GOLDILOCKS 속도를 따라가지 못할 경우 이중화를 포기하도록 설정한다.

Master

APPLIER_COUNT

이중화를 적용할 때 동시에 수행하는 APPLIER의 개수를 설정한다.

Slave

APPLY_COMMIT_SIZE

이중화를 적용할 때 COMMIT 하기 위한 최대 사이즈를 설정한다.

Slave

APPLY_TABLE

이중화 테이블이 적용될 테이블을 설정한다.

Slave

MASTER_IP

CYCLONE master가 운영되고 있는 장비의 IP address를 설정한다.

Slave

PROPAGATE_MODE

CYCLONE으로 적용한 데이터를 PROPAGATE 할지 여부를 설정한다.

Slave

SUPPLEMENTAL_LOG_FORCE_MODE

이중화 대상 table에 supplemental logging이 설정되어 있지 않은 경우, 해당 table의 supplemental logging을 활성화한다. 이 옵션을 사용하려면 해당 기능을 활성화할 수 있는 권한이 필요하다.

Master

SEPARATE_CONFLICT_LOG

Conflict 로그를 trace 로그와 분리하여 기록할지 여부를 설정한다. (기본값은 0이다.)

  • 0: 분리하지 않는다.

  • 1: 분리하여 저장하도록 한다. (파일 이름은 cyclone_conflict_GROUPNAME.log이다.)

Slave

UPDATE_APPLY_MODE

Update 할 때 동작을 구분한다. (기본값은 0 이다)

  • 0: Primary key만 동일할 경우에 UPDATE를 수행한다.

  • 1: Primary key와 update 수행 이전 값이 동일할 경우에 UPDATE를 수행한다.

  • 2: Primary key만 동일한 경우에 UPDATE를 수행하는데 update 수행 이전/ 이후 값을 비교하여 다를 경우, 로그에 남긴다.

Slave

TCP_NODELAY

Socket의 TCP_NODELAY 옵션을 설정한다. (기본값은 1 이다)

  • 0: TCP_NODELAY off

  • 1: TCP_NODELAY on

Master

HEARTBEAT_TIMEOUT

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

Master/ slave

SKIP_COMMENT

Transaction skip을 위한 문자를 입력한다. Master에서 commit comment로 동일한 문자가 입력될 경우, 해당 transaction을 이중화하지 않고 skip 하도록 한다.

Master

LOG_CAPTURE_INTERVAL_1

Capture의 수행 주기를 설정한다. 해당 값으로 10 회 수행한 후에 변경 사항이 없을 경우에는 LOG_CAPTURE_INTERVAL_2의 값으로 전환되어 capture를 수행한다. (기본값은 0.2 초이다.)

Master

LOG_CAPTURE_INTERVAL_2

Capture의 수행 주기를 설정한다. LOG_CAPTURE_INTERVAL_1의 값으로 수행한 후에 변경 사항이 없을 경우 capture 수행 주기를 설정한다. (기본값은 1초이다.)

Master

CLUSTER

Master가 cluster 환경일 경우 master의 접속 정보를 기술한다. 한 개의 master는 다음과 같은 세 개의 정보로 구성된다.

  • ID (1 이상의 값으로 설정되며 구분자이다.)

  • MASTER_IP

  • PORT

Slave

ORACLE_DRIVER

Oracle에서 제공하는 Oracle ODBC driver의 파일 위치를 기술한다.

Slave

MYSQL_DRIVER

MySQL에서 제공하는 MySQL ODBC driver의 파일 위치를 기술한다.

Slave

MYSQL_DATABASE

이중화하려는 MySQL의 database 이름을 기술한다.

Slave

DB2_DRIVER

DB2에서 제공하는 DB2 ODBC driver의 파일 경로를 기술한다.

Slave

DB2_DATABASE

이중화 대상 DB2의 database 이름을 기술한다.

Slave

TIBERO_DRIVER

TIBERO에서 제공하는 ODBC driver의 파일 경로를 기술한다.

Slave

SYNC_ORACLE_DRIVER

Oracle에서 제공하는 Oracle ODBC driver의 파일 경로를 기술한다.

(SYNC 연결 시 사용)

Master

SYNC_MYSQL_DRIVER

MySQL에서 제공하는 MySQL ODBC driver의 파일 경로를 기술한다.

(SYNC 연결 시 사용)

Master

SYNC_DB2_DRIVER

DB2에서 제공하는 DB2 ODBC driver의 파일 경로를 기술한다.

(SYNC 연결 시 사용)

Master

SYNC_TIBERO_DRIVER

TIBERO에서 제공하는 TIBERO ODBC driver의 파일 경로를 기술한다. (SYNC 연결 시 사용)

Master

PACKET_COMPRESSION_MODE

Master와 slave 통신 데이터의 압축 여부를 설정한다. (1: Enable, 0: Disable, Default: Enable)

Master

환경설정 옵션

COMM_CHUNK_COUNT

• 모든 그룹에 적용되는 설정

COMM_CHUNK_COUNT = 10

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    COMM_CHUNK_COUNT=20
    ....
    ....
}

DSN

• 모든 그룹에 적용되는 설정

DSN=GOLDILOCKS

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    DSN=GOLDILOCKS
    ....
    ....
}

GROUP_NAME

GROUP_NAME = testGROUP
{
    ....
    ....
}

HOST_IP

• 모든 그룹에 적용되는 설정

HOST_IP = 127.0.0.1

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    HOST_IP = 127.0.0.1
    ....
    ....
}

HOST_EXTERNAL_IP

• 모든 그룹에 적용되는 설정

HOST_EXTERNAL_IP = 192.168.0.120

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    HOST_EXTERNAL_IP = 192.168.0.120
    ....
    ....
}

HOST_PORT

• 모든 그룹에 적용되는 설정

HOST_PORT = 22531

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    HOST_PORT = 22531
    ....
    ....
}

PORT

• 그룹 내에서만 설정할 수 있다.

GROUP_NAME = testGROUP
{
    PORT = 21102
    ....
    ....
}

USER_ID

• 모든 그룹에 적용되는 설정

USER_ID = testID

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    USER_ID = testID
    ....
    ....
}

USER_PW

• 모든 그룹에 적용되는 설정

USER_PW = testPW

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    USER_PW = testPW
    ....
    ....
}

USER_ENCRYPT_PW

• 모든 그룹에 적용되는 설정

USER_ENCRYPT_PW = 't33KImiqvhqNyfN+uZmFrw=='

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    USER_ENCRYPT_PW = 't33KImiqvhqNyfN+uZmFrw=='
    ....
    ....
}

CAPTURE_TABLE

GROUP_NAME = testGROUP
{
    CAPTURE_TABLE = 
    (
        testSchema1.testTable1,
        testSchema1.testTable2,
        testSchema2.testTable1
    )
}

LOG_PATH

• 모든 그룹에 적용되는 설정

LOG_PATH = '/data/wal/'

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    LOG_PATH = '/data/wal/'
    ....
    ....
}

PROTOCOL

• 모든 그룹에 적용되는 설정

PROTOCOL = DA

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    PROTOCOL = DA
    ....
    ....
}

READ_LOG_BLOCK_COUNT

• 모든 그룹에 적용되는 설정

READ_LOG_BLOCK_COUNT = 1024

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    READ_LOG_BLOCK_COUNT = 1024
    ....
    ....
}

TRANS_SORT_AREA_SIZE

• 모든 그룹에 적용되는 설정

TRANS_SORT_AREA_SIZE = 300

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    TRANS_SORT_AREA_SIZE = 300
    ....
    ....
}

TRANS_FILE_PATH

• 모든 그룹에 적용되는 설정

TRANS_FILE_PATH = '/data/TmpTrans'

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    TRANS_FILE_PATH = '/data/TmpTrans'
    ....
    ....
}

SYNCHER_COUNT

• 모든 그룹에 적용되는 설정

SYNCHER_COUNT = 8

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    SYNCHER_COUNT = 8
    ....
    ....
}

SYNC_ARRAY_SIZE

• 모든 그룹에 적용되는 설정

SYNC_ARRAY_SIZE = 1000

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    SYNC_ARRAY_SIZE = 1000
    ....
    ....
}

GIVEUP_INTERVAL

• 모든 그룹에 적용되는 설정

GIVEUP_INTERVAL = 10000

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    GIVEUP_INTERVAL = 10000
    ....
    ....
}

APPLIER_COUNT

• 모든 그룹에 적용되는 설정

APPLIER_COUNT = 16

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    APPLIER_COUNT = 16
    ....
    ....
}

APPLY_COMMIT_SIZE

• 모든 그룹에 적용되는 설정

APPLY_COMMIT_SIZE = 1000

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    APPLY_COMMIT_SIZE = 1000
    ....
    ....
}

APPLY_TABLE

GROUP_NAME = testGROUP
{
    APPLY_TABLE =
    (
        testSchema1.testTable1 TO testSchema1.testTable1,
        testSchema1.testTable2 TO testSchema2.testTable3,
        testSchema2.testTable3 TO testSchema2.testTable4
    )
}

MASTER_IP

• 모든 그룹에 적용되는 설정

MASTER_IP = 192.168.0.100

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    MASTER_IP = 192.168.0.100
    ....
    ....
}

PROPAGATE_MODE

• 모든 그룹에 적용되는 설정

PROPAGATE_MODE = 1

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    PROPAGATE_MODE = 1
    ....
    ....
}

SUPPLEMENTAL_LOG_FORCE_MODE

• 모든 그룹에 적용되는 설정

SUPPLEMENTAL_LOG_FORCE_MODE = 1

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    SUPPLEMENTAL_LOG_FORCE_MODE = 1
    ....
    ....
}

SEPARATE_CONFLICT_LOG

• 모든 그룹에 적용되는 설정

SEPARATE_CONFLICT_LOG = 1

UPDATE_APPLY_MODE

• 모든 그룹에 적용되는 설정

UPDATE_APPLY_MODE = 1

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    UPDATE_APPLY_MODE = 1
    ....
    ....
}

데이터 타입이 long varchar 또는 long varbinary인 column의 경우, 성능상의 이유로 길이만 비교한다.

TCP_NODELAY

• 모든 그룹에 적용되는 설정

TCP_NODELAY = 1

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    TCP_NODELAY = 1
    ....
    ....
}

HEARTBEAT_TIMEOUT

• 모든 그룹에 적용되는 설정

HEARTBEAT_TIMEOUT = 40

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    HEARTBEAT_TIMEOUT = 40
    ....
    ....
}

SKIP_COMMENT

• 모든 그룹에 적용되는 설정

SKIP_COMMENT = 'DO_SKIP'

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    SKIP_COMMENT = 'DO_SKIP'
    ....
    ....
}

LOG_CAPTURE_INTERVAL_1

• 모든 그룹에 적용되는 설정

LOG_CAPTURE_INTERVAL_1 = 200

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    LOG_CAPTURE_INTERVAL_1 = 200
    ....
    ....
}

LOG_CAPTURE_INTERVAL_2

• 모든 그룹에 적용되는 설정

LOG_CAPTURE_INTERVAL_2 = 1000

• 특정 그룹에 적용되는 설정

GROUP_NAME = testGROUP
{
    LOG_CAPTURE_INTERVAL_2 = 1000
    ....
    ....
}

CLUSTER

• Cluster는 group 내부에서만 설정할 수 있다.

GROUP_NAME = testGROUP
{
    CLUSTER = (ID=1, MASTER_IP=192.0.0.100, PORT=21102),
              (ID=2, MASTER_IP=192.0.0.101, PORT=21103)
    ....
    ....
}

ORACLE_DRIVER

• 모든 그룹에서 설정할 수 있다.

ORACLE_DRIVER = '/app/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1'

GROUP_NAME = testGROUP
{
    ....
    ....
}

MYSQL_DRIVER

• 모든 그룹에서 설정할 수 있다.

MYSQL_DRIVER = '/usr/lib64/libmaodbc.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

MYSQL_DATABASE

• 모든 그룹에서 설정할 수 있다.

MYSQL_DATABASE = mysql

GROUP_NAME = testGROUP
{
    ....
    ....
}

DB2_DRIVER

• 모든 그룹에서 설정할 수 있다.

DB2_DRIVER = '/usr/lib64/libdb2o.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

DB2_DATABASE

• 모든 그룹에서 설정할 수 있다.

DB2_DATABASE = db2

GROUP_NAME = testGROUP
{
    ....
    ....
}

TIBERO_DRIVER

• 모든 그룹에서 설정할 수 있다.

TIBERO_DRIVER = '/usr/lib64/libtbodbc.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

SYNC_ORACLE_DRIVER

• 모든 그룹에서 설정할 수 있다.

SYNC_ORACLE_DRIVER = '/app/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1'

GROUP_NAME = testGROUP
{
    ....
    ....
}

SYNC_MYSQL_DRIVER

• 모든 그룹에서 설정할 수 있다.

SYNC_MYSQL_DRIVER = '/usr/lib64/libmaodbc.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

SYNC_DB2_DRIVER

• 모든 그룹에서 설정할 수 있다.

SYNC_DB2_DRIVER = '/usr/lib64/libdb2o.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

SYNC_TIBERO_DRIVER

• 모든 그룹에서 설정할 수 있다.

SYNC_TIBERO_DRIVER = '/usr/lib64/libtbodbc.so'

GROUP_NAME = testGROUP
{
    ....
    ....
}

PACKET_COMPRESSION_MODE

• 특정 그룹에서 설정할 수 있다.

GROUP_NAME = testGROUP
{
    PACKET_COMPRESSION_MODE = 1
    ....
    ....
}

운영하기

CYCLONE은 GOLDILOCKS의 D/A 또는 C/S 환경에서 운영할 수 있다.
운영 환경에 따라 다음과 같이 CONFIG 파일 또는 ODBC.INI의 PROTOCOL 설정을 사용해야 한다.
CONFIG 설정은 ODBC.INI 설정보다 우선한다.
CONFIG, ODBC.INI 구분

설정

구분

PROTOCOL=DA

D/A 환경에서 사용된다. (Default)

PROTOCOL=TCP

C/S 환경에서 사용된다.

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

구분

파일

Cyclone Master

$GOLDILOCKS_DATA/trc/cyclone_master.trc

Cyclone Slave

$GOLDILOCKS_DATA/trc/cyclone_slave.trc

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

GOLDILOCKS 접속 정책

CYCLONE에서 GOLDILOCKS에 접속하는 정책이다.
GOLDILOCKS에 접속하는 기능은 두 가지가 있다. 하나는 CYCLONE에서 local GOLDILOCKS에 접속하는 기능이고 다른 하나는 SYNC를 수행할 때 CYCLONE master에서 slave 측 GOLDILOCKS에 원격으로 접속하는 기능이다. 두 가지 모두 CYCLONE config 설정값이 우선적으로 사용되고 그 다음에 odbc.ini를 사용한다. 단, SYNC를 수행할 때는 PROTOCOL 값은 무시되고 무조건 TCP로 설정된다.
GOLDILOCKS 접속과 관련된 config property는 DSN, PROTOCOL, HOST_IP, HOST_EXTERNAL_IP, HOST_PORT, USER_ID, USER_PW 이다. 
(USER_ENCRYPT_PW는 USER_PW를 대신하므로 USER_PW로 총칭한다.)

올바르게 설정된 예

DA로 접속함으로 USER_ID, USER_PW만으로 가능함.

구분

파일

CONFIG

USER_ID=test, USER_PW=test

odbc.ini의 GOLDILOCKS 설정

-

CONFIG나 odbc.ini둘중에 한군데만 정보가 있으면 됨. DA로 동작함으로 HOST_IP, HOST_PORT는 무시됨.

구분

파일

CONFIG

HOST_IP=127.0.0.1, HOST_PORT=22581,USER_ID=test

odbc.ini의 GOLDILOCKS 설정

USER_PW=test

TCP로 접속하고 CONFIG가 우선임으로 USER_ID는 test 계정으로 동작함.

구분

파일

CONFIG

PROTOCOL=TCP, USER_ID=test, USER_PW=test

odbc.ini의 GOLDILOCKS 설정

HOST_IP=127.0.0.1, HOST_PORT=22581,

USER_ID=test2, USER_PW=test2

DA로 접속하더라도 slave에는 HOST_EXTERANL_IP설정이 가능하다.

구분

파일

CONFIG

PROTOCOL=DA, HOST_EXTERNAL_IP=192.168.0.10, USER_ID=test

odbc.ini의 GOLDILOCKS 설정

HOST_IP=127.0.0.1, HOST_PORT=22581,USER_PW=test

잘못 설정된 예

DA로 접속하는데 USER_PW가 없다.

구분

파일

CONFIG

HOST_EXTERNAL_IP=192.168.0.10

odbc.ini의 GOLDILOCKS 설정

PROTOCOL=DA,USER_ID=test

TCP로 접속하는데 HOST_IP가 없다.

구분

파일

CONFIG

HOST_EXTERNAL_IP=192.168.0.10, USER_ID=test

odbc.ini의 GOLDILOCKS 설정

PROTOCOL=TCP, HOST_PORT=22581,USER_PW=test

실행 옵션

CYCLONE을 실행할 때는 다음의 옵션과 함께 사용해야 한다.

실행 옵션

옵션

설명

비고

--start | -s

CYCLONE을 실행한다.

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

--stop | -t

CYCLONE을 종료한다.

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

--master | -m

Master 모드로 수행한다.

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

--slave | -l

Slave 모드로 수행한다.

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

--status | -u

CYCLONE의 운영상태를 보여준다.

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

--conf | -c

CYCLONE을 실행할 때 필요한 환경파일의

경로를 설정한다.

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

--start와 함께 사용해야 한다.

명시적으로 설정하지 않을 경우,

master는 $GOLDILOCKS_DATA/cyclone.master.conf,

slave는 $GOLDILOCKS_DATA/cyclone.slave.conf 를 사용한다.

--silent | -i

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

-

--reset | -r

이중화 운영정보를 초기화한다.

--reset TABLE_NAME 또는 --reset all 형식으로 입력한다.

여러 개의 table을 reset할 경우에는 single quote (') 안에 기술한다.

--group | -g

특정 그룹을 설정한다.

--group GROUP_NAME 형식으로 입력한다.

--help | -h

도움말을 출력한다.

-

--sync | -n

데이터 동기화를 수행한다.

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

--encrypt | -e

주어진 key로 사용자 비밀번호를 암호화한다.

-

--key | -k

--encrypt 옵션을 사용할 때 암호화 key를 설정한다.

config에 USER_ENCRYPT_PW가 사용된 경우 복호화 key를 설정한다.

-

--info | -o

현재 이중화 되고 있는 테이블 상태를 보여준다.

--master, --group과 함께 사용해야 한다.

--recovery | -v

Cluster 환경에서 단독모드로 수행 중이던 이중화를 다른 cluster member로 이관할 경우에 사용한다.

--recovery GROUP_NAME 형식으로 사용하며, GROUP_NAME은 이전에 수행되던 slave의 CYCLONE GROUP_NAME을 기술한다.

--stand-alone | -S

Cluster 환경에서 단독모드로 동작하도록 한다. (Cluster 환경에서는 기본적으로 cluster 모드로 동작한다)

Master에서만 유효하다. (Slave에서는 환경설정파일에서 설정한다.)

--local | -a

Cluster환경에서 sharding 된 table을 동기화할 경우에 사용한다. 해당 cluster 그룹의 데이터만 동기화한다.

--sync와 함께 사용해야 한다.

prompt> cyclone --master --start
prompt> cyclone --master --stop
prompt> cyclone --slave --start

• Slave 모드로 모든 그룹을 종료한다.

prompt> cyclone --slave --stop
prompt> cyclone --master --start --group TEST_GROUP
prompt> cyclone --master --stop --group TEST_GROUP
prompt> cyclone --slave --start --conf TEST_CONFIG
prompt> cyclone --encrypt test --key 1234
Cyclone Encrypted Passwd : 'YFH+bpBPNvk='
prompt> cyclone --master --start --key 1234
prompt> cyclone --master --start --reset all
prompt> cyclone --slave --start --reset all
prompt> cyclone --master --start --reset 'T1, T2'
prompt> cyclone --slave --start
prompt> cyclone --master --info --group GROUP1
================================================
 GROUP NAME = GROUP1
================================================
 SCHEMA NAME         : PUBLIC
 TABLE NAME          : T1 (GIVE-UP (DDL-LSN:129541))
 PHYSICAL ID         : 5299989643264
================================================
 SCHEMA NAME         : PUBLIC
 TABLE NAME          : T2 (ACTIVE (CAPTURE-START-LSN:128922))
 PHYSICAL ID         : 35549444308992
================================================
 SCHEMA NAME         : PUBLIC
 TABLE NAME          : T3 (ACTIVE (CAPTURE-START-LSN:128922))
 PHYSICAL ID         : 35558034243584
================================================
 SCHEMA NAME         : PUBLIC
 TABLE NAME          : T4 (ACTIVE (CAPTURE-START-LSN:128922))
 PHYSICAL ID         : 35566624178176
================================================
   TOTAL   COUNT : 4
   GIVE-UP COUNT : 1
================================================

그룹 또는 노드의 추가/삭제와 관련된 예는 노드 추가와 삭제를 참조한다.

이중화 초기화와 관련된 예는 이중화 초기화를 참조한다.

CYCLONE 운영 예

CYCLONE 운영 구조는 다음과 같다.

CYCLONE 운영 구조도

CYCLONE 운영 구조도

운영 순서

  1. 원본 GOLDILOCKS 환경 설정

  2. 원격 GOLDILOCKS 환경 설정

  3. CYCLONE MASTER 환경 설정

  4. CYCLONE SLAVE 환경 설정

  5. 실행 및 운영

원본 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;

원격 GOLDILOCKS 환경 설정

사용자 등록 및 권한 설정을 수행한다.

CYCLONE MASTER 환경 설정

USER_ID = cdc_user
USER_PW = cdc_password

GROUP_NAME = GROUP1
{
    PORT = 21102
    CAPTURE_TABLE =
    ( 
        T1,
        T2
    )
}

CYCLONE SLAVE 환경 설정

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

GROUP_NAME = GROUP1
{
    PORT = 21102
    APPLY_TABLE =
    (
        T1 TO T1,
        T2 TO T2
    )
}

실행 및 운영

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

데이터 동기화

cyclone --master --start --conf $GOLDILOCKS_DATA/conf/cyclone.master.conf --sync all
cyclone --slave --start --conf $GOLDILOCKS_DATA/conf/cyclone.slave.conf --sync --all
gSQL> CREATE TABLE T1( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL> INSERT INTO T1 VALUES( 1, 'HELLO' );
gSQL> CREATE TABLE T1( COL1 INTEGER PRIMARY KEY, COL2 VARCHAR(20) );
gSQL> INSERT INTO T1 VALUES( 1, 'BYE' );
cyclone --master --start --sync all
cyclone --slave  --start --sync all
SLAVE cyclone log
[RECEIVER] start the data synchronization.
[RECEIVER] Error Occurred.
STOP Done.

Primary key에 동일한 값을 사용하려고 했기 때문에 에러가 발생했으며 sync가 작동하지 않는다.

이중화 정보 초기화



Recovery

이중화 정보 초기화 절차


1. Cluster 환경에서 G1N1 member로 (standalone) 이중화를 수행한다.

prompt> cyclone --master --start --reset ALL --group g1n1_master --stand-alone

prompt> cyclone --slave --start --reset ALL --group g1n1_slave


2. 해당 cluster member를 종료하거나 서비스를 이관하기 위해 기존 cyclone 운영을 중단한다.

prompt> cyclone --master --stop

prompt> cyclone --slave --stop


3. 기존 이중화 정보 (G1N1)를 사용하여 새로운 이중화 (G1N2)를 서비스한다.

prompt> cyclone --master --start --reset all --group g1n2_master --stand-alone --recovery g1n1_slave

prompt> cyclone --master --start --reset all --group g1n2_slave

Cluster 환경에서 CYCLONE 운영

준비사항

  1. 하나의 slave에 접속하는 master는 동일한 cluster group내의 member여야 한다.

    • 다른 cluster group의 member는 다른 slave에서 운영되어야 한다.

  2. Master가 cluster 환경일 경우, CYCLONE이 기본적으로 cluster 모드로 작동하므로 standalone 모드로 동작해야 할 경우에는 반드시 --stand-alone 옵션을 사용해야 한다.

    • Master를 수행할 때만 --stand-alone 옵션을 사용한다.

    • 환경 설정 파일에 CLUSTER 옵션을 추가하여 master의 cluster 정보를 기술하면 slave가 cluster 모드로 동작한다.

운영

실행과 종료

Master가 cluster 환경에서 실행될 경우 slave는 반드시 CLUSTER_LIST 옵션을 사용해야 한다.

만약 master가 cluster 환경에서 standalone 옵션을 사용해서 실행된 경우, slave는 CLUSTER_LIST 옵션을 사용하지 말아야 한다.

Node Type

Cluster 환경에서 cyclone은 slave와 접속하는 master를 trust node와 non-trust node로 구분한다.

Cluster 환경에서 node 운영 방식

Node

설명

이중화 가능 여부

Trust node

이중화에 참여하는 모든 table이 online 상태인 node이다.

O

Non-trust node

이중화에 참여하는 table 중 하나 이상이 offline 상태인 node이다.

X

Node 상태변화에 따른 운영

수행

환경 설정 파일

Master의 환경 설정 파일은 standalone과 동일하다.
다음은 G1N1의 master 환경을 설정하는 예로써 해당 장비의 IP는 192.168.0.10 이라고 가정한다.
USER_ID = cdc_user
USER_PW = cdc_password

GROUP_NAME = G1N1_Master
{
    PORT = 21011
    CAPTURE_TABLE =
    (
        T1,
        T2
    )
}

다음은 G1N2의 master 환경을 설정하는 예로써 해당 장비의 IP는 192.168.0.20 이라고 가정한다.

USER_ID = cdc_user
USER_PW = cdc_password

GROUP_NAME = G1N2_Master
{
    PORT = 21012
    CAPTURE_TABLE =
    (
        T1,
        T2
    )
}
Slave의 환경설정 파일에는 CLUSTER를 추가하여 master의 정보를 기술한다.

CLUSTER의 master 정보인 MASTER_IP, PORT는 CLUSTER 환경 설정에 기술한다.

USER_ID = cdc_user
USER_PW = cdc_password

GROUP_NAME = G1_Slave
{
    CLUSTER = ( ID = 1, MASTER_IP = 192.168.0.10, PORT = 21011 ),
              ( ID = 2, MASTER_IP = 192.168.0.20, PORT = 21012 )
    APPLY_TABLE =
    (
        T1 TO T1,
        T2 TO T2
    )
}

실행 방법

Master에서 수행

• G1N1에서 수행한다.
cyclone --master --start --conf $GOLDILOCKS_DATA/conf/cyclone.master.conf --group G1N1_Master
cyclone --master --start --conf $GOLDILOCKS_DATA/conf/cyclone.master.conf --group G1N2_Master

Slave에서 수행

cyclone --slave --start --conf $GOLDILOCKS_DATA/conf/cyclone.slave.conf --group G1_Slave

SYNC

Master에서 수행

G1N1에서 수행한다. (SYNC를 수행할 master로써 --sync 옵션을 사용한다.)
cyclone --master --start --conf $GOLDILOCKS_DATA/conf/cyclone.master.conf --sync all

Slave에서 수행

cyclone --slave --start --conf $GOLDILOCKS_DATA/conf/cyclone.slave.conf --sync all

Sharded Table이 이중화에 참여할 경우 sync 할 때 --local 옵션을 사용해야 한다. 이는 sharded table 데이터가 각 cluster group에만 존재하고 --local 옵션없이 sync를 수행할 경우에 다른 cluster group의 데이터까지 동기화되기 때문이다. 그러나 cluster 환경에서 이중화에 참여하는 모든 table이 cloned일 경우에는 동기화할 때 --local 옵션을 사용하지 않아도 된다.

기타

--reset 옵션은 standalone 환경에서 쓰이는 것과 동일하게 사용할 수 있다.

모니터링 (CYMON)

CYMON (CYclone MONitor)은 CDC 이중화 툴인 CYCLONE을 모니터링하기 위한 툴이다. CDC 모니터링 정보를 master로 운영 중인 GOLDILOCKS에 주기적으로 갱신한다.
실행파일

파일 이름

구분

cymon

cyclone 용 monitor

환경 설정 파일

cymon의 환경 설정 파일은 cyclone을 master로 실행할 때 사용한 환경 파일을 동일하게 사용한다. --conf 옵션을 사용하여 특정 환경 설정 파일을 설정하지 않을 경우, cyclone을 master로 실행할 때 기본값으로 $GOLDILOCKS_DATA/conf/cyclone.master.conf 파일을 읽는다.

CYMON은 CYCLONE이 master로 운영 중인 장비와 동일한 장비에서 실행되어야 한다.

모니터링 내용

CYMON

CYMON은 CYCLONE의 운영 정보를 GOLDILOCKS의 CYCLONE_MONITOR_INFO 테이블에 주기적으로 갱신한다. 모니터링 내용은 다음과 같다.

CYCLONE_MONITOR_INFO

Column

설명

GROUP_NAME

CYCLONE이 실행된 group 이름이다.

TIME

해당 정보가 갱신된 시간 정보 (YYYY-MM-DD HH24:MI:SS)이다.

MASTER_STATE

Master로 운영 중인 CYCLONE의 상태이다.

  • N/A: 상태를 알 수 없다.

  • READY: Slave가 접속하기를 기다리는 중이다.

  • RUNNING: Slave가 접속하여 이중화를 수행하는 중이다.

  • SYNCING : Slave가 접속하여 sync 기능을 수행 중이다.

SLAVE_STATE

Slave로 운영 중인 CYCLONE의 상태이다.

  • N/A: 상태를 알 수 없다.

  • RUNNING: 이중화를 수행 중이다.

  • SYNCING : Sync 기능을 수행 중이다.

MASTER_PORT

Master로 운영 중인 CYCLONE이 slave를 기다리고 있는 port 정보이다.

SLAVE_IP

CYCLONE slave로 접속한 장비의 IP address 정보이다.

REDO_LOG_FILESEQ

운영 중인 GOLDILOCKS redo log file의 sequence 번호이다.

REDO_LOG_BLOCKSEQ

운영 중인 GOLDILOCKS redo log file의 block sequence 번호이다.

CAPTURE_FILESEQ

CYCLONE master가 capture 중인 redo log file의 sequence 번호이다.

CAPTURE_BLOCKSEQ

CYCLONE master가 capture 중인 redo log file의 block sequence 번호이다.

APPLY_FILESEQ

CYCLONE slave가 처리 중인 redo log file의 sequence 번호이다.

APPLY_BLOCKSEQ

CYCLONE slave가 처리 중인 redo log file의 block sequence 번호이다.

CAPTURE_INTERVAL

CYCLONE master가 처리해야 할 (남아있는) redo log block의 개수이다.

  • 1 block = 512 bytes (Redo log block size = 512 bytes)

CAPTURE_INTERVAL_SIZE

CYCLONE master가 처리해야 할 (남아있는) redo log file의 크기이다.

TOTAL_TX_COUNT

CYCLONE master에서 capture한 모든 transaction의 개수이다.

CAPTURE_TX_COUNT

CYCLONE master에서 capture한 transaction 중에 이중화할 대상이 포함된 transaction의 개수이다.

CAPTURE_COMMIT_LSN

CYCLONE master에서 capture한 마지막 transaction의 commit log 번호이다.

더 이상 capture할 transaction이 없으면 변경되지 않는다.

APPLY_COMMIT_LSN

CYCLONE slave에서 처리 중인 transaction의 commit log 번호이다.

더 이상 처리할 transaction이 없으면 변경되지 않는다.

INTERVAL 정보는 master로 운영 중인 CYCLONE의 redo log file을 분석하는 CAPTURE 정보이며, CYCLONE SLAVE에서 APPLIER에 의해 반영된 정보는 아니다.

실행 및 모니터링

실행 옵션

실행옵션

옵션

설명

비고

--conf | -c

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

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

  • CYCLONE을 master 환경에서 실행할 때 사용한 환경 파일과 동일한 파일로 설정해야 한다.

--start | -s

CYMON을 실행한다.

-

--stop | -t

CYMON을 종료한다.

-

--status | -u

CYMON의 운영상태를 보여준다.

-

--cycle | -y

모니터링 정보의 갱신 주기를 설정한다.

--cycle X 형식으로 입력한다.

  • 초단위로 입력해야 한다.

--key | -k

config에 USER_ENCRYPT_PW가 사용된 경우 복호화 key를 설정한다.

-

--trace | -r

Capture의 모니터링 정보를 trace 로그에도 동시에 기록한다.

Trace log는 $GOLDILOCKS_DATA/trc/cymon.trc에 저장된다.

--silent | -i

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

-

--help | -h

도움말을 출력한다.

-

사용 예

cymon --start --cycle 1
gSQL> \set vertical on
gSQL> select * from cyclone_monitor_info;

              GROUP_NAME # GROUP1
                    TIME # 2015-01-13 17:34:53
            MASTER_STATE # READY
             SLAVE_STATE # N/A
             MASTER_PORT # 21102
                SLAVE_IP # null
        REDO_LOG_FILESEQ # 0
       REDO_LOG_BLOCKSEQ # 52392
         CAPTURE_FILESEQ # 0
        CAPTURE_BLOCKSEQ # 0
           APPLY_FILESEQ # 0
          APPLY_BLOCKSEQ # 0
        CAPTURE_INTERVAL # 0
   CAPTURE_INTERVAL_SIZE # 0
      CAPTURE_COMMIT_LSN # 0
        APPLY_COMMIT_LSN # 0
gSQL> \set vertical on
gSQL> select * from cyclone_monitor_info;

              GROUP_NAME # GROUP1
                    TIME # 2015-01-13 17:36:17
            MASTER_STATE # RUNNING
             SLAVE_STATE # RUNNING
             MASTER_PORT # 21102
                SLAVE_IP # 127.0.0.1
        REDO_LOG_FILESEQ # 0
       REDO_LOG_BLOCKSEQ # 52811
         CAPTURE_FILESEQ # 0
        CAPTURE_BLOCKSEQ # 52811
           APPLY_FILESEQ # 0
          APPLY_BLOCKSEQ # 52811
        CAPTURE_INTERVAL # 0
   CAPTURE_INTERVAL_SIZE # 0
      CAPTURE_COMMIT_LSN # 1023
        APPLY_COMMIT_LSN # 1023
cymon --start --trace
GROUP_NAME         TIME                MASTER_STATE SLAVE_STATE  MASTER_PORT  SLAVE_IP       CAPTURE_FILESEQ CAPTURE_BLOCKSEQ TOTAL_TX_COUNT CAPTURE_TX_COUNT  CAPTURE_COMMIT_LSN  APPLY_FILESEQ   APPLY_BLOCKSEQ   APPLY_COMMIT_LSN
------------------ ------------------- ------------ ------------ ----------- --------------- --------------- ---------------- -------------- ---------------- -----------------    -------------- ---------------- ------------------
GROUP1             2016-11-02 15:43:03 READY        N/A                21102 null                          0                0              0                0                0                  0               0                  0 
GROUP2             2016-11-02 15:43:03 READY        N/A                21103 null                          0                0              0                0                0                  0               0                  0
GROUP_NAME         TIME                MASTER_STATE SLAVE_STATE  MASTER_PORT  SLAVE_IP       CAPTURE_FILESEQ CAPTURE_BLOCKSEQ TOTAL_TX_COUNT CAPTURE_TX_COUNT  CAPTURE_COMMIT_LSN  APPLY_FILESEQ   APPLY_BLOCKSEQ   APPLY_COMMIT_LSN
------------------ ------------------- ------------ ------------ ----------- --------------- --------------- ---------------- -------------- ---------------- -----------------    -------------- ---------------- ------------------
GROUP1             2016-11-02 15:43:11 RUNNING      RUNNING            21102 192.168.0.206                 7            52779              0                0               15346              7            52779             15346
GROUP2             2016-11-02 15:43:11 READY        N/A                21103 null                          0                0              0                0                   0              0                0                 0
$ cymon --status
======================================
|             CYMON STATUS           |
======================================
|       Service is running...        |
--------------------------------------
$ cymon --stop
stop done.