트리거 기반 DB 동기화 툴 symmetricDS 간단 소개
INFO symmetricDS 간단 소개(매뉴얼 속독정리)
intro
이번에 새로 진행하게된 프로젝트에선 각각의 서비스에서 데이터를 끌어다가
마치 우리 DB 인듯 활용해야될 필요가 생겼다.
각 서비스는 oracle, mySql 등의 각각의 DBMS를 사용하고 있었고
이를 하나의 DB로 끌어와야 하는데
각 서비스에서 C,U,D 가 발생할때마다 우리서비스에 API 를 호출해 주는 방식
각 서비스 복제 DB에 접근하여 특정 시간 간격마다 변경사항을 쿼리 해오는 방식
등등 모두 각각의 장단이 있고
연동 서비스및 우리 서비스 장애시 데이터 보정법을 고려하다 보니
너무 그림이 커져 끝이 없는 고민을 하던 도중
symmetricDS라는 오픈 소스 프로그램(프레임워크?)를 알게 되어 간략하게 정리해본다.
우리 프로젝트에서는 몇가지 이유로 인해 결국 도입을 하지 않기로 했지만 다른 상황에서는 충분히 고려해 볼만한듯 하다.
홈페이지|http://symmetricds.codehaus.org/ 에 따르면 아래와 같이 소개 하고 있다.
SymmetricDS is an asynchronous data replication software package that supports multiple subscribers and bi-directional synchronization. It uses web and database technologies to replicate tables between relational databases, in near real time if desired. The software was designed to scale for a large number of databases, work across low-bandwidth connections, and withstand periods of network outage.
By using database triggers, SymmetricDS guarantees that data changes are captured and atomicity is preserved. Support for database vendors is provided through a Database Dialect layer, with implementations for MySQL, Oracle, SQL Server, PostgreSQL, DB2, Firebird, HSQLDB, H2, and Apache Derby included.
즉 symmetricDS는 database 및 web 기술을 이용해 비동기 양방향 데이터 복제를 지원하며
비동기 방식이지만 원하는경우 "거의" 실시간 으로 처리 할 수 있고
아마도 time gap 을 줄여 하면 된다는 소리 일듯
데이터베이스가 많고 네트워크가 불안정한 상황(low bandwidth & network outage) 를 고려하여 디자인 되다고 한다.
symmetricDS는 데이터베이스 트리거를 기반으로 동작 하는데
현재 MySQL, Oracle, SQL Server, PostgreSQL, DB2, Firebird, HSQLDB, H2, and Apache Derby 를 지원한다고 한다.
즉 테이블에 트리거를 걸어서 CUD 등의 이벤트가 발생 할때 symmetricDS 에 어떤 방식으로든 이벤트를 발생 시키고
이를 수집해 서로간의 sync 를 맞춘다는 말인듯 하다.
symmetricDS features
현재 기준으로 최신 버전인 2.4 의 Document|http://symmetricds.codehaus.org/guide/2.4/html-single/user-guide.html 를 살펴 보면
여러가지 feature 들을 소개 하고 있는데 개인적으로 끌리는 몇가지 특징을 정리 해본다.
Two-Way Table Synchroniztion
일반적으로 상상할 수 있는 one-way 동기화 이외에도 two-way 동기화를 지원 하는데
예를 들어 아래와 같은 시나리오에서 쓰인다.
POS 를 사용하는 각 지점에서
상품 판매 정보가 중앙DB 에 sync 되면 중앙 DB 에서는 각 아이템의 최신 가격및 재고를 업데이트하고 각 지점으로 sync 하는 식
symmetricDS 는 이와 같은 상황에서 loop에 빠질 수 있는 홀까지 방지해 준다고 한다.
Data Channels
데이터 채널이라는 개념을 도입해서 특정 테이블에 변경이 많아 sync 중에도
다른 채널의 데이터가 대기하는(sync가 되지 않고 기다리는) 일이 없도록 햇다고 한다.
라고 이해 했는데 뭔가 섹션까지 하나 잡아 설명하는걸로 봐서 이렇게 쉬운 개념은 아닌듯 하다
Data Filtering and Rerouting
Using SymmetricDS, data can be filtered as it is recorded, extracted, and loaded.
SymmetricDS 를 사용하면 sync 되는 데이터를 필터링하고 가공하고 추출할 수 있다고 한다.
추가적으로 Rerouting 이라고 유용해 보이는 기능에 대해 설명을 하고 있는데
아직 정확히 무엇을 한다는 것인지 설명할 정도로 이해하지 못하였다.
간략한 동작 FLOW
* 특정 서버에 각 service DB 와 접근 가능하도록 SymmetricDS 를 설치 한다.
(데이터가 모일 root 및 client 모두, DB 서버에 직접 설치될 필요는 없고 jdbc를 통해 접근 할 수 있는 서버에 설치가 되면 됨)
* SymmetricDS 를 실행 한다.
* client SymmetricDS 를 등록 한다.
* 트리거등 각종 설정을 한다.
* 데이터가 잘 동기되는지 확인 한다.
트리거 설정 방법
처음 overview 나 feature 를 보면서 예상하기로는
사용자가 직접 DBMS 상에서 트리거를 설정 하게 될 줄 알았는데
sym_trigger 테이블에(접두어는 변경가능) 에 아래와 같이 정해진 문법에 따라 규칙을 지정하면
SymmetricDS에서 직접 트리거를 설정해 모니터링을 한다.
insert into SYM_TRIGGER
(trigger_id,source_table_name,channel_id,last_update_time,create_time)
values
('item', 'item', 'item', current_timestamp, current_timestamp);
설정에 따라 각 트리거를 연쇄적으로 발생 시킬 수도 있는 듯 하다.
DBMS 별 필요 권한
위의 트리거 설정 방법을 보고 예상 했겠지만
시스템에서 직접 트리거를 생성하므로 각 DBMS 별 해당 작업을 수행 할 수 있는 계정이 필요 하다.
ORACLE (8.1.7 above) :
GRANT CONNECT TO SYMMETRIC;
GRANT RESOURCE TO SYMMETRIC;
GRANT CREATE ANY TRIGGER TO SYMMETRIC;
GRANT EXECUTE ON UTL_RAW TO SYMMETRIC;
MySql (5.0.2 above) :
innodb 방식의 테이블이 필요하며
5.0 에서는
grant super on *.* to symmetric;
5.1 이상에서는
grant trigger on *.* to symmetric;
grant create routine on *.* to symmetric;
의 권한이 필요 하다.
기타 다른 DB 의 경우 각 DBMS 마다의 제한사항이 있는데
변명으로 아직 임플메이션을 다 못했다고 하는 것으로 보아
지원하지 않는 DB의 경우도 직접 구현하면 사용 가능 할 것 같다.
또한 공통적으로 거의 슈퍼유저 급의 계정 권한이 필요 한것 같다
정리
DB 에 트리거를 걸어 놓고 이벤트가 발생할때 마다 특정 테이블에 기록해 두고
이를 이용해 동기화 하는 간단한 아이디어에 각종 예외 처리를 잘 해둔 라이브러리인 것 같다
매뉴얼 정리 단계에서 홀딩되어 실제 프로토타이핑을 해보지 못해
정말 잘 동작 하는지는 알수 없는게 함정.ㅋ
하지만 조금 검색해 본결과 상당히 평도 좋고 프로젝트도 꽤나 활성화 되어 있어
쓸만 하다 추측하고 있다.
이번엔 못 써먹고 비슷하게 만들게 되었지만
유용히 사용할 날도 있으리라 믿고 정리 해 둔다.
답글 정리 (혹시 몰라 익명 처리)
=======================================================================
http://www.symmetricds.org/getting_started.html 매뉴얼 진짜 잘 써놨던데요
http://sourceforge.net/projects/symmetricds/forums 포럼도 꽤나 활발 하구요
위의 getting_started 문서를 참조 하시어 설치 해보시면
다른 기능은 감이 오실 꺼에요
저도 자료 찾다가 아오.. 하며 매뉴얼 찬찬히 읽게 되었는데
정말 쉽게 잘 써놓았더라구요
'setting' 카테고리의 다른 글
dbcp와 ibatis를 통한 connection pooling (0) | 2016.11.01 |
---|---|
ibatis config 설정파일 (0) | 2016.11.01 |
weblogic classpath 지정하기. (0) | 2016.08.23 |
weblogic console에서 배치 등록 에러. (0) | 2016.08.19 |
도커란? (1) | 2016.07.27 |