Leveled Compaction Strategy

Leveled Compaction Strategy (LCS)

Leveled Compaction Strategy(LCS)는 읽기 집약적(read-heavy) 워크로드에서 권장되던 컴팩션 전략이에요. SSTable을 레벨(level) 단위로 관리해서 읽기 성능을 높이는 전략이에요. 다만 최근 버전에서는 대부분의 워크로드에 Unified Compaction Strategy(UCS)가 더 권장돼요.

출처: Leveled Compaction Strategy (LCS)

본문

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를 쓰세요. 다만 LCS는 STCS가 가진 읽기 성능 문제 중 일부를 해결하고, 쓰기 성능도 합리적으로 제공하므로 읽기 집약적 워크로드에 여전히 유용해요.

LCS는 일련의 레벨들로 동작하며, 각 레벨은 여러 SSTable을 담아요. 멤테이블(memtable)의 데이터가 플러시되면 SSTable이 첫 번째 레벨(L0)에 기록되는데, L0의 SSTable은 서로 겹치지 않는다는 보장이 없어요. LCS 컴팩션은 이 L0의 SSTable을 L1의 더 큰 SSTable과 병합해요. 각 레벨은 기본적으로 이전 레벨 크기의 10배예요. SSTable이 L1 이상에 기록되면 같은 레벨의 다른 SSTable과 겹치지 않는다는 것이 보장돼요. 그래서 읽기 연산이 어떤 행에 접근할 때 레벨당 단 하나의 SSTable만 보면 돼요.

컴팩션을 수행하려면 겹치는 모든 SSTable을 다음 레벨의 새 SSTable로 병합해요. L0 → L1 컴팩션에서는 대부분의 L0 SSTable이 파티션 전체 범위를 덮기 때문에, 거의 항상 모든 L1 SSTable을 포함해야 해요. LCS는 한 레벨에서 다음 레벨로 SSTable을 컴팩션하면서 정의된 SSTable 크기에 맞게 파티션을 기록해요. 게다가 각 레벨에는 정해진 크기가 있어서, 레벨이 크기 한도에 도달하면 컴팩션이 트리거돼요. 한 레벨에서 새 SSTable이 생성되면 다음 레벨의 컴팩션이 트리거되고, 설정에 따라 모든 레벨이 컴팩션될 때까지 이어져요.

L0에서 SSTable 읽기가 너무 많아지는 경우를 대비한 안전장치(failsafe)도 있어요. L0에 32개보다 많은 SSTable이 있으면 L0에서 STCS 컴팩션을 트리거해요. 이 컴팩션은 SSTable을 빠르게 L0에서 L1로 병합하고, 그곳에서 겹치지 않는 SSTable로 컴팩션해요.

LCS는 STCS만큼 디스크를 많이 쓰지 않아서 실행에 약 10%의 디스크만 필요하지만, IO와 CPU 사용이 더 집약적이에요. 읽기 집약적 워크로드의 지속적인 마이너 컴팩션에서는 컴팩션 양이 합리적인 수준이에요. 다만 쓰기 집약적 워크로드에서는 디스크 IO와 CPU 사용이 많이 늘어나므로 좋은 선택이 아니에요. LCS에서는 메이저 컴팩션도 권장되지 않아요.

Bootstrapping (부트스트랩)

부트스트랩 중에는 다른 노드에서 SSTable이 스트리밍돼요. 새 쓰기에서 멤테이블로 플러시되는 SSTable과 원격 노드에서 스트리밍되는 SSTable이 모두 많아지기 때문에, 새 노드의 L0에는 SSTable이 많이 쌓여요. 플러시와 스트리밍 SSTable의 충돌을 피하기 위해, 부트스트랩이 완료될 때까지 L0에서는 STCS만 실행돼요.

Starved sstables (기아 상태 SSTable)

레벨링이 최적이 아니면 LCS에 기아 상태(starved) SSTable이 생길 수 있어요. 낮은 레벨의 SSTable이 병합·컴팩션되지 않으면 높은 레벨의 SSTable이 버려져 컴팩션되지 못할 수 있어요. 예를 들어 이런 상황에서는 낮은 레벨이 툼스톤을 제거하지 못하게 될 수 있어요. 기아 상태 SSTable이 정의된 컴팩션 라운드 수 안에 해소되지 않으면 다른 컴팩션에 포함돼요. 일반적으로 사용자가 sstable_size 설정을 낮출 때 발생해요.

The SizeTieredCompactionStrategy is the default compaction strategy. Any other compaction strategy must be defined in the cassandra.yaml file.

STCS가 기본 컴팩션 전략이고, 다른 전략은 cassandra.yaml 파일에 정의해야 해요.

LCS options (LCS 옵션)

LCS 옵션은 테이블 옵션으로 설정해요. 주요 옵션은 다음과 같아요.

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
sstable_size_in_mb SSTable의 목표 크기. SSTable 크기는 이 값보다 작거나 같아야 하지만, 컴팩션 중 더 큰 SSTable이 생길 수도 있어요. 특정 파티션 키의 데이터가 비정상적으로 클 때 발생하며, Cassandra는 데이터를 두 SSTable로 나누지 않아요. Default: 160
fanout_size 레벨의 목표 크기가 이 fanout 배수만큼 증가해요. 이 옵션을 튜닝하면 공간 증폭(space amplification)을 줄일 수 있어요. Default: 10
single_sstable_uplevel 아래 레벨의 SSTable을 상위 레벨로 올릴 때 단일 SSTable 여부를 다루는 옵션이에요. Default: true

LCS는 시작 옵션 -Dcassandra.disable_stcs_in_l0=true도 지원하며, 이 옵션은 L0에서의 STCS를 비활성화해요.

더 알아보기 (Learn more)