콘텐츠로 이동

3. 이중화 사용#

이중화 사용 조건#

이중화를 만들기 위해서는 여러가지 조건을 만족해야 한다. 그렇지 않을 경우 이중화를 사용할 수 없다.

선행조건#

  • 입력/수정/삭제 연산 시 데이터 충돌이 발생하면 연산은 취소되고 에러 로그 파일에 메시지를 남긴다.

  • 이중화 작업 도중 발생한 에러에 대해 부분 철회한다. 즉 여러 개의 데이터 입력 중 한 개의 중복 데이터가 있으면 중복 데이터만 취소하고 나머지는 완료할 수 있다.

  • 복제 속도는 서비스 속도보다 매우 느릴 수 있다.

데이터 제약조건#

  • 복제할 테이블에는 반드시 프라이머리 키가 존재해야 한다.

  • 복제할 테이블의 프라이머리 키에 대한 수정이 없어야 한다.

  • 양쪽 서버에서 복제할 테이블의 칼럼 타입, NOT NULL, CHECK 제약조건, 유일 키 인덱스, 함수 기반 인덱스가 동일하지 않고, REPLICATION_SQL_APPLY_ENABLE가 1로 설정되어 있으면 SQL 반영 모드로 동작하여 성능이 저하될 수 있다.

연결 제약조건#

  • 하나의 Altibase 데이터베이스에 가능한 이중화 연결의 최대 개수는 REPLICATION_MAX_COUNT 프로퍼티로 결정된다.

  • 이중화로 연결할 데이터베이스는 서로 데이터베이스 캐릭터 셋과 내셔널 캐릭터 셋이 동일하게 설정되어야 한다. 현재 사용중인 캐릭터 셋은 V$NLS_PARAMETERS의 NLS_CHARACTERSETNLS_NCHAR_CHARACTERSET으로 확인이 가능하다.

이중화 대상 칼럼의 제약조건#

  • 복제 트랜잭션에서 삽입할 때, 이중화 대상이 아닌 칼럼에는 널(NULL) 값을 입력한다.

  • 이중화 대상 칼럼과 이중화 대상이 아닌 칼럼의 유일 키 인덱스, 함수 기반 인덱스를 구성하면 SQL 반영 모드로 동작한다.

EAGER 모드 이중화 제약조건#

EAGER 모드를 사용하기 위해 다음의 제약 조건을 따른다.

  • EAGER 모드 이중화는 데이터 정합성을 위해 3 노드 이상에서는 권장하지 않는다.

  • 원격 서버와 지역 서버 모두 EAGER 모드 이중화를 사용하지 않으면, 데이터가 동기화되지 않는다.

  • EAGER 모드 이중화를 사용 중에 네트워크 장애가 발생하면, 서버가 정상적으로 동작하더라도 데이터의 정합성을 보장받지 못한다. 네트워크 장애가 발생하면 상대방의 노드 장애로 판단하기 때문에 양쪽 노드에서 각각 데이터를 갱신하기 때문이다.

  • 하나의 테이블은 EAGER 모드 이중화에서 하나의 이중화에만 참여할 수 있다. 하나의 테이블이 두 개 이상의 EAGER 이중화에 참여할 경우 장애가 발생하면 데이터가 불일치할 뿐 아니라 증분 동기화도 실패하기 때문이다.

  • EAGER 모드 이중화에 참여하는 서버는 시간을 동기화해야 한다. 만약 두 시스템의 시간을 다르게 설정한 경우 장애가 발생시 장애를 감지하는 시차 때문에 비정상적인 동작을 할 수 있다.

  • EAGER 모드 이중화에서 커밋된 로그가 디스크에 반영되기 전에 비정상 종료가 발생하면, 데이터가 유실될 수 있다. 이을 방지하기 위해 복구 옵션을 사용하거나 커밋 관련 프로퍼티(COMMIT_WRITE_WAIT_MODE, REPLICATION_COMMIT_WRITE_WAIT_MODE, REPLICATION_SYNC_LOG)의 값을 조정한다.

  • EAGER 모드 이중화에서는 SQL 반영 모드를 사용할 수 없다.

파티션드 테이블 제약조건#

파티션드 테이블을 이중화하기 위해 다음의 제약조건을 만족시켜야 한다.

  • 원격 서버와 지역 서버의 파티션 방법이 동일해야 한다.

  • 범위나 리스트 파티션일 경우 파티션 조건이 동일해야 한다. 일부 파티션만 이중화하는 경우 그 파티션의 조건만 일치하면 된다. 기본 파티션의 경우에도 마찬가지이다.

  • 해시 파티션일 경우 파티션의 개수가 동일해야 한다.

이중화를 이용한 데이터 복구의 제약조건#

이중화를 이용하여 데이터를 복구하기 위해서는 다음의 제약조건이 따른다.

  • 지역 서버와 원격 서버가 모두 비정상 종료하는 경우에는 복구가 불가능하다.

  • 충돌이 발생한 데이터는 복구가 불가능하다.

  • 하나의 테이블은 두 개 이상의 이중화 객체에서 복구할 수 없다.

  • 전송되지 않은 트랜잭션이 손실된 경우 데이터는 복구할 수 없다.

이중화를 이용한 데이터 복구 시 주의 사항#

  • Active-Active 환경에서 양쪽 데이터베이스의 갱신하는 Data Set을 완전히 다르게 하지 않은 경우 (즉, 양쪽 서버에서 같은 레코드를 서로 다른 값으로 갱신하는 경우), 데이터 불일치가 발생할 수 있다.

  • 네트워크에 이상이 발생하거나 사용자가 REPLICATION_RECOVERY_MAX_TIME 프로퍼티에 복구를 명시적으로 포기한 경우에는 데이터가 복구되지 않을 수 있다.


이중화 생성 (CREATE REPLICATION)#

이중화를 시작하기 전에 이중화에 관련된 정보를 사용해서 이중화 객체를 생성해야 한다.

구문#

