Change Data Capture

Change Data Capture (CDC) — 변경 데이터 캡처

Change Data Capture(CDC)는 특정 테이블을 아카이빙 대상으로 표시하고, CDC 로그의 디스크 사용량이 설정한 값에 도달하면 그 테이블에 대한 쓰기를 거부하는 메커니즘이에요. 테이블 변경 사항을 외부 시스템으로 전달하고 싶을 때 써요.

출처: Change Data Capture

본문

Overview (개요)

변경 데이터 캡처는 특정 테이블을 아카이빙용으로 표시하고, CDC 로그의 디스크 크기가 설정 가능한 값에 도달하면 그 테이블에 대한 쓰기를 거부하는 메커니즘이에요. 운영자는 테이블 속성 cdc=true를 설정해 테이블에 CDC를 활성화할 수 있어요(테이블 생성 시 또는 변경(alter) 시). CommitLogSegment가 생성되면 cassandra.yaml에 지정된 디렉터리에 그 세그먼트에 대한 하드 링크가 생성돼요. 세그먼트가 디스크에 fsync되면, 세그먼트 어디든 CDC 데이터가 있다면 <segment_name>_cdc.idx 파일도 함께 생성되고, 원본 세그먼트에서 디스크에 영속된 데이터 양의 정수 오프셋이 기록돼요. 최종 세그먼트 플러시 때 _cdc.idx 파일에 사람이 읽을 수 있는 "COMPLETED"라는 두 번째 줄이 추가되어, Cassandra가 그 파일에 대한 모든 처리를 완료했음을 나타내요.

우리가 인덱스 파일을 쓰는 이유는, 클라이언트가 메모리 매핑된 핸들에서 로그를 실시간으로 파싱하도록 유도하기보다는, 데이터가 아직 디스크에 영속되지 않은 커널 버퍼에 반영될 수 있기 때문이에요. _cdc.idx 파일에 나열된 오프셋까지만 파싱하면 영속된(durable) 데이터에 대한 CDC 데이터만 파싱한다는 것이 보장돼요.

드물게(예: 느린 디스크) 소비자가 _cdc.idx 파일에서 빈 값을 읽을 수도 있는데, 이는 파일을 먼저 자른(truncate) 다음 쓰는 방식으로 갱신되기 때문이에요. 이런 경우 소비자는 인덱스 파일 읽기를 다시 시도해야 해요.

허용되는 총 디스크 공간의 임계값이 yaml에 지정되며, 이 값에 도달하면 소비자가 지정된 cdc_raw 디렉터리에서 파일을 파싱·제거할 때까지 새로 할당된 CommitLogSegment가 CDC 데이터를 허용하지 않아요.

Configuration (구성)

Enabling or disabling CDC on a table (테이블에서 CDC 활성·비활성화)

CDC는 테이블 속성인 cdc를 통해 활성화·비활성화해요. 예를 들어:

CREATE TABLE foo (a int, b text, PRIMARY KEY(a)) WITH cdc=true;

ALTER TABLE foo WITH cdc=true;

ALTER TABLE foo WITH cdc=false;

cassandra.yaml parameters (cassandra.yaml 파라미터)

CDC에 사용할 수 있는 cassandra.yaml 옵션은 다음과 같아요.

  • cdc_enabled (default: false) — CDC 작업을 노드 전체에서 활성화하거나 비활성화해요.
  • cdc_raw_directory (default: $CASSANDRA_HOME/data/cdc_raw) — 모든 해당 멤테이블이 플러시된 후 CommitLogSegment가 이동할 대상 디렉터리예요.
  • cdc_total_space (default: 4096MiB와 볼륨 공간 1/8 중 작은 값) — CDC를 허용하는 모든 활성 CommitLogSegmentcdc_raw_directory의 모든 플러시된 CDC 세그먼트의 합으로 계산돼요.
  • cdc_free_space_check_interval (default: 250ms) — 용량에 도달하면 cdc_raw_directory가 차지하는 공간을 다시 계산하는 빈도를 제한해 CPU 사이클을 불필요하게 소모하지 않게 해요. 기본값은 초당 4회 확인이에요.

Reading CommitLogSegments (CommitLogSegment 읽기)

CommitLogReader.java를 사용하세요. 사용법은 꽤 직관적이며 다양한 시그니처를 쓸 수 있어요. 디스크에서 읽은 변형(mutation)을 처리하려면 CommitLogReadHandler를 구현하세요.

Warnings (주의사항)

어떤 형태의 소비(consumption) 프로세스도 없이 CDC를 활성화하지 마세요.

노드에 CDC를 켜고 테이블에도 CDC를 켜면, cdc_free_space_in_mb가 가득 차고, 어떤 소비 프로세스가 있어야 CDC가 활성화된 테이블에 대한 쓰기가 거부되지 않아요.

더 알아보기 (Learn more)