Compaction Strategy (CS)1
Cassandra 내부의 GC 작업을 위한 Strategy를 의미하며 Cassandra의 몇 가지 Strategy 중 선택할 수 있다.
workload에 맞는 compaction strategy를 선택하는 것만으로도 query와 compaction 성능 모두 챙길 수 있다.
Size Tiered (STCS)
write-intensive workloads에 적절한 cassandra의 default Compaction Strategy.
동작 방식
STCS는 SSTable의 size와 count를 기준으로 compaction을 진행한다.
- 유사한 size의 SSTable을 set number(default: 4)까지 갖게 되는 경우 compaction trigger 된다.
- SSTable을 하나의 큰 SSTable로 merge 된다.
- 필요한 경우 SSTable이 커지면서 더 큰 SSTable로 merge 된다.
위와 같은 동작 방식으로 한 순간에는 다양한 사이즈의 SSTable이 존재할 수 있다.
특징
- write intensive workload에 적절하다.
- 혹은 다른 적절한 CS가 없는 경우 무난한 선택지이다.
- merge-by-size 프로세스가 data를 grouping 하지 않으므로 여러 SSTable로 특정 row가 퍼져있을 수 있어 read 성능이 떨어질 수밖에 없다.
- size를 기준으로 compacdtion이 동작하여 data 삭제가 발생해도 실제 data compaction이 예상대로 되지 않을 수 있다.
- compaction 과정 중 old와 new를 위한 space가 동시에 필요하며 가장 큰 SSTable의 size가 커짐에 따라 disk space가 더 많이 필요하다.
- 평상 시의 I/O, CPU는 LCS 보다 좋다.
- 위와 같은 이유로 HDD 사용에 LCS 보다 적합하다.
- 하나의 SSTable의 크기가 커서 compaction 순간의 I/O, CPU는 LCS 보다 더 많이 필요하다. 우리 회사는 이 이유로 CPU spike로 인해 장애를 겪었다.
Leveled (LCS)
Size Tiered의 읽기 성능 이슈를 보완하기 위한 Compaction Strategy.
동작 방식
LCS는 SSTable을 Level로 구분한다.
각 Level은 고정된 size limit을 가지며 limit이 초과되면 compaction이 trigger 된다.
- Memtable이 Flush 되면 L0 (first level)의 SSTable에 쓰인다.
- compaction이 발생하면 L0의 SSTable들은 L1의 SSTable들과 merge 된다.
- 필요한 경우 상위 level로 compaction이 전파된다.
참고할 점은 L1 이후의 level에서는 같은 level 사이의 다른 SSTables과의 non-overlapping을 보장한다. (L0에선 보장되지 않음)
- 따라서 read operation이 발생할 때 level 당 하나의 SSTable만 보면 된다.
특징
- 읽기 성능을 최적화 하기 때문에 read heavy workload 혹은 lots of updates(or delete) workload에 적절하다.
- 순수한 시계열 데이터에는 적절하지 않다.
- write 위주의 workload에 적절하지 않다.
- STCS 보다 disk를 조금 사용한다. (대략 10% 사용)
- 작은 크기의 SSTable을 많이 생성하고, 데이터의 중복 제거와 정렬을 위한 compaction이 필수적이어서 I/O와 CPU를 많이 사용한다.
- HDD 같은 성능이 떨어지는 storage에 적합하지 않다.
Time Window (TWCS)
TTL되고 대부분 변경되지 않는 time series data를 위해 디자인된 Compaction Strategy.
동작 방식
TWCS는 time window로 구분된다.
각 SSTable은 time window로 구분되어 효율적으로 compaction.
- 일련의 period와 관련된 time window를 갖는다.
- Memtable이 Flush 되면 SSTable에 쓰인다.
- time window 기간 동안 flush된 SSTable 들이 생긴다.
- active time window가 지난 경우 time window 기간 내의 SSTable을 STCS를 통해 압축해서 하나의 Large SSTable로 compaction 한다.
- compaction된 SSTable은 maximum timestamp를 갖는다.
특징
- SSTable이 time window에 따라 나뉘어지며 expire 또한 시간에 따라 drop 할 수 있다.
- 시간만 보고 SSTable을 통채로 drop 하므로 STCS나 LCS보다 disk space 회수가 안정적이고 효율적이다.
- timw window period 내에 한 번의 major compaction만 발생하여 compaction이 효율적이다.
- 특정 period에 데이터가 몰릴 경우 성능 저하가 발생할 수 있다.
Unified (UCS)
read-heavy, write-heavy, read-write, time-series 등 대부분의 workload에서 추천된다.
- There is no need to use legacy compaction strategies, because UCS can be configured to behave like any of them.
- cassandra 5.0에서 추가 되었다.
동작 방식
UCS는 shard 단위로 compaction이 진행된다.
- shard 내의 일정 개수 이상의 SSTable이 생기면 compaction
- 각 level 별 전략에 따라 다르게 수행
- Leveled: LCS 처럼 L0의 데이터가 L1으로 compaction
- Tiered: STCS 처럼 일정 개수까지 SSTable을 쌓음
특징
- 다른 모든 CS들의 장점을 결합하여 최적화했다.
- 따라서 다양한 워크로드(사실상 모든 워크로드)에서 효율적이다.
- workload에 따라 내부에서 write가 많아지면 Tiered, read가 많아지면 Tiered로 전환한다.
- SSTable을 shard로 나눠서 관리하여 각 shard가 독립적(병렬적)으로 compaction 가능하고 효율적으로 compaction 가능하다.
- LCS는 level과 level별로 token이 정렬된 구조라면, UCS는 shard 별로 level이 나뉜 grid 구조에 가깝기 때문에 shard 별 compaction이 가능한 구조.
- UCS는 실행 중 다른 CS로 동적으로 전환이 가능하다.
- 다양한 전략으로 최적화를 위한 튜닝이 필요하다.
-
Compaction Strategy에서 각 Compaction Strategy에 대한 공식 문서 참고 ↩