CREATE [LAZY|EAGER] REPLICATION replication_name 
[FOR ANALYSIS | FOR PROPAGABLE LOGGING | FOR PROPAGATION | FOR ANALYSIS PROPAGATION] 
[AS MASTER|AS SLAVE] 
[OPTIONS options_name [option_name ... ] ] 
[WITH { 'remote_host_ip' | 'remote_host_name', remote_host_ port_no [USING conn_type [ib_latency]]}]
...
FROM user_name.table_name [PARTITION partition_name] TO user_name.table_name [PARTITION partition_name]
[,FROM user_name.table_name [PARTITION partition_name] TO user_name.table_name [PARTITION partition_name]
...;

전제 조건#

SYS 사용자만이 이중화 객체를 생성할 수 있다.

설명#

이중화를 수행하려면, 먼저 서로간에 통신으로 연결된 이중화 객체의 쌍으로 구성된 이중화 쌍이 설정되어야 한다.

이중화는 테이블 또는 파티션 단위로 수행된다. 양쪽 서버의 이중화 테이블 또는 파티션은 일대일로 매칭되어야 한다.

이중화 객체를 생성할 때 LAZY 또는 EAGER 모드 중 하나를 기본 모드로 선택할 수 있다. 사용자가 세션에 이중화 모드를 지정하지 않은 경우 이중화 기본 모드로 동작할 것이다. 기본 모드를 지정하지 않으면 이중화는 LAZY 모드로 동작할 것이다.

  • replication_name

    생성될 이중화 객체의 이름을 명시한다. 지역 서버와 원격 서버에 동일한 이름을 설정해야 한다.

  • FOR ANALYSIS | FOR ANALYSIS PROPAGATION

    log analyzer 용 이중화를 생성한다. 자세한 설명은 Log Analyzer User's Manual을 참고한다.

    log analyzer는 IB(InfiniBand) 통신 방식을 지원하지 않는다.

  • FOR PROPAGABLE LOGGING | FOR PROPAGATION

    이중화 수신자가 전송받은 로그를 복제하기 위해 FOR PROPAGABLE LOGGING을 사용하여 로그를 기록한 후, 복제된 로그가 다른 원격 서버로 전송하기 위해 FOR PROPAGATION을 사용한다.

  • AS MASTER 또는 AS SLAVE

    해당 서버가 Master 인지 Slave 인지를 지정한다. 만약 아무것도 지정하지 않으면 기존의 REPLICATION_INSERT_REPLACE 또는 REPLICATION_UPDATE_REPLACE 프로퍼티를 사용하는 방식과 동일하다. 핸드쉐이킹 시 다음의 조합일 경우에만 성공한다: 0과 0, 1과 2, 또는 2와 1. 다른 조합은 실패할 것이다. (0: 지정하지 않은 경우, 1: Master, 2: Slave)

  • remote_host_ip | remote_host_name

    원격 서버의 IP 주소값이나 호스트 이름

  • remote_host_port_no

    원격 서버 수신 쓰레드의 포트 번호. 즉, 원격 서버의 Altibase 프로퍼티의 REPLICATION_PORT_NO에 해당하는 값이다.

    • TCP 통신 방식 : REPLICATION_PORT_NO
    • IB(InfiniBand) 통신 방식 : REPLICATION_IB_PORT_NO
  • USING conn_type [ib_latency]

    원격 서버와의 통신 방식을 지정한다. 이 절을 생략하면 TCP로 동작한다. conn_type은 TCP, SSL, IB 중 지정할 수 있다.

    • TCP: TCP 통신을 사용 (기본값)

    • IB : 인피니밴드(InfiniBand) 통신을 사용

      • 인피니밴드를 사용하려면, IB_ENABLE 프로퍼티의 값을 1로 설정해야한다.
      • 인피니밴드를 사용하면 물리적 네트워크 장애는 감지되지 않는다.
    • ib_latency

      rsocket의 RDMA_LATENCY 옵션값을 지정할 수 있으며, 기본값은 0이다. conn_type이 IB인 경우에만 입력 가능하다. 이 값이 1이면 CPU 자원을 소모하더라도, 적은 대기 시간을 사용한다.

  • user_name

    이중화할 테이블의 소유자 이름

  • table_name

    이중화할 테이블 이름

  • partition_name

    이중화할 파티션 이름

  • option_name

    이중화 객체에 대한 부가 기능 이름. 지원하는 부가 기능에 대한 자세한 설명은 이중화 부가 기능에서 설명한다.

에러코드#

Error Message Reference를 참고한다.

예제#

지역 서버의 IP 주소가 192.168.1.60 이고 이중화 포트 번호가 25524, 원격 서버의 IP 주소가 192.168.1.12 이고 이중화 포트 번호가 35524 이라고 하자. 두 서버간의 employees 테이블과 departments 테이블을 이중화 한다고 가정하면, 필요한 이중화 정의는 다음과 같다.

  • 지역 서버의 경우 (IP: 192.168.1.60)

    iSQL> CREATE REPLICATION rep1
        WITH '192.168.1.12', 35524
        FROM SYS.employees TO SYS.employees,
        FROM SYS.departments TO SYS.departments;
    Create success.
    
  • 원격 서버의 경우 (IP: 192.168.1.12)

    iSQL> CREATE REPLICATION rep1
        WITH '192.168.1.60', 25524
        FROM SYS.employees TO SYS.employees,
        FROM SYS.departments TO SYS.departments;
    Create success.
    


이중화 시작, 종료와 변경 (ALTER REPLICATION)#

이중화를 시작하는 방법은 START, QUICKSTART, SYNC 의 3가지 방법이 있다. SYNC에 대한 설명은 이중화 동기화를 참고한다.

변경 가능한 이중화 속성은 아래와 같다.

  • 이중화 테이블 및 파티션의 삭제
  • 이중화 테이블 및 파티션의 추가
  • 이중화 정보 리셋
  • PROPAGABLE LOGGING 기능의 활성화 여부

구문#

ALTER REPLICATION replication_name START [RETRY];

ALTER REPLICATION replication_name QUICKSTART [RETRY];

ALTER REPLICATION replication_name STOP; 

ALTER REPLICATION replication_name RESET;

ALTER REPLICATION replication_name DROP TABLE 
FROM user_name.table_name [PARTITION partition_name] TO user_name.table_name [PARTITION partition_name];

ALTER REPLICATION replication_name ADD TABLE 
FROM user_name.table_name [PARTITION partition_name] TO user_name.table_name [PARTITION partition_name]

ALTER REPLICATION replication_name FLUSH [ALL] [WAIT timeout_sec];

ALTER REPLICATION replication_name SET PROPAGABLE LOGGING [ENABLE|DISABLE];

전제 조건#

SYS 사용자만이 이중화 동작을 변경할 수 있다.

설명#

  • START

    가장 최근의 이중화 시점부터 이중화를 시작한다.

  • QUICKSTART

    현재 로그의 위치부터 이중화를 시작한다.

  • START/QUICKSTART RETRY

    RETRY 옵션으로 이중화를 START하거나 QUICKSTART하면, 핸드쉐이킹에 실패하더라도 지역 서버의 송신 쓰레드는 생성된다. 이 후에 지역 서버와 원격 서버간의 핸드쉐이킹이 성공할 때 이중화가 시작된다.
    즉, 첫 핸드쉐이킹에서 실패하더라도 iSQL에서는 성공했다는 메시지를 보여준다. 그러므로 사용자는 트레이스 로그 또는 V$REPSENDER 성능 뷰에서 실행 결과를 꼭 확인해야 한다.
    RETRY 옵션 없이 이중화를 시작하면, 첫 핸드쉐이킹에 실패할 경우 에러가 발생하고 실행은 중지된다.

  • STOP

    이중화를 중지시킨다.

  • RESET

    재시작 SN 등의 이중화 정보를 reset한다. 이중화가 중지된 상태에서만 수행할 수 있으며, 이중화 객체를 삭제한 후 다시 생성하는 것을 대신해서 사용할 수 있다.

  • DROP TABLE

    특정 테이블 또는 파티션을 이중화 대상에서 제외시킨다. DROP TABLE을 수행하는 시점에 대상 테이블의 주 트랜잭션 로그나 테이블 메타 로그가 이중화 갭에 있다면 그 이중화 갭은 포기하므로 데이터 불일치가 발생할 수 있다.

  • ADD TABLE

    특정 테이블 또는 파티션을 이중화 대상에 추가한다.

  • FLUSH

    FLUSH를 실행한 세션은 이중화 송신 쓰레드가 현재 로그까지의 변경 내용이 상대방 서버에 전송 되도록 timeout_sec으로 지정한 시간 (초)만큼 기다린다. 만약, ALL옵션이 같이 사용되면 FLUSH를 실행한 세션은 현재 로그가 아닌 가장 최근 로그까지의 변경 내용이 상대방 서버에 전송 되도록 기다린다.

  • SET PROPAGABLE LOGGING [ENALBE|DISABLE]

    • ENABLE: 이중화 수신자가 전송받은 로그를 복제하기 위해 로그를 기록한다.
    • DISABLE: 이중화 수신자가 전송받은 로그에 대해서는 로그를 기록하지 않는다.

에러코드#

Error Message Reference > 이중화(RP) 관련 에러 메시지를 참고 한다.

예제#

이중화 이름을 rep1 이라고 가정하고 이중화 시작은 다음 3가지 중 한가지를 선택할 수 있다.

  • 지역 서버의 데이터를 원격 서버로 전송한 후에 이중화를 시작한다.

    iSQL> ALTER REPLICATION rep1 SYNC;
    Alter success. 
    
  • 가장 최근에 수행한 rep1의 이중화 시점부터 rep1 이중화를 시작한다.

    iSQL> ALTER REPLICATION rep1 START;
    Alter success.
    
  • 현재 시점부터 이중화를 시작한다.

    iSQL> ALTER REPLICATION rep1 QUICKSTART;
    Alter success.
    

    양방향 이중화를 시작한 이후 이중화 진행 상태 확인은 다음과 같은 방법으로 할 수 있다.

    (지역 서버에서 실행)

    iSQL> SELECT REP_NAME
         , STATUS
         , NET_ERROR_FLAG
         , SENDER_IP
         , SENDER_PORT
         , PEER_IP
         , PEER_PORT
     FROM V$REPSENDER;
    REP_NAME              STATUS               NET_ERROR_FLAG       SENDER_IP                 SENDER_PORT PEER_IP               PEER_PORT   
    --------------------------------------------------------------------------------------------------------------------------------------------
    REP1                  1                    0                    192.168.1.33              11477       192.168.1.34          21300     
    1 row selected.
    

    (원격 서버에서 실행)

    iSQL> SELECT REP_NAME
               , MY_IP
               , MY_PORT
               , PEER_IP
               , PEER_PORT
            FROM V$REPRECEIVER;
    REP_NAME              MY_IP                 MY_PORT     PEER_IP               PEER_PORT   
    ------------------------------------------------------------------------------------------------
    REP1                  192.168.1.33          21300       192.168.1.34          7988       
    1 row selected.
    
  • 이중화를 중지한다.

    iSQL> ALTER REPLICATION rep1 STOP;
    Alter success.
    
  • 이중화 대상에서 SYS.employees 테이블을 제외시킨다.

    iSQL> ALTER REPLICATION rep1 STOP;
    Alter success.
    iSQL> ALTER REPLICATION rep1 DROP TABLE FROM SYS.employees TO SYS.employees;
    Alter success.
    
  • 이중화 대상에 SYS.employees 테이블을 추가한다.

    iSQL> ALTER REPLICATION rep1 STOP;
    Alter success.
    iSQL> ALTER REPLICATION rep1 ADD TABLE FROM SYS.employees TO SYS.employees;
    Alter success.
    
  • TIMER_THREAD_RESOLUTION 프로퍼티의 값이 1000000 마이크로 초로 설정되어 있는 경우, 이중화 송신자 별로 WAIT_NEW_LOG이벤트에 대한 대기 누적시간(초)을 알고 싶다면, 다음 쿼리를 실행한다.

    SELECT REP_NAME
         , AVG(WAIT_NEW_LOG)/1000000
      FROM X$REPSENDER_STATISTICS
     WHERE WAIT_NEW_LOG > 0
     GROUP BY REP_NAME
     ORDER BY REP_NAME;
    
  • TIMER_THREAD_RESOLUTION 프로퍼티의 값이 1000000 마이크로 초로 설정되어 있는 경우, 이중화 수신자 별로 INSERT_ROW이벤트에 대한 대기 누적시간(초)을 알고 싶다면, 다음 쿼리를 실행한다.

    SELECT REP_NAME
         , AVG(INSERT_ROW)/1000000
      FROM X$REPRECEIVER_STATISTICS
     WHERE RECV_XLOG > 0
     GROUP BY REP_NAME
     ORDER BY REP_NAME;
    
  • 이중화 수신자가 받은 로그를 다시 복제하기 위해 Propagable Logging 기능을 활성화하여 로그를 기록한다.

    iSQL> ALTER REPLICATION rep1 SET PROPAGABLE LOGGING ENABLE;
    Alter success.
    


이중화 동기화(SYNC)#

동기화는 지역 서버의 이중화 대상 테이블의 모든 데이터를 원격 서버의 대응하는 테이블의 데이터와 일치시키기 위해 수행하는 작업이다. Altibase의 동기화 기능을 이용하면, 원격 서버로의 데이터 동기화 완료 후 현재 로그부터 이중화가 시작된다. 만약, 데이터의 동기화만 진행하고 더이상 이중화를 이용하지 않을 경우는 SYNC ONLY를 이용한다.

Altibase의 동기화 기능은 특정 테이블 또는 파티션을 선택하여 동기화를 수행할 수 있으며, 병렬 동기화도 지원한다.

구문#

ALTER REPLICATION replication_name 
SYNC [PARALLEL parallel_factor] 
[TABLE user_name.table_name [PARTITION partition_name],  , user_name.table_name [PARTITION partition_name]];

ALTER REPLICATION replication_name 
SYNC ONLY [PARALLEL parallel_factor] 
[TABLE user_name.table_name [PARTITION partition_name],  , user_name.table_name [PARTITION partition_name]];

전제 조건#

SYS 사용자만이 이중화 객체를 동기화 할 수 있다.

설명#

  • SYNC

    지역 서버에 있는 이중화 대상 테이블의 모든 레코드를 원격 서버로 전송해서 동기화 한 후에 현재 로그부터 이중화를 시작한다.

  • TABLE

    SYNC 대상 테이블을 지정한다.

  • PARTITION

    SYNC 대상 파티션을 지정한다.

  • PARALLEL

    병렬 동기화를 수행하기 위해 사용한다.

    • parallel_factor

      parallel_factor는 생략 가능하며, 생략할 경우 1이 기본으로 사용된다. parallel_factor의 최대값은 CPU 개수 * 2이며, 최대값을 초과해서 설정하여도 시스템의 CPU 개수 * 2개의 쓰레드가 생성된다. 0 또는 음수값을 설정한 경우엔 오류 메세지가 나타난다.

      디스크테이블의 경우, parallel_factor 값을 디스크 테이블의 개수 이상으로 지정하는 것이 성능에 유리하다.

  • SYNC ONLY

    SYNC와 마찬가지로 지역 서버에 있는 이중화 대상 테이블들의 모든 레코드를 원격 서버로 전송해서 동기화하지만, 동기화 이후에 이중화를 시작하지 않는 차이가 있다. 즉, SYNC ONLY를 수행한 경우 이중화를 다시 수행하려면 명시적으로 이중화 시작 구문(ALTER REPLICATION ... START)을 수행해야 한다.

예제#

  • 지역 서버의 데이터를 원격 서버로 전송하여 동기화를 수행하고 이중화를 시작한다.

    iSQL> ALTER REPLICATION rep1 SYNC;
    Alter success.
    
  • 특정 파티션의 동기화를 수행하고 이중화를 시작한다.

    iSQL> ALTER REPLICATION rep1 SYNC TABLE SYS.t1 PARTITION p1;
    Alter success.
    
  • 4개의 쓰레드를 이용하여 병렬로 동기화를 수행한다.

    iSQL> ALTER REPLICATION rep1 SYNC PARALLEL 4;
    Alter success.
    

예외상황#

  • 동기화(SYNC) 작업 중 이중화가 중단되는 경우

    동기화(SYNC) 작업중에 이중화를 중지하면 이중화할 데이터가 모두 원격 서버로 전송되었다는 것을 보장할 수 없다. 만약 동기화(SYNC) 중에 이중화를 중지한 경우, 다시 동기화(SYNC) 하기 위해서는 원격 서버의 이중화 대상 테이블의 모든 레코드를 삭제한 후 동기화(SYNC)를 다시 수행해야 한다.

  • REPLICATION_SYNC_LOCK_TIMEOUT

    동기화 후에 이중화가 시작될 로그를 결정하는 순간에 다른 트랜잭션이 동기화 대상 테이블의 데이터를 변경하는 것을 막기 위해서, 이중화 송신 쓰레드는 동기화를 시작하기 전에 일시적으로 동기화 테이블에 대한 공유 잠금(S Lock)을 획득한다. 따라서, 다른 트랜잭션이 동기화 대상 테이블에 변경을 하고 있을 때 SYNC를 시도하면, 이중화 송신 쓰레드는 REPLICATION_SYNC_LOCK_TIMEOUT 프로퍼티에 설정된 시간만큼 대기하다가 변경 트랜잭션이 끝나는 시점에 동기화를 시작한다. 변경 트랜잭션이 REPLICATION_SYNC_LOCK_TIMEOUT 프로퍼티에 설정된 시간 내에 완료되지 않으면 동기화는 실패한다.

  • 레코드의 충돌

    동기화 과정에서 원격 서버에 지역 서버의 레코드와 충돌이 발생하는 레코드가 있으면, 동기화가 실패한다.

    이 경우 원격 서버의 데이터를 삭제한 후(TRUNCATE 수행), 다시 동기화(SYNC)를 수행할 것을 권장한다.

    만약, 원격 서버의 데이터를 삭제하지 않고 동기화를 하려는 경우, REPLICATION_SYNC_TUPLE_COUNT를 1로 설정하고 Altibase의 충돌 해결 방법을 확인하여 원하는 정책으로 설정하고 동기화를 수행한다. 그러나 REPLICATION_SYNC_TUPLE_COUNT 를 1로 설정하면, 동기화 성능저하가 있을수 있으므로 주의한다.

    Caution

    REPLICATION_SYNC_TUPLE_COUNT를 1로 설정하는 경우, 충돌 해결 정책에 따라서 동작한다. 충돌 해결 정책에서 기존의 데이터를 유지하도록 설정한 경우, 충돌이 발생한 레코드가 변경되지 않으므로 지역 서버의 데이터와 원격 서버의 데이터가 불일치 할 수 있으므로 주의 한다.

    데이터의 불일치는 altiComp 유틸리티를 이용하여 해결 할 수 있다.

충돌 해결 정책에 따른 동작#

동기화의 경우 INSERT 충돌만 발생한다. 자세한 설명은 2. 이중화 관리-충돌 해결의 3가지 scheme를 참고한다.


이중화 삭제 (DROP REPLICATION)#

구문#

DROP REPLICATION replication_name;

전제 조건#

SYS 사용자만이 이중화 객체를 삭제할 수 있다.

설명#

이중화 객체를 제거할 때 사용한다. 그러나 이중화가 시작되어 있을 경우에는 사용할 수 없다.

이중화 작업을 제거하기 위해서는 이중화를 중지한 후에 가능하다.

에러코드#

Error Message Reference를 참고한다.

예제#

  • rep1 이름의 이중화 객체를 삭제하는 방법은 다음과 같다.

    iSQL> ALTER REPLICATION rep1 STOP;
    Alter success.
    iSQL> DROP REPLICATION rep1;
    Drop success.
    
  • 만약 이중화를 종료하지 않고 이중화 객체를 삭제하면 다음과 같은 에러 메시지가 나타난다.

    iSQL> DROP REPLICATION rep1;
    [ERR-610FE : Replication has already started.]
    


이중화 부가기능#

Altibase는 이중화 부가 기능으로 다음의 기능을 제공한다. 이중화 부가 기능을 설정할 때에는 수행중인 이중화를 종료해야 한다.

  • 복구 옵션(Recovery Option)
  • 이중화 갭 해소 옵션(Replication Gapless Option)
  • 병렬 적용자 옵션(Parallel Applier Option)
  • 이중화 트랜잭션 그룹 옵션(Replicated Transaction Grouping Option)
  • 이중화 수신 전용 옵션(Receive Only Option)
  • 메타 로깅 옵션(Meta Logging Option)
  • 오프라인 옵션(Offline Option)

이중화 옵션의 상태는 SYS_REPLICATIONS_ 메타 테이블의 OPTIONS 칼럼 값을 통해서 확인할 수 있다. 자세한 내용은 General Reference > 3장. 데이터 딕셔너리를 참고한다.

복구 옵션(Recovery Option)#

구문#

CREATE REPLICATION replication_name OPTIONS RECOVERY ...;
ALTER REPLICATION replication_name SET RECOVERY {ENABLE|DISABLE};

설명#

이중화를 진행중에 비정상 종료된 서버가 발생할 경우, 사용자는 복구 옵션을 사용하여 정상 운영중인 서버에서 수행된 주 트랜잭션 또는 복제 트랜잭션의 로그를 이용하여 데이터를 복구할 수 있다.

이 기능은 COMMIT_WRITE_WAIT_MODE 또는 REPLICATION_COMMIT_WRITE_WAIT_MODE 프로퍼티에서 트랜잭션의 로그가 디스크에 기록되지 않도록 설정하였을 때 유용한 옵션이다. 예를 들어 시스템이 비정상으로 종료되어 커밋된 트랜잭션이 사라질 수 있는데 이 경우 이중화 복구 옵션을 사용해서 데이터를 일치시킬수 있다.

그러나 이중화가 진행될 때에는 복구 옵션을 변경할 수 없다. 복구 옵션을 사용하지 않는 경우 시스템에서 유지하고 있는 복구 관련 자료는 모두 해제된다.

프로퍼티에 대한 자세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참조한다.

제약사항#

오프라인 옵션과 동시에 사용할 수 없다.

예제#

이중화 이름을 rep1 이라고 가정하고, 이중화 복구 옵션을 아래와 같이 사용한다.

  • 이중화 복구 옵션을 사용한다.

    iSQL> ALTER REPLICATION rep1 SET RECOVERY ENABLE;
    Alter success.
    
  • 이중화 복구 옵션을 사용하지 않는다.

    iSQL> ALTER REPLICATION rep1 SET RECOVERY DISABLE;
    Alter success.
    

이중화 갭 해소 옵션(Replication Gapless Option)#

구문#

CREATE REPLICATION replication_name OPTIONS GAPLESS ...;
ALTER REPLICATION replication_name SET GAPLESS [ENABLE|DISABLE};

설명#

이중화를 수행할 때 발생하는 이중화 갭을 해소하는 옵션이다. 이중화 갭 해소(GAPLESS) 옵션을 설정하면, 현재 송신자가 프로퍼티 REPLICATION_GAPLESS_ALLOW_TIME에 설정한 시간이 지나도 이중화 갭이 해소가 안될 것으로 예상되면, 트랜잭션 커밋을 지연시켜 이중화 갭이 해소될 수 있는 시간을 확보한다. 이 때 너무 많은 시간을 이중화 갭 해소에 사용할 수 있으므로 프로퍼티 REPLICATION_GAPLESS_MAX_WAIT_TIME을 설정하여 프로퍼티 값 만큼 트랜잭션 커밋을 지연시킨다. 그러나 이 옵션을 사용할 때 이중화 갭 해소를 위한 트랜잭션 지연이 발생하므로 서비스 성능이 저하될 수 있다.

프로퍼티에 대한 자세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참조한다.

제약사항#

LAZY 모드로 이중화를 사용할 때에만 사용할 수 있다.

예제#

이중화 이름을 rep1 이라고 가정하고, rep1의 이중화 갭을 해소하기 위해 갭 해소 옵션을 사용한다.

  • 이중화 갭 해소를 생성한다.

    iSQL> CREATE REPLICATION rep1 OPTION GAPLESS;
    WITH '192.168.1.12', 35524
    FROM SYS.employees TO SYS.employees,
    FROM SYS.departments TO SYS.departments;;
    CREATE success.
    
  • 이중화 갭 해소 옵션을 사용한다.

    iSQL> ALTER REPLICATION rep1 SET GAPLESS ENABLE;
    Alter success.
    

병렬 적용자 옵션 (Parallel Applier Option)#

구문#

CREATE REPLICATION replication_name OPTIONS PARALLEL receiver_applier_count [buffer_size]...;
ALTER REPLICATION replication_name SET PARALLEL receiver_applier_count [buffer_size];

설명#

병렬 적용자(Parallel Applier)는 스토리지 매니저에 반영하는 적용자를 여러 개 생성하여 이중화 성능을 향상시켜주는 옵션이다.

수신자가 송신자로부터 받은 XLog를 병렬로 처리할 수 있도록 적용자에게 트랜잭션 단위로 분배하고, 병렬로 DML 처리를 수행함으로써 이중화 성능이 향상된다.

그러나 병렬로 처리시 데이터의 정합성을 지켜주기 위하여 병렬 적용자들간에 트랜잭션 커밋 동기화 과정이 필요하다. 이런 동기화 과정에서 커밋을 하는 적용자 외에는 대기하므로, 동기화 과정이 적을수록 성능 향상을 기대할 수 있다. 또한 적용자가 병렬 처리할 수 있는 작업은 동시에 수행된 트랜잭션의 DML 이기 때문에 동시에 수행된 트랜잭션이 적용자의 숫자보다 적은 경우에는 오히려 적용자 관리가 불필요하기 때문에 성능 하락의 원인이 된다.

이 옵션은 긴 트랜잭션으로 구성된 이중화에 적합하다. 짧은 트랜잭션들로 구성된 이중화된 트랜잭션이 많은 경우 잦은 커밋 동기화 과정을 거치기 때문에 성능 하락을 가져올 수 있다. 따라서 긴 트랜잭션들로 구성된 이중화된 트랜잭션이 많은 경우 커밋 동기화 과정이 드물기 때문에 성능 향상이 가능하다.

receiver_applier_count는 병렬 적용자의 개수를 의미하며, 0 ~ 512까지 입력할 수 있다. 만약 이 값을 0으로 설정하면, 적용 쓰레드가 0개이므로 병렬 적용자 없이 수신 쓰레드만 사용하고 적용자 역할을 대신 수행한다.

수신자와 적용자는 대기하는 큐를 이용하여 XLog를 전달한다. 이 때 수신할 수 있는 최대 XLog의 수는 프로퍼티 REPLICATION_RECEIVER_APPLIER_QUEUE_SIZE 값에 의해 설정된다. 프로퍼티에 대한 자세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참조한다. 입력하지 않은 경우에는 아래 프로퍼티에 따라 값이 설정된다.

buffer_size는 큐의 초기 크기를 의미하며 0 ~ 1TB까지 입력할 수 있다. 만약 이 값을 지정하지 않거나 병렬 적용자 큐의 수가 프로퍼티 REPLICATION_RECEIVER_APPLIER_QUEUE_SIZE 값보다 작다면 병렬 적용자 큐의 수는 프로퍼티 REPLICATION_RECEIVER_APPLIER_QUEUE_SIZE에 지정된 값으로 설정된다.

단위(K, M, G)를 입력하지 않았을 경우에는 MB 단위로 인식한다.

예제#

iSQL> CREATE REPLICATION replication_name OPTIONS PARALLEL receiver_applier_count 100M...;
iSQL> ALTER REPLICATION replication_name SET PARALLEL receiver_applier_count 100;

제약사항#

LAZY 모드로 이중화를 사용할 때에만 사용할 수 있다.

이중화 트랜잭션 그룹 옵션 (Replicated Transaction Grouping Option)#

구문#

CREATE REPLICATION replication_name OPTIONS GROUPING...;
ALTER REPLICATION replication_name SET GROUPING [ENABLE|DISABLE];

설명#

복수의 트랜잭션들을 하나의 트랜잭션처럼 그룹화하여 수신 쓰레드에 이중화 로그를 전송하여 복제되는 트랜잭션의 수를 줄이는 옵션이다.

이 옵션을 설정하면, 이중화 갭이 발생하였을 때 송신자보다 로그를 먼저 분석하여 이중화 트랜잭션을 그룹화하기 위해 선행 분석(Ahead Analyzer) 쓰레드가 생성된다. 선행 분석 쓰레드는 REPLICATION_GROUPING_AHEAD_READ_NEXT_LOG_FILE 프로퍼티에 설정된 값만큼 송신자가 분석하고 있는 로그 파일 번호보다 큰 번호의 로그 파일을 읽어 분석을 시작한다. 이 때 하나의 이중화 트랜잭션 그룹으로 묶을 수 있는 최대 트랜잭션의 수는 REPLICATION_GROUPING_TRANSACTION_MAX_COUNT 프로퍼티에 의해 결정된다.

이중화 트랜잭션을 그룹화 할 때는 커밋과 롤백으로 나뉘어 그룹화한다. 커밋으로 그룹화 된 이중화 트랜잭션들의 로그들은 송신자에 의해 하나의 트랜잭션으로 변환하여 전송되지만, 롤백으로 그룹화 된 이중화 트랜잭션들의 로그들은 송신자가 전송하지 않는다.

프로퍼티에 대한 자세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참조한다.

제약사항#

LAZY 모드로 이중화를 사용할 때에만 사용할 수 있다.

이중화 수신 전용 옵션(Receive Only Option)#

구문#

CREATE REPLICATION replication_name OPTIONS RECEIVE_ONLY FROM ...;
ALTER REPLICATION replication_name SET RECEIVE_ONLY {ON|OFF WITH { 'remote_host_ip' | 'remote_host_name', remote_host_port_no [USING conn_type [ib_latency]]}};

설명#

이중화를 수신 전용 옵션으로 설정하여 다른 노드로 변경 데이터를 전송하지 않도록 한다.

수신 전용으로 이중화를 생성하면 로그를 읽지 않으므로 네트워크 장애 등의 이중화 이슈가 발생하여도 시스템에 영향을 주지 않는다.

제약사항#

  • 복구 옵션을 사용할 수 없다.
  • 이중화 갭 해소 옵션을 사용할 수 없다.
  • 이중화 트랜잭션 그룹 옵션을 사용할 수 없다.
  • 메타 로깅 옵션을 사용할 수 없다.
  • DDL 문 복제를 사용할 수 없다.
  • EAGER 모드에서 사용할 수 없다.
  • 기본 이중화 이외의 롤을 가진 이중화에서 사용할 수 없다.

주의사항#

수신 전용 옵션을 설정하기 위해서는 아래의 사전 작업이 필요하다.

  1. 이중화에 설정된 호스트 정보를 모두 제거 (ALTER REPLICATION ... DROP HOST ALL)
  2. 이중화의 재시작과 관련된 정보 초기화 (ALTER REPLICATION ... RESET)

Caution

수신 전용 옵션을 설정하면, 기존의 이중화 설정 정보는 사라지므로, 추후에 수신 전용 옵션을 해제 시에는 이중화 설정 정보를 다시 입력해야 한다.

예제#

이중화 이름을 rep1이라고 가정하여, rep1을 수신 전용 옵션으로 생성하거나, 수신 전용옵션을 사용하도록 변경 및 수신 전용 옵션을 제거하는 예제이다.

  • 이중화를 수신 전용 옵션으로 생성한다.

    iSQL> CREATE REPLICATION rep1 OPTIONS RECEIVE_ONLY
    FROM SYS.employees TO SYS.employees,
    FROM SYS.departments TO SYS.departments;
    Create success.
    
  • 이중화를 수신 전용 옵션을 사용하도록 변경한다.

    iSQL> ALTER REPLICATION rep1 DROP HOST ALL;
    Alter success.
    iSQL> ALTER REPLICATION rep1 RESET;
    Alter success.
    iSQL> ALTER REPLICATION rep1 SET RECEIVE_ONLY ON;
    Alter success.
    
  • 이중화 수신 전용 옵션을 제거한다.

    iSQL> ALTER REPLICATION rep1 SET RECEIVE_ONLY OFF WITH '192.168.1.12',30300;
    Alter success.
    

메타 로깅 옵션(Meta Logging Option)#

구문#

CREATE REPLICATION replication_name OPTIONS META_LOGGING ...;
CREATE REPLICATION replication_name FOR ANALYSIS OPTIONS META_LOGGING...;

설명#

메타 로깅 옵션은 송신자 메타 정보와 재시작 SN 정보를 파일로 저장하는 기능이다.

이 옵션은 Active 서버의 이중화 객체에 설정한다. 수신 쓰레드가 동작 중인 이중화 서버에서 오프라인 이중화를 수행할 때, 저장된 파일을 참조하여 Active 서버의 메타 정보를 가져올 수 있다.

구문 설명#

  • OPTIONS META_LOGGING

    이중화 객체를 생성할 때 메타 로깅 옵션을 설정한다. 송신자 메타 정보와 재시작 SN 정보를 로그 파일 경로의 repl_meta_files디렉토리에 저장한다.

  • FOR ANALYSIS OPTIONS META_LOGGING

    이중화 객체를 Log Analyzer 롤로 생성할 때 메타 로깅 옵션을 설정한다. 송신자 메타 정보와 재시작 SN 정보를 로그 파일 경로의 ala_meta_files 디렉토리에 저장한다.

    Note

    Log Analyzer 롤 이중화 객체가 사용되는 Adapter for JDBC 및 Adapter for Oracle에서 오프라인 옵션에 대한 자세한 내용은 다음 문서를 참고한다.

오프라인 옵션(Offline Option)#

구문#

CREATE REPLICATION replication_name OPTIONS OFFLINE 'log_dir' ...;

ALTER REPLICATION replication_name SET OFFLINE ENABLE WITH 'log_dir';
ALTER REPLICATION replication_name BUILD OFFLINE META [AT SN(sn)];
ALTER REPLICATION replication_name START WITH OFFLINE;
ALTER REPLICATION replication_name RESET OFFLINE META;
ALTER REPLICATION replication_name SET OFFLINE DISABLE;

설명#

오프라인 옵션은 Active 서버의 미전송 로그를 가져와 원격 서버에 변경 트랜잭션을 반영하는 기능이다. 이 기능은 수신 쓰레드가 동작하는 이중화 서버에서 설정 및 수행하며, 이를 오프라인 이중화라고도 한다.

Altibase 서버에서 장애가 발생하여 원격 서버로 변경 트랜잭션을 이중화할 수 없는 경우, 오프라인 이중화를 수행하여 미전송 로그를 가져와 반영할 수 있다.

오프라인 이중화를 수행하려면 다음 조건을 충족해야 한다.

  • Active 서버가 원격 서버로 이중화를 시작한 이력이 있어야 한다.
  • Active 서버의 이중화 객체에 메타 로깅 옵션이 설정되어 있어야 한다.
  • Active 서버의 로그 파일과 송신자 메타 파일에 정상적으로 접근할 수 있어야 한다.

구문 설명#

  • OPTIONS OFFLINE

    이중화 객체를 생성할 때 오프라인 옵션을 설정한다. log_dir에는 Active 서버의 로그 파일 경로를 입력한다.

  • SET OFFLINE ENABLE WITH

    기존 이중화 객체에 오프라인 옵션을 설정한다. 이중화가 중지된 상태에서만 수행할 수 있다. log_dir에는 Active 서버의 로그 파일 경로를 입력한다.

  • BUILD OFFLINE META

    오프라인 이중화를 수행할 때 필요한 메타 정보를 구성한다.

    이 명령을 수행하면, log_dir경로의 repl_meta_files 디렉토리에서 송신자 메타 파일과 재시작 SN 파일을 읽어 메타 정보를 구성한다. Altibase 서버를 재시작하면 메타 정보가 사라지므로, BUILD OFFLINE META를 다시 수행해야 한다.

  • START WITH OFFLINE

    오프라인 이중화를 수행한다. 오프라인 이중화는 일회성 작업으로, Active 서버에서 전송하지 못한 로그를 가져와 반영한 후 자동으로 종료된다.

    오프라인 이중화를 수행하기 전에 SQL 반영 모드를 활성화해야 하며, 작업 완료 후에는 해제해야 한다.

    오프라인 이중화를 수행하면 송신 스레드와 수신 스레드가 자동으로 종료되므로, 이후 이중화를 다시 시작해야 한다.

  • RESET OFFLINE META

    RESET OFFLINE META 명령어는 BUILD OFFLINE META 실행 후 오프라인 이중화의 메타 정보를 초기화할 때 사용한다. 다음과 같은 상황에서 수행할 수 있다.

    • 오프라인 이중화 수행 중 에러가 발생해서 메타 정보를 새로 구성해야 하는 경우
    • 오프라인 이중화를 수행할 필요가 없어 메타 정보가 더 이상 필요하지 않은 경우
  • SET OFFLINE DISABLE

    이중화 객체에서 오프라인 옵션을 해제한다. 이중화가 중지된 상태에서만 수행할 수 있다.

아래는 오프라인 이중화가 수행되는 과정을 도식화한 것이다.

[그림 3‑1] 오프라인 옵션 사용 예

제약사항#

  • 오프라인 옵션은 LAZY 모드의 이중화 객체에만 설정할 수 있다.
  • 압축 테이블이 포함된 이중화 객체에는 오프라인 옵션을 설정할 수 없다.
  • 오프라인 옵션은 복구 옵션과 동시에 설정할 수 없다.
  • 오프라인 이중화를 수행하는 서버와 Active 서버는 OS와 CPU 타입 및 CPU 비트 수가 같아야 한다. 이기종 간 오프라인 이중화는 지원하지 않는다.
  • 오프라인 이중화를 수행하는 서버와 Active 서버는 바이너리 데이터베이스 버전(binary db version) 세 자리(Major, Minor, Patch)가 모두 같아야 한다.
  • 오프라인 이중화를 수행하는 서버와 Active 서버는 로그 파일 크기(LOG_FILE_SIZE)가 같아야 한다.

주의 사항#

사용자가 로그 파일 및 송신자 메타 파일을 임의로 변경할 경우, Altibase 서버가 비정상 종료하는 등의 문제가 발생할 수 있다.

잘못된 변경 예시:

  • 파일 이름 변경
  • 다른 시스템으로 로그 파일 복제
  • 파일 삭제

오프라인 이중화 수행 절차 예제#

Active 서버에서 장애가 발생했을 때 Standby 서버에서 오프라인 이중화를 수행하는 절차를 설명한다.

  • Active 서버: 변경 트랜잭션이 발생하는 이중화 서버
  • Standby 서버: 오프라인 이중화를 수행하는 이중화 서버
  • Active 서버의 로그 파일 경로: /active_server/altibase_home/logs

  • 오프라인 옵션이 설정된 이중화 객체에서 오프라인 이중화 수행

    이 예제에서는 메타 로깅 옵션이 설정된 Active 서버와 오프라인 옵션이 설정된 Standby 서버를 사용한다.

    Active Standby
    1. 스키마 생성 CREATE TABLE t1 (i1 INTEGER PRIMARY KEY, i2 CHAR(20)); CREATE TABLE t1 (i1 INTEGER PRIMARY KEY, i2 CHAR(20));
    2. 이중화 생성 CREATE REPLICATION rep1 OPTIONS META_LOGGING WITH 'standby_ip', standby_port FROM SYS.t1 TO SYS.t1; CREATE REPLICATION rep1 OPTION OFFLINE '/ active_server/altibase_home/logs' WITH 'active_ip', active_port FROM SYS.t1 TO SYS.t1;
    3. Active 서버 이중화 시작 ATER REPLICATION START rep1;
    4. Active 서버 장애 발생 장애 발생
    5. SQL 반영 모드 활성화 ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1;
    6. 오프라인 메타 정보 구성 ALTER REPLICATION rep1 BUILD OFFLINE META;
    7. 오프라인 이중화 시작 ALTER REPLICATION rep1 START WITH OFFLINE;
    8. SQL 반영 모드 비활성화 ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0;
  • 오프라인 옵션이 설정되지 않은 이중화 객체에서 오프라인 이중화 수행

    이 예제에서는 메타 로깅 옵션이 설정된 Active 서버와 오프라인 옵션이 설정되어 있지 않은 Standby 서버를 사용한다.

    Active Standby
    1. 스키마 생성 CREATE TABLE t1 (i1 INTEGER PRIMARY KEY, i2 CHAR(20)); CREATE TABLE t1 (i1 INTEGER PRIMARY KEY, i2 CHAR(20));
    2. 이중화 생성 CREATE REPLICATION rep1 OPTIONS META_LOGGING WITH 'standby_ip', standby_port FROM SYS.t1 TO SYS.t1; CREATE REPLICATION rep1 WITH 'active_ip', active_port FROM SYS.t1 TO SYS.t1;
    3. Active 서버 이중화 시작 ATER REPLICATION START rep1;
    4. Active 서버 장애 발생 장애 발생
    5. SQL 반영 모드 활성화 ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 1;
    6. 오프라인 옵션 설정 ALTER REPLICATION rep1 SET OFFLINE ENABLE WITH '/active_server/altibase_home/logs';
    7. 오프라인 메타 정보 구성 ALTER REPLICATION rep1 BUILD OFFLINE META;
    8. 오프라인 이중화 시작 ALTER REPLICATION rep1 START WITH OFFLINE;
    9. 오프라인 옵션 해제 ALTER REPLICATION rep1 SET OFFLINE DISABLE;
    10. SQL 반영 모드 비활성화 ALTER SYSTEM SET REPLICATION_SQL_APPLY_ENABLE = 0;

Note

Adapter for JDBC 및 Adapter for Oracle에서 오프라인 옵션 사용 예제는 다음 문서를 참고한다.


다중 IP 네트워크 환경에서의 이중화#

다중 IP 네트워크 환경에서의 이중화가 지원된다. 즉, 물리적인 두 개 이상의 네트워크 라인을 가진 두 호스트간의 이중화를 수행할 수 있다.

원격 호스트 지정#

구문#

CREATE REPLICATION replication_name {AS MASTER|AS SLAVE} 
WITH 'remote_host_ip' | 'remote_host_name', remote_port_no [USING conn_type [ib_latency]]
     'remote_host_ip' | 'remote_host_name', remote_port_no [USING conn_type [ib_latency]]
     
FROM user.localtableA TO user.remotetableA,
FROM user.localtableB TO user.remotetableB, , 
FROM user.localtableC TO user.remotetableC;

ALTER REPLICATION replication_name
ADD HOST 'remote_host_ip' | 'remote_host_name', remote_port_no [USING conn_type [ib_latency]];

ALTER REPLICATION replication_name
DROP HOST { {'remote_host_ip' | 'remote_host_name'}, remote_port_no | ALL };

ALTER REPLICATION replication_name
SET HOST 'remote_host_ip' | 'remote_host_name', remote_port_no;

설명#

시스템의 높은 가용성을 보장하고 신속한 장애 극복을 위하여 이중화 객체를 생성할 때 다수의 물리적인 IP 주소나 호스트 이름을 부여할 수 있다. 즉, 이중화를 시작하면 송신 쓰레드는 첫 번째 IP 주소나 호스트 이름을 이용하여 peer에 접속하며 이중화 작업을 수행하는데, 만약 이러한 작업 과정에서 문제가 발생하면, 송신 쓰레드는 해당 연결에 대해 접속을 해제하고 나머지 IP 주소나 호스트 이름으로 연결을 다시 시도하여 통신을 수행한다.

  • CREATE REPLICATION

    이중화 객체의 이름을 지정하고 WITH 절에는 이중화 상대 서버의 IP주소나 호스트 이름과 상대 서버 이중화 수신자의 서비스 포트를 다중으로 컴마 없이 리스트로 명시한다. FROM 절에는 지역 서버의 대상 테이블 소유자와 테이블 명을 TO 절에는 원격 서버의 대상 테이블 소유자와 테이블 명을 명시하며 콤마 리스트로 여러 개의 테이블을 지정할 수 있다.

  • ALTER REPLICATION (ADD HOST)

    호스트를 추가한다. 이중화 중지 후 호스트를 추가 할 수 있다. 이 구문 수행 후에, 송신 쓰레드는 호스트를 추가 하기 전에 사용하던 IP 주소나 호스트 이름으로 다시 연결을 시도한다.

  • USING conn_type [ib_latency]

    원격 서버와의 통신 방식을 지정한다. 이 절을 생략하면 TCP로 동작한다.

    • TCP : TCP 통신을 사용 (기본값)
    • IB : 인피니밴드(InfiniBand) 통신을 사용

    • ib_latency

      rsocket의 RDMA_LATENCY 옵션값을 지정할 수 있으며, 기본값은 0이다. conn_type이 IB인 경우에만 입력 가능하다. 이 값이 1이면 CPU 자원을 소모하더라도, 적은 대기 시간을 사용한다.

  • ALTER REPLICATION (DROP HOST)

    호스트를 제거한다. 이중화 중지 후 호스트를 제거 할 수 있다. 이 구문 수행 후에, 송신 쓰레드는 맨 처음 IP 주소나 호스트 이름으로 연결을 시도한다.

    • ALL 키워드를 이용하면 모든 호스트를 제거할 수 있다. 모든 호스트의 제거 후에는 이중화를 시작할 수 없다.
  • ALTER REPLICATION (SET HOST)

    특정 호스트를 현재 호스트로 지정한다. 이중화 중지 후 호스트를 지정 할 수 있다. 이 구문 수행 후에, 송신 쓰레드는 현재 지정된 호스트의 IP 주소나 호스트 이름으로 연결을 시도한다.

예제#

다음은 2개의 IP 주소 네트워크 환경인 지역 서버(IP: 192.168.1.51, PORT NO: 30570)와 원격 서버('IP: 192.168.1.154, PORT NO: 30570', 'IP: 192.168.2.154, PORT NO: 30570')간에 employees 테이블과 departments 테이블에 이중화 생성 후 지역 서버와 원격 서버를 Active-Standby 모드로 이중화를 수행하는 예이다.

  • 원격 서버 (Standby)에 이중화 생성

    iSQL> CREATE REPLICATION rep1   
      WITH '192.168.1.51', 30570    
      FROM SYS.employees   TO SYS.employees,
      FROM SYS.departments TO SYS.departments;
    Create success.
    
  • 지역 서버 (Active)에 이중화 생성

    iSQL> CREATE REPLICATION rep1
      WITH '192.168.1.154', 30570 '192.168.2.154', 30570
      FROM SYS.employees   TO SYS.employees,
      FROM SYS.departments TO SYS.departments;
    Create success.
    
  • 메타 테이블을 이용하여 등록된 호스트 개수, 이중화 테이블 개수 등 이중화 관련 정보를 알 수 있다.

    iSQL> SELECT * FROM SYSTEM_.SYS_REPLICATIONS_;
    REPLICATION_NAME         : REP1  
    LAST_USED_HOST_NO        : 2 
    HOST_COUNT               : 2 
    IS_STARTED               : 0 
    XSN                      : -1 
    ITEM_COUNT               : 2 
    CONFLICT_RESOLUTION      : 0 
    REPL_MODE                : 0 
    ROLE                     : 0 
    OPTIONS                  : 0 
    INVALID_RECOVERY         : 0 
    REMOTE_FAULT_DETECT_TIME :  
    GIVE_UP_TIME             :  
    GIVE_UP_XSN              :  
    PARALLEL_APPLIER_COUNT   : 0 
    APPLIER_INIT_BUFFER_SIZE : 0 
    REMOTE_XSN               : -1 
    PEER_REPLICATION_NAME    :   
    REMOTE_LAST_DDL_XSN      : -1 
    
    1 row selected.
    
  • 메타 테이블을 이용하여 원격 서버에 관련된 정보를 알 수 있다.

    iSQL> SELECT * FROM SYSTEM_.SYS_REPL_HOSTS_;
    HOST_NO          : 2 
    REPLICATION_NAME : REP1  
    HOST_IP          : 192.168.1.154  
    PORT_NO          : 30570 
    CONN_TYPE        : TCP  
    IB_LATENCY       : N/A  
    
    HOST_NO          : 3 
    REPLICATION_NAME : REP1  
    HOST_IP          : 192.168.2.154  
    PORT_NO          : 30570 
    CONN_TYPE        : TCP  
    IB_LATENCY       : N/A  
    
    2 rows selected.
    
  • 이중화 시작

    iSQL> ALTER REPLICATION rep1 START;
    Alter success.
    
  • 이중화 시작후에 이중화 상태를 확인할 수 있다. 송신 쓰레드는 첫번째 IP와 PORT를 사용해서 peer에 연결한다.

    iSQL> SELECT REP_NAME
         , STATUS
         , NET_ERROR_FLAG
         , SENDER_IP
         , SENDER_PORT
         , PEER_IP
         , PEER_PORT
      FROM V$REPSENDER;
    REP_NAME              STATUS               NET_ERROR_FLAG       SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
    --------------------------------------------------------------------------------------------------------------------------------------------
    REP1                  1                    0                    192.168.1.51          13718       192.168.1.154         30570   
    1 row selected. 
    
  • 네트워크 연결 단절 상황 발생

  • 네트워크 단절 후에 이중화 상태를 확인할 수 있다. 두 번째 IP와 PORT를 사용해서 재연결한 것을 볼 수 있다.

    iSQL> SELECT REP_NAME
         , STATUS
         , NET_ERROR_FLAG
         , SENDER_IP
         , SENDER_PORT
         , PEER_IP
         , PEER_PORT
      FROM V$REPSENDER;
    REP_NAME              STATUS               NET_ERROR_FLAG       SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
    --------------------------------------------------------------------------------------------------------------------------------------------
    REP1                  1                    0                    192.168.1.51          40009       192.168.1.154         30570        
    1 row selected. 
    
  • 이중화 중지

    iSQL> ALTER REPLICATION rep1 STOP;
    Alter success.
    
  • 이중화 시작

    iSQL> ALTER REPLICATION rep1 START;
    Alter success.
    
  • 이중화 중지 후에 다시 시작하면, 이중화 중지 전에 연결 되었던 IP와 PORT로 다시 연결하는 것을 볼 수 있다.

    iSQL> SELECT REP_NAME
         , STATUS
         , NET_ERROR_FLAG
         , SENDER_IP
         , SENDER_PORT
         , PEER_IP
         , PEER_PORT
      FROM V$REPSENDER;
    REP_NAME              STATUS               NET_ERROR_FLAG       SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
    --------------------------------------------------------------------------------------------------------------------------------------------
    REP1                  1                    0                    192.168.1.51          64351       192.168.1.154         30570    
    1 row selected.
    
  • 호스트 추가: 이중화 중지 후 수행 할 수 있다.

    iSQL> ALTER REPLICATION rep1 ADD HOST '192.168.3.154',30570;
    Alter success.
    
  • 호스트 제거: 이중화 중지 후 수행 할 수 있다.

    iSQL> ALTER REPLICATION rep1 DROP HOST '192.168.3.154',30570;
    Alter success.
    
  • 호스트 지정: 이중화 중지 후 수행 할 수 있다.

    iSQL> ALTER REPLICATION rep1 SET HOST '192.168.1.154',30570;
    Alter success.
    
  • 이중화 시작: 새 호스트를 지정 했기 때문에 현재 지정된 IP와 PORT를 이용하여 접속하며 이중화 작업을 시작한다.

    iSQL> ALTER REPLICATION rep1 START;
    Alter success.
    
  • 새로 지정한 IP 192.168.1.154 와 PORT 번호 30570을 사용해서 연결한 것을 확인할 수 있다.

    iSQL> SELECT REP_NAME
         , STATUS
         , NET_ERROR_FLAG
         , SENDER_IP
         , SENDER_PORT
         , PEER_IP
         , PEER_PORT
      FROM V$REPSENDER;
    REP_NAME              STATUS               NET_ERROR_FLAG       SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
    --------------------------------------------------------------------------------------------------------------------------------------------
    REP1                  1                    0                    192.168.1.51          11477       192.168.1.154         30570        
    1 row selected.
    

송신자 IP 주소 설정#

송신자 IP 주소 설정은 이중화 연결에 사용할 송신자 IP 주소를 사용자가 지정하는 기능이다. 여러 IP 주소 중 특정 IP 주소를 송신자 IP 주소로 이중화 통신을 원할 때 사용할 수 있다. 이 기능은 Altibase 서버 프로퍼티 REPLICATION_SENDER_IP를 설정하여 사용한다.

사용 방법#

  1. 지역 서버의 altibase.properties 파일에 REPLICATION_SENDER_IP 프로퍼티를 추가한다. 여기서 지역 서버는 ALTER REPLICATION replication_name START 구문으로 이중화를 시작하는 서버를 의미한다.

  2. 송신자 IP 주소로 사용할 특정 IP 주소를 프로퍼티 값으로 입력한다.

    IP 주소는 IPv4, IPv6, IPv6 확장 주소 형태로 입력한다. REPLICATION_SENDER_IP를 추가하여 여러 개의 IP 주소를 입력할 수 있다. 다수의 IP 주소를 입력하면, 이중화 시작 시 IP 주소를 순서대로 검사하며 사용할 수 있는 IP 주소를 선택한다. 수신자와 통신이 실패하면 altibase_rp.log에 에러 메시지를 남기고 다음 IP 주소로 재시도한다.

    • 여러 개의 IP 주소 설정 예시*

      $ vi altibase.properties
      REPLICATION_SENDER_IP = 10.0.0.1
      REPLICATION_SENDER_IP = 0000:0000:0000:0000:0000:ffff:1400:0001
      
  3. Altibase 서버를 재시작한다.

    REPLICATION_SENDER_IP는 읽기 전용 속성으로 변경 값을 적용하려면 Altibase 서버를 재시작해야 한다.

제약사항#

  • 이중화 통신 방식 TCP에서만 사용할 수 있다.

  • 이중화 객체 단위로 설정할 수 없다.

    REPLICATION_SENDER_IP 프로퍼티는 모든 이중화 객체에 일괄적으로 적용된다.

  • 호스트네임으로 설정할 수 없다.

    IP 주소 형식에 맞지 않는 값을 입력하면 Altibase 서버 구동이 실패한다.

사용 예제#

IP 주소가 2개씩 구성된 서버에서 송신자 IP 주소 설정 기능을 사용하여 이중화를 구성했을 때 망 구성에 따라 송신자 IP 주소가 어떻게 할당되었는지 보여주는 예제이다.

  • 각 서버의 IP 주소 구성

    • A 서버 : 10.0.0.1, 20.0.0.1
    • B 서버 : 10.0.0.2, 20.0.0.2
  • 이중화 객체 생성

    이중화 포트는 30300이라고 가정한다.

    • A 서버

      CREATE REPLICATION rep1 WITH '10.0.0.2', 30300 FROM user1.t1 TO user1.t1;
      CREATE REPLICATION rep2 WITH '20.0.0.2', 30300 FROM user1.t2 TO user1.t2;  
      
    • B 서버

      CREATE REPLICATION rep1 WITH '10.0.0.1', 30300 FROM user1.t1 TO user1.t1;
      CREATE REPLICATION rep2 WITH '20.0.0.1', 30300 FROM user1.t2 TO user1.t2;
      
  • REPLICATION_SENDER_IP 설정

    A 서버의 altibase.properties 설정은 아래와 같다.

    REPLICATION_SENDER_IP = 10.0.0.1
    REPLICATION_SENDER_IP = 20.0.0.1
    
  • 송신자 IP 주소 설정 상태

    A 서버에서 이중화를 시작하고 송신자의 IP 주소를 확인해보자.

    • 망 분리가 되지 않은 경우

      먼저, A, B 서버의 모든 IP 주소가 서로 통신이 가능한 환경에서 설정된 송신자 IP 주소를 보자.

      이중화 객체 REP1, REP2의 원격 서버 B (PEER_IP)와 통신할 수 있는 A 서버의 송신자 IP 주소로 10.0.0.1(SENDER_IP)가 선택되었다. REPLICATION_SENDER_IP의 첫 번째 IP 주소로 모두 통신이 가능하여 두 번째 IP 주소가 사용되지 않은 것을 볼 수 있다.

      -- A 서버 송신자 정보 조회
      -- REP1, REP2 모두 SENDER_IP가 REPLICATION_SENDER_IP의 첫 번째 IP 주소가 선택
      iSQL> SELECT REP_NAME, SENDER_IP, SENDER_PORT, PEER_IP, PEER_PORT FROM V$REPSENDER;
      REP_NAME              SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
      ------------------------------------------------------------------------------------------------
      REP1                  10.0.0.1              56016       10.0.0.2              30300       
      REP2                  10.0.0.1              56511       20.0.0.2              30300       
      2 row selected.
      
    • 망 분리가 된 경우

      A, B 서버가 10.0.0.x 대역끼리 통신하고 20.0.0.x 대역끼리 통신하도록 망 분리가 되어 있는 환경을 살펴보자.

      이중화 객체 REP1의 A 서버의 송신자 IP 주소로 10.0.0.1(SENDER_IP)가 선택되었고 이중화 객체 REP2의 SENDER_IP는 REPLICATION_SENDER_IP의 두 번째 값인 20.0.0.1 이 선택되었다. REPLICATION_SENDER_IP의 첫 번째 값 10.0.0.1로 B 서버의 20.0.0.2와 통신을 시도하였으나 실패하고 두 번째 IP 주소로 재시도하여 선택된 것이다.

      -- A 서버 송신자 정보 조회
      -- REP1의 SENDER_IP는 REPLICATION_SENDER_IP의 첫 번째 IP 주소 선택, REP2의 SENDER_IP는 두 번째 IP 주소 선택
      iSQL> SELECT REP_NAME, SENDER_IP, SENDER_PORT, PEER_IP, PEER_PORT FROM V$REPSENDER;
      REP_NAME              SENDER_IP             SENDER_PORT PEER_IP               PEER_PORT   
      ------------------------------------------------------------------------------------------------
      REP1                  10.0.0.1              56016       10.0.0.2              30300       
      REP2                  20.0.0.1              56511       20.0.0.2              30300
      2 row selected.
      


이중화 관련 프로퍼티#

이중화를 사용하기 위해서는 Altibase 프로퍼티 파일을 사용 목적에 맞게 수정해야 한다. 이중화와 관련된 프로퍼티는 다음과 같다. 각 프로퍼티에 대한 상세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참조한다.

  • REPLICATION_ACK_XLOG_COUNT
  • REPLICATION_ALLOW_DUPLICATE_HOSTS
  • REPLICATION_BEFORE_IMAGE_LOG_ENABLE
  • REPLICATION_COMMIT_WRITE_WAIT_MODE
  • REPLICATION_CONNECT_RECEIVE_TIMEOUT
  • REPLICATION_CONNECT_TIMEOUT
  • REPLICATION_DDL_ENABLE
  • REPLICATION_DDL_ENABLE_LEVEL
  • REPLICATION_DDL_SYNC
  • REPLICATION_DDL_SYNC_TIMEOUT
  • REPLICATION_EAGER_PARALLEL_FACTOR
  • REPLICATION_EAGER_RECEIVER_MAX_ERROR_COUNT
  • REPLICATION_FAILBACK_INCREMENTAL_SYNC
  • REPLICATION_GAP_UNIT
  • REPLICATION_GAPLESS_ALLOW_TIME
  • REPLICATION_GAPLESS_MAX_WAIT_TIME
  • REPLICATION_GROUPING_AHEAD_READ_NEXT_LOG_FILE
  • REPLICATION_GROUPING_TRANSACTION_MAX_COUNT
  • REPLICATION_HBT_DETECT_HIGHWATER_MARK
  • REPLICATION_HBT_DETECT_TIME
  • REPLICATION_IB_LATENCY
  • REPLICATION_IB_PORT_NO
  • REPLICATION_INSERT_REPLACE
  • REPLICATION_KEEP_ALIVE_CNT
  • REPLICATION_LOCK_TIMEOUT
  • REPLICATION_LOG_BUFFER_SIZE
  • REPLICATION_MAX_COUNT
  • REPLICATION_MAX_LISTEN
  • REPLICATION_MAX_LOGFILE
  • REPLICATION_POOL_ELEMENT_COUNT
  • REPLICATION_POOL_ELEMENT_SIZE
  • REPLICATION_PORT_NO
  • REPLICATION_PREFETCH_LOGFILE_COUNT
  • REPLICATION_RECEIVE_TIMEOUT
  • REPLICATION_RECEIVER_APPLIER_ASSIGN_MODE
  • REPLICATION_RECEIVER_APPLIER_QUEUE_SIZE
  • REPLICATION_RECEIVER_APPLIER_YIELD_COUNT
  • REPLICATION_RECOVERY_MAX_LOGFILE
  • REPLICATION_RECOVERY_MAX_TIME
  • REPLICATION_SENDER_AUTO_START
  • REPLICATION_SENDER_COMPRESS_XLOG
  • REPLICATION_SENDER_ENCRYPT_XLOG
  • REPLICATION_SENDER_IP
  • REPLICATION_SENDER_SEND_TIMEOUT
  • REPLICATION_SENDER_SLEEP_TIME
  • REPLICATION_SENDER_SLEEP_TIMEOUT
  • REPLICATION_SENDER_START_AFTER_GIVING_UP
  • REPLICATION_SERVER_FAILBACK_MAX_TIME
  • REPLICATION_SQL_APPLY_ENABLE
  • REPLICATION_SYNC_APPLY_METHOD
  • REPLICATION_SYNC_LOCK_TIMEOUT
  • REPLICATION_SYNC_LOG
  • REPLICATION_SYNC_TUPLE_COUNT
  • REPLICATION_TIMESTAMP_RESOLUTION
  • REPLICATION_TRANSACTION_POOL_SIZE
  • REPLICATION_UPDATE_REPLACE
  • REPLICATION_META_ITEM_COUNT_DIFF_ENABLE