Iceberg 스냅샷과 스냅샷 레퍼런스

Iceberg 스냅샷과 스냅샷 레퍼런스

Iceberg에서 스냅샷(snapshot)은 어떤 시점의 테이블 상태를 뜻해요. 전체 데이터 파일 집합을 포함하고, 커밋이 성공할 때마다 스냅샷이 하나씩 쌓여요. 이 스냅샷 구조 덕분에 타임트래블과 증분 읽기가 가능해지고, 스냅샷 레퍼런스로 브랜치·태그 같은 개념도 다룰 수 있어요.

출처: Apache Iceberg™ Spec — Snapshots

본문

스냅샷 (Snapshots)

스냅샷은 다음 필드로 구성돼요:

v1 v2 v3 필드 설명
required required required snapshot-id 고유한 long ID
optional optional optional parent-snapshot-id 이 스냅샷의 부모 스냅샷 ID. 부모가 없는 스냅샷이면 생략돼요.
required required sequence-number 테이블 변경 순서를 추적하는 단조 증가 long
required required required timestamp-ms 스냅샷이 만들어진 시각. 가비지 컬렉션과 테이블 검사에 사용돼요.
optional required required manifest-list 추가 메타데이터와 함께 매니페스트 파일을 추적하는 이 스냅샷의 매니페스트 리스트 위치
optional manifests 매니페스트 파일 위치 목록. manifest-list가 있으면 생략해야 해요.
optional required required summary 스냅샷 변경을 요약한 문자열 맵. operationrequired 필드로 포함해요.
optional optional optional schema-id 스냅샷이 만들어질 당시 테이블의 현재 스키마 ID
required first-row-id 첫 매니페스트의 첫 데이터 파일 첫 행에 부여된 첫 _row_id
required added-rows 행 id가 부여된 행 수의 상한
optional key-id 매니페스트 리스트 키 메타데이터를 암호화하는 암호화 키의 ID

스냅샷 요약의 operation 필드는 스냅샷 만료 같은 일부 연산에서 처리할 스냅샷을 건너뛰는 데 사용돼요. 가능한 operation 값은:

  • append — 데이터 파일만 추가되고 제거된 파일은 없음.
  • replace — 테이블 데이터를 바꾸지 않고 데이터·delete 파일이 추가·제거됨. 즉 컴팩션, 데이터 파일 포맷 변경, 데이터 파일 재배치.
  • overwrite — 논리적 덮어쓰기 연산에서 데이터·delete 파일이 추가·제거됨.
  • delete — 데이터 파일이 제거되어 내용이 논리적으로 삭제되고/나서 행을 삭제하는 delete 파일이 추가됨.

스냅샷의 데이터·delete 파일은 여러 매니페스트에 저장될 수 있어요. 이로써:

  • append가 기존 매니페스트를 재작성·추가해 새 레코드를 넣는 대신 새 매니페스트를 추가해 쓰는 데이터를 최소화할 수 있어요. 이걸 "fast append"라고 불러요.
  • 테이블이 여러 파티션 스펙을 쓸 수 있어요. 데이터 볼륨이 변하면 테이블의 파티션 설정이 진화할 수 있죠. 각 매니페스트는 단일 파티션 스펙을 쓰고, 파티션 필터가 데이터 술어에서 유도되므로 쿼리는 바뀔 필요가 없어요.
  • 큰 테이블을 여러 매니페스트로 나눠 구현이 잡 계획을 병렬화하거나 매니페스트 재작성 비용을 줄일 수 있어요.

스냅샷의 매니페스트는 매니페스트 리스트가 추적해요. 유효한 스냅샷은 테이블 메타데이터에 목록으로 저장돼요.

스냅샷 레퍼런스 (Snapshot References)

Iceberg 테이블은 스냅샷 레퍼런스를 사용해 **브랜치(branch)와 태그(tag)**를 추적해요. 태그는 개별 스냅샷에 대한 라벨이고, 브랜치는 가변적(mutable) 이름 참조로, 커밋 충돌 해결·재시도 절차를 통해 브랜치가 참조하는 스냅샷으로 새 스냅샷을 커밋해 업데이트할 수 있어요.

스냅샷 레퍼런스 객체는 참조의 스냅샷 ID, 참조 타입, 스냅샷 보존 정책을 포함한 모든 정보를 기록해요.

v1 v2 and v3 필드 이름 타입 설명
required required snapshot-id long 참조의 스냅샷 ID. 태그된 스냅샷 또는 브랜치의 최신 스냅샷.
required required type string 참조 타입, tag 또는 branch
optional optional min-snapshots-to-keep int branch 타입 전용. 스냅샷 만료 시 브랜치에 유지할 최소 스냅샷 수(양수). 기본값은 테이블 속성 history.expire.min-snapshots-to-keep.
optional optional max-snapshot-age-ms long branch 타입 전용. 만료 시 최신 스냅샷을 포함해 유지할 스냅샷 최대 나이(양수). 기본값은 history.expire.max-snapshot-age-ms.
optional optional max-ref-age-ms long main 브랜치를 제외한 스냅샷 레퍼런스 전용. 스냅샷 만료 중 유지할 레퍼런스 최대 나이(양수). 기본값은 history.expire.max-ref-age-ms. main 브랜치는 절대 만료되지 않아요.

유효한 스냅샷 레퍼런스는 테이블 메타데이터의 refs 맵 값으로 저장돼요.

스냅샷 보존 정책 (Snapshot Retention Policy)

테이블 스냅샷은 만료(expire)되어 메타데이터에서 제거되고, 그래야 제거·교체된 데이터 파일을 물리적으로 삭제할 수 있어요. 스냅샷 만료 절차는 테이블 메타데이터에서 스냅샷을 제거하고 테이블의 보존 정책을 적용해요. 보존 정책은 min-snapshots-to-keep, max-snapshot-age-ms, max-ref-age-ms 속성으로 테이블 전체와 스냅샷 레퍼런스 양쪽에 설정할 수 있어요.

스냅샷을 만료할 때 테이블과 스냅샷 레퍼런스의 보존 정책은 다음과 같이 평가돼요:

  1. 빈 "유지할 스냅샷" 집합으로 시작
  2. max-ref-age-ms보다 오래된 스냅샷을 참조하는 refs(main 제외)를 제거
  3. 각 브랜치와 태그에 대해, 참조된 스냅샷을 유지 집합에 추가
  4. 각 브랜치에 대해, 다음 조건에 이를 때까지 그 조상들을 유지 집합에 추가:
    1. 스냅샷이 max-snapshot-age-ms보다 오래됨, AND
    2. 스냅샷이 브랜치의 처음 min-snapshots-to-keep 안에 들지 않음 (브랜치의 참조 스냅샷 포함)
  5. 유지할 스냅샷 집합에 없는 스냅샷을 만료

더 알아보기