이미지 출처

Leveled Compaction (Tiered + Leveled Compaction) Policy

  • Leveled CompactionRocksDB 의 LSM Tree 에 대한 Compaction Policy 이다.
  • Compaction 의 가장 큰 목적은
    1. 각 level 이 각자의 size limit 을 넘지 않도록 조절해 주고
    2. 각 level 이 sorted run 상태, 즉 SST 간에 중복된 key 혹은 범위가 겹치는 key 가 없도록 유지시켜 빠른 search 와 용량 최적화를 보장해주는 것이다.
  • 그럼 이제 구체적인 작동 과정을 살펴보자.

과정

  • 위에서 compaction 의 목적이 size limit 을 준수하기 위한 것이라고 했으니까, size limit 이 넘었을 때의 상황을 예로 들어 compaction 이 어떻게 수행되는 것인지 알아보자.
  • 위와 같이 size limit 을 넘어가게 되면, 하나 이상의 SST 를 골라 다음 level 로 내려보낸다.
  • 내려보낼 때는 다음과 같은 두 경우가 있을 수 있다.
    1. 우선 다음 level 에 아무런 SST 도 없을 때에는, 즉 현재 level 이 bottom level 이었을 경우에는, 새로 level 을 생성하고 그냥 SST 를 내려보내기만 한다.
    2. 하지만 다음 level 에 SST 가 있을 때에는, 다음 level 의 SST 들 중 key 범위가 겹치는 SST 들과 Merge 하게 된다.

Merge

  • 위에서 설명한 compaction 의 목적 두번째: level 을 sorted run 상태로 만들기 위해 merge 작업이 수행된다.
  • 이름부터 merge 이듯이, 여기서는 merge sort 를 사용한다.
    • 어차피 각 SST 들이 정렬되어 있기 때문에 merge sort 로 하면 으로 완수할 수 있기 때문.
    • 즉, two-pointer 로 해당 SST 들을 쭉 스캔하며 하나의 stream 으로 만들고, 그것을 여러개의 SST 로 잘라 새로 저장하는 하게 된다.
    • 다른 문서들 (Merge Sort, Merging Sorted Runs) 에서도 여러번 설명했기에 여기서는 더 설명 안해도 되겠지?
  • Merge 의 target 이 된 SST 는 전부 삭제되고, merge 의 결과로 나온 SST 들이 해당 level 에 새로 생성된다.
  • 이때, 해당 level 의 size limit 을 초과하지 않는다면 그냥 생성되고 끝나지만
    • Merge 의 결과로 또 해당 level 에 size limit 을 초과할 수도 있다. 이때에는 또 compaction 이 연쇄적으로 일어나게 된다.

Compaction Policy

Compaction 을 언제 할까?

  • 위 예시처럼, level size limit 을 초과했을 때 compaction 이 수행되기도 하지만, 다음과 같은 상황에서도 compaction 이 수행될 수 있다.

SST 는 어떻게 선택할까?

  • 돌라돌라 골림판~

Level 은 어떻게 선택할까?

  • 이게 뭔소린가 싶을 수 있는데,
  • 여러개의 level 이 size limit 을 넘어 compaction 을 할 level 을 선택해야 할 상황이 생기기도 한다.
  • 이때는 그럼 다음과 같은 방식으로 level 을 선택한다.