Size Tiered Compaction Strategy
Size Tiered Compaction Strategy (STCS)
Size Tiered Compaction Strategy(STCS)는 쓰기 집약적(write-intensive) 워크로드에 권장되던 컴팩션 전략이에요. 전통적으로 기본 전략으로 쓰였으며, 비슷한 크기의 SSTable이 모이면 병합해 더 큰 SSTable로 만드는 방식이에요.
본문
The Unified Compaction Strategy (UCS) is the recommended compaction strategy for most workloads starting with
{cass-50}. If you are creating new tables, use this strategy.
5.0(Cassandra 5.0)부터는 대부분의 워크로드에 UCS가 권장돼요. 새 테이블을 만들 때는 UCS를 쓰세요. STCS는 쓰기 집약적 워크로드에 권장되었고 레거시 권장 전략이에요. 다른 전략이 지정되지 않으면 기본 컴팩션 전략으로 동작해요.
STCS는 Cassandra가 일정 개수(기본: 4)의 비슷한 크기 SSTable을 모았을 때 컴팩션을 시작해요. STCS는 이 SSTable들을 하나의 더 큰 SSTable로 병합해요. 이렇게 큰 SSTable이 모이면 다시 더 큰 SSTable로 병합해요. 어느 시점이든 크기가 다양한 여러 SSTable이 존재하게 돼요.
STCS는 쓰기 집약적 워크로드를 컴팩션하는 데는 잘 동작하지만, 크기 기반 병합이 데이터를 행 단위로 묶지 않기 때문에 읽기는 느려져요. 이 때문에 특정 행의 버전 여러 개가 많은 SSTable에 흩어져 있을 가능성이 높아져요. 또한 STCS는 컴팩션 트리거가 SSTable 크기라서 삭제된 데이터를 예측 가능하게 제거하지 못해요. SSTable이 정기적으로 병합·오래된 데이터 제거가 일어날 만큼 빨리 커지지 않을 수 있기 때문이에요.
대부분의 STCS 컴팩션은 몇 개의 SSTable을 하나로 병합하는 마이너 컴팩션(minor compaction)이에요. 반대로 STCS로 메이저 컴팩션을 실행하면 컴팩션 동안 데이터 디렉터리마다 SSTable이 두 개(복구된 데이터용 1개, 미복구 데이터용 1개) 존재하게 돼요. 가장 큰 SSTable이 커질수록, STCS 컴팩션 중 새·옛 SSTable이 동시에 필요로 하는 디스크 공간이 노드의 일반적인 디스크 공간을 초과할 수 있어요. 이 현상을 공간 증폭(space amplification)이라고 하며, SSTable 크기가 커지는 문제이자 클러스터의 컴팩션 능력을 넘어서는 문제예요. STCS에서는 메이저 컴팩션이 권장되지 않아요.
STCS는 어떤 SSTable을 병합할지 결정하기 위해 SSTable 평균 크기 계산에 의존해요. 이 과정을 버케팅(bucketing)이라고 해요. 다음 옵션으로 평균 크기를 기준으로 SSTable이 묶일 버킷을 계산해요. 버케팅은 크기가 평균보다 50% 또는 150% 이상 차이나는 SSTable을 그룹으로 묶어요. 다시 말하면, 버케팅은 크기가 [average-size × bucket_low]와 [average-size × bucket_high] 사이인 SSTable을 그룹으로 묶는 거예요.
The SizeTieredCompactionStrategy is the default compaction strategy. Any other compaction strategy must be defined in the cassandra.yaml file.
STCS가 기본 컴팩션 전략이고, 다른 전략은 cassandra.yaml 파일에 정의해야 해요.
STCS options (STCS 옵션)
STCS 옵션은 테이블 단위로 테이블 옵션으로 설정해요. 테이블의 min_threshold 옵션이 마이너 컴팩션을 트리거하는 핵심 값이에요. 마이너 컴팩션은 키스페이스의 모든 테이블을 다루지 않아요.
| Subproperty | Description |
|---|---|
enabled |
백그라운드 컴팩션을 활성화해요. Default value: true |
tombstone_compaction_interval |
SSTable 생성 후 Cassandra가 툼스톤 컴팩션을 고려하기까지의 최소 시간(초). 테이블이 tombstone_threshold 비율을 초과하면 해당 SSTable이 툼스톤 컴팩션 대상이 돼요. Default value: 86400 |
tombstone_threshold |
모든 컬럼 중 가비지 컬렉션 가능한 툼스톤의 비율. 이 한도를 초과하면 Cassandra가 해당 테이블만 따로 컴팩션해 툼스톤을 정리해요. Default value: 0.2 |
unchecked_tombstone_compaction |
true로 설정하면 대상 테이블 사전 검사 없이 툼스톤 컴팩션을 실행할 수 있어요. 사전 검사가 없어도 Cassandra는 툼스톤을 안전하게 제거할 수 있는 SSTable인지 확인해요. Default value: false |
log_all |
전체 클러스터에 고급 로깅을 활성화해요. Default value: false |
max_threshold |
마이너 컴팩션에 허용되는 최대 SSTable 수. Default value: 32 |
min_threshold |
마이너 컴팩션을 트리거하는 최소 SSTable 수. Default value: 4 |
bucket_high |
SSTable 크기가 그 버킷 평균 크기의 150% 미만이면 버킷에 추가돼요. 예를 들어 SSTable 크기가 13 MB이고 버킷 평균이 10 MB라면, 그 SSTable은 그 버킷에 추가되고 새로운 평균이 계산돼요. Default value: 1.5 |
bucket_low |
SSTable 크기가 그 버킷 평균 크기의 50%보다 크면 버킷에 추가돼요. 예를 들어 SSTable 크기가 6 MB이고 버킷 평균이 10 MB라면, 그 SSTable은 그 버킷에 추가되고 새로운 평균이 계산돼요. Default value: 0.5 |
min_sstable_size |
이 값보다 작은 SSTable은 평균 크기가 이 설정보다 작은 하나의 버킷으로 묶여요. Default value: 50MB |
only_purge_repaired_tombstones |
true로 설정하면 복구된(repaired) SSTable에서만 툼스톤을 정리해요. 목적은 gc_grace_seconds 안에 복구가 실행되지 않으면 데이터가 부활하는 것을 막는 거예요. 오랫동안 복구를 실행하지 않으면 Cassandra가 모든 툼스톤을 유지하며, 이는 문제를 일으킬 수 있어요. Default value: false |
더 알아보기 (Learn more)
- Leveled Compaction Strategy (LCS) — 레벨드 컴팩션 전략
- Time Window Compaction Strategy (TWCS) — 시간 윈도 컴팩션 전략
- Compaction 개요 — 컴팩션 동작 원리