Iceberg 스냅샷과 스냅샷 레퍼런스
Iceberg 스냅샷과 스냅샷 레퍼런스
Iceberg에서 스냅샷(snapshot)은 어떤 시점의 테이블 상태를 뜻해요. 전체 데이터 파일 집합을 포함하고, 커밋이 성공할 때마다 스냅샷이 하나씩 쌓여요. 이 스냅샷 구조 덕분에 타임트래블과 증분 읽기가 가능해지고, 스냅샷 레퍼런스로 브랜치·태그 같은 개념도 다룰 수 있어요.
본문
스냅샷 (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 |
스냅샷 변경을 요약한 문자열 맵. operation을 required 필드로 포함해요. |
| 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 속성으로 테이블 전체와 스냅샷 레퍼런스 양쪽에 설정할 수 있어요.
스냅샷을 만료할 때 테이블과 스냅샷 레퍼런스의 보존 정책은 다음과 같이 평가돼요:
- 빈 "유지할 스냅샷" 집합으로 시작
max-ref-age-ms보다 오래된 스냅샷을 참조하는 refs(main제외)를 제거- 각 브랜치와 태그에 대해, 참조된 스냅샷을 유지 집합에 추가
- 각 브랜치에 대해, 다음 조건에 이를 때까지 그 조상들을 유지 집합에 추가:
- 스냅샷이
max-snapshot-age-ms보다 오래됨, AND - 스냅샷이 브랜치의 처음
min-snapshots-to-keep안에 들지 않음 (브랜치의 참조 스냅샷 포함)
- 스냅샷이
- 유지할 스냅샷 집합에 없는 스냅샷을 만료