본문 바로가기

TECH DOC

LinkedIn Databus

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 로 초기화한다.
  • 백그라운드에서 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