콘텐츠로 이동

7. 시퀀스 이중화#

Altibase는 기본적으로 테이블 객체만 이중화를 지원한다. 따라서 시퀀스 이중화란 시퀀스 자체의 복제가 아니라 시퀀스 이중화만을 위한 전용 테이블을 생성하여 사용하는 방식이다.

이 장은 Altibase에서 지원하는 시퀀스 이중화를 위한 조건 및 방법을 설명한다.

시퀀스 이중화 개요#

Altibase의 시퀀스 이중화란 Fail-Over가 발생하는 상황에도 원격 서버와 지역 서버가 동일한 시퀀스를 사용할 수 있는 기능이다. 따라서 애플리케이션에서 동일한 시퀀스 및 동일한 프로그램 소스를 사용할 수 있다.

시퀀스 이중화는 캐시 시작 값을 이중화하여 두 서버에서 시퀀스 값이 중복되지 않도록 해야한다. 캐시 크기의 시퀀스를 메모리에 저장하여 사용하며, 저장된 시퀀스를 전부 사용하면 다시 캐시 크기의 시퀀스를 메모리에 저장한다.

Altibase 이중화는 테이블만 지원하므로 시퀀스 이중화를 위한 테이블을 내부적으로 생성한다.


사용 조건#

아래와 같이 프로퍼티를 설정해야 한다. 이 프로퍼티에 대한 자세한 내용은 Replication Reference와 General Reference을 참조한다.

REPLICATION_TIMESTAMP_RESOLUTION=1

지역 서버와 원격 서버의 시퀀스 옵션이 동일해야 한다. 시퀀스 옵션에 대한 자세한 내용은 SQL Reference를 참조한다.

START WITH
INCREMENT BY
MAXVALUE
MINVALUE
CACHE
FLUSH CACHE
CYCLE


구문#

시퀀스 이중화와 관련한 주요 구문은 아래와 같다. 자세한 내용은 SQL Reference와 Replication Reference를 참조한다.

시퀀스 이중화를 위한 시퀀스 생성#

시퀀스 생성시 ENABLE SYNC TABLE 옵션을 명시하면 시퀀스 이중화를 위한 seq_name$seq테이블이 생성된다. 캐시 크기는 100이상으로 설정할 것을 권장한다.

CREATE SEQUENCE user_name.seq_name START WITH 1 CACHE 100 ENABLE SYNC TABLE;

시퀀스 이중화의 생성#

시퀀스 이중화용 테이블이 복제되도록 이중화 객체를 생성한다.

CREATE REPLICATION repl_name WITH 'remote_host_ip', remote_host_port_no FROM user_name.seq_name$seq TO user_name.seq_name$seq; 

시퀀스 이중화의 시작 및 종료#

시퀀스 이중화를 시작 또는 종료한다.

ALTER REPLICATION repl_name START;
ALTER REPLICATION repl_name STOP;

시퀀스 이중화의 설정 해제#

이중화 삭제(DROP REPLICATION) 또는 이중화 대상에서 테이블을 제외(ALTER TABLE table_name DROP COLUMN)하는 질의문을 수행한 후에 시퀀스 설정을 해제하는 질의문을 수행하면 seq_name$seq 테이블이 삭제된다.

ALTER SEQUENCE user_name.seq_name DISABLE SYNC TABLE; 


주의 사항#

  • Active-Standby 환경에서 사용을 권장한다. Active-Active환경에서 사용하면 서버 간의 이중화 간격이 발생하여 시퀀스 값이 중복될 수 있다.

  • 시퀀스 캐시의 크기가 클수록 시퀀스 생성 속도가 빨라진다. 캐시 크기는 시퀀스 이중화용 테이블이 생성된 후에는 변경할 수 없으므로 미리 변경해야 한다.

    ALTER SEQUENCE username.seq_name CACHE 100;
    ALTER SEQUENCE user1.seq1 ENABLE SYNC TABLE;
    
  • 테이블이 동반된 시퀀스 이중화를 권장하지 않는다. 테이블의 이중화 작업이 지연되어 시퀀스의 이중화 작업이 지연되는 상황에서 Fail-Over가 발생한다면 시퀀스 중복 키 에러가 발생할 수 있다.

  • Fail-Over가 발생하면 원격 서버에서 시퀀스를 참조할 때 다음 캐시 시작 값부터 시작되므로 키 값 사이에 공백이 발생할 수 있다.

  • 이중화 재생성과 시퀀스 재생성 및 변경은 모든 서버에 동일하게 적용해야 한다.


예제#

이중화 시퀀스 사용 도중에 Fail-Over가 발생하였을 때 이중화 서버의 상태를 확인한다.

A서버 B서버
iSQL> CREATE SEQUENCE seq1 START WITH 1 INCREMENT BY 1 CACHE 1000 ENABLE SYNC TABLE;
Create success.
iSQL> CREATE SEQUENCE seq1 START WITH 1 INCREMENT BY 1 CACHE 1000 ENABLE SYNC TABLE;
Create success.
iSQL> CREATE REPLICATION rep1 WITH '192.168.1.2', 20002 FROM SYS.seq1$seq TO SYS.SEQ1$seq;
Create success.
iSQL> CREATE REPLICATION rep1 WITH '192.168.1.1', 20001 FROM SYS.seq1$seq TO SYS.SEQ1$seq;
Create success.
iSQL> ALTER REPLICATION rep1 START;
Alter success.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
----------------------
1
1 row selected.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
-----------------------
1
1 row selected.
iSQL> SELECT seq1.NEXTVAL FROM DUAL; SEQ1.NEXTVAL
----------------------
1
1 row selected.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
----------------------
1001
1 row selected.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
----------------------
1001
1 row selected.
iSQL> SELECT seq1.NEXTVAL FROM DUAL; SEQ1.NEXTVAL
----------------------
2
1 row selected.
iSQL> SELECT seq1.NEXTVAL FROM DUAL;
SEQ1.NEXTVAL
----------------------
3
1 row selected.
Fail-Over 발생
iSQL> SELECT seq1.NEXTVAL FROM DUAL; SEQ1.NEXTVAL
----------------------
1001
1 row selected.
iSQL> SELECT seq1.NEXTVAL FROM DUAL; SEQ1.NEXTVAL
----------------------
1002
1 row selected.
iSQL> SELECT seq1.NEXTVAL FROM DUAL; SEQ1.NEXTVAL
----------------------
1003
1 row selected.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
-------------------
2001
1 row selected.
iSQL> SELECT LAST_SYNC_SEQ FROM seq1$seq; LAST_SYNC_SEQ
----------------------
2001
1 row selected.