LinkedIn Databus
GitHub 문서를 번역한 내용입니다.
Purpose
선택 된 테이블에 대한 Timeline-consistent stream 을 얻습니다.
요구사항은 다음과 같습니다.
- 변경 사항이 순서에 맞게 재현 가능해야 합니다.
이는 DB 의 어떤 시점에서 변경을 적용했을 때 end image 가 같음을 보장합니다. - 어느 타임동안 하나의 row 에 대해 복수의 변경이 일어난 경우 중간의 변경 내용을 추적하진 않습니다.
특정 포인트 (SCN) 의 마지막 이미지를 얻는 것으로 충분합니다.
Concepts
ora_rowscn
오라클의 각 테이블은 ora_rowscn 이라는 pseudo-column 을 가지며,
이는 row 가 수정 될 때 가장 높은 SCN 을 가집니다.
기본적으로 오라클은 Block-level 로 관리하나,
rowdependencies 를 셋팅하면 row-level 로 관리 가능합니다.
Setup Artifacts
- 각 소스 테이블은 인덱싱 된 txn 컬럼을 추가적으로 가집니다.
- sy$txlog 테이블은 데이터베이스마다 만들어집니다. 이는 소스테이블에 대한 변경을 추적합니다.
메인 컬럼으로 ( scn, txn, mask, timestamp ) 를 가집니다. - Before insert/update 트리거를 테이블마다 2개씩 가지며 다음의 2가지를 수행합니다.
- sync_core.getTxn() 을 수행해 현재의 transaction ID 를 얻고,
이를 소스 테이블의 txn 컬럼에 넣습니다. - sy$txlog 에 Insert 나 Update 를 수행하는데 Txn 을 새로운 txnid 로,
scn 을 Infinity 로 초기화한다.
- sync_core.getTxn() 을 수행해 현재의 transaction ID 를 얻고,
- 백그라운드에서 N 초마다 수행되는 잡이 있습니다. ( 현재 2초 )
이는 sy$txlog 의 scn = Infinity 를 ora_rowscn 으로 Update 합니다.
Flow
- Txn T1 이 시작되고 Source S1 의 row R1 을 업데이트 합니다.
- S1 에 대한 trigger 가 update 하기 전에 다음이 일어납니다:
- sync_core.gettxn() 이 호출되고 txn id (T1) 을 획득하여 R1 의 txn 컬럼을 업데이트 합니다.
- sy$txlog 의 row R2 가 scn=INFINITY, tx = T1 로 mask set 은 S1 으로 Insert 됩니다
- Txn T1 이 커밋됩니다. 이 경우 S1 의 ora_rowscn 은 업데이트 되며, sy$txlog 의 ora_rowscn 의
새로운 row R2 가 txn 의 commit SCN 으로 업데이트 됩니다. R2 의 SCN column 은 여전히 INFINITY 입니다. - N seconds 이후 Job 이 수행됩니다. 이는 sy$txlog 의 SCN=INFINITY 인 값을 찾아 SCN=ora_rowscn 으로
업데이트 합니다.
ORACLE 사용 제약사항
- Insert, Update 를 대상으로 하며 Delete 에 대한 감지는 없습니다.
- CREATE TABLE 시 ROWDEPENDENCIES 를 명시해 생성해야 합니다.
DEFAULT 는 NOROWDEPENDENCIES 입니다.
ROWDEPENDENCIES 기능을 사용시 각 row 마다 6 바이트의 오버헤드를 가집니다. - 트리거가 (감시대상테이블 갯수) * 2 만큼 생성됩니다.
- 소스 테이블은 txn 이라는 추가 컬럼을 반드시 가져야 하며, 이는 인덱싱 되어야 합니다.
- 트리거는 BEFORE 동작으로 TX 의 시작과 함께 소스 테이블에 대한 UPDATE, sy$txlog 테이블에 대한 INSERT 가 발생합니다.
REF.
https://github.com/linkedin/databus/wiki/Connecting-Databus-to-an-Oracle-Database