ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RocksDB Leveled Compaction 알아보기
    Database/RocksDB 2024. 1. 10. 17:11
    728x90
    반응형

    - 목차

     

    들어가며.

    Leveled Compaction 은 RocksDB 의 Compaction 종류 중의 하나입니다.

    RocksDB 는 LSM-Tree 파일 구조를 취하기 때문에 SSTable 의 Compaction 은 중요한 기능 중의 하나입니다.

    이번 글에서는 Leveled Compaction 에 대해서 알아보는 시간을 가지려고 합니다.

     

    Level 이란 ?

    RocksDB 는 MemTable 과 SSTable 이라는 In-Memory Structure 와 On-Disk Structure 를 가집니다.

    Level 이라는 개념은 SSTable 에 적용되는데요.

    Level 은 SSTable 에 대하여 Merge 가 수행된 정도를 의미합니다.

    Level 0 부터 시작하여 Level n 까지 Level 의 범위가 확장되며,

    Level 0 의 SSTable1, SSTable2 는 Level 1 의 SSTable1 로 Merge 될 수 있습니다.

    아래의 이미지처럼 각 Level 마다 SSTable 파일이 존재하고,

    max_bytes_for_level_base 와 max_bytes_for_level_multiplier 설정을 통해

    각 Level 의 최대 허용 용량을 결정할 수 있습니다.

     

    만약 Level 0 의 SSTable 이 최대 용량을 초과하게 되면, 다음과 같은 방식으로 Merge 가 발생합니다.

    SSTable Merge Operation

     

     

    그리고 아래와 같이 Level 0 의 SSTable 3 과 Level 1 의 merged SSTable 1 이 남게 됩니다.

     

     

     

    Level 0.

    Level 0 은 다른 Level 상태와 다르게 MemTable 에 의해서 Flush 된 SSTable 들입니다.

    Level 1 과 그 이상의 Level 은 이전 Level 인 $ Level_{n-1} $ 에 의해서 $ Level_{n} $ 이 Compaction 되는 구조를 취합니다.

    아래의 그림은 MemTable 이 Flush 되어 Level 0 의 SSTable 이 되는 모습을 묘사합니다.

     

    MemTable 의 데이터 크기가 write_buffer_size 로 설정되는 MemTable 의 용량적인 한계치에 도달하게 되면,

    Active MemTable 은 ReadOnly MemTable 로 변경됩니다.

    그리고 본격적인 Flush 가 수행되죠.

    이 Flush 과정에서 Level 0 의 SSTable 이 생성됩니다.

    Level 0 의 SSTable 은 MemTable 에 의해서 Flush 되는 데이터들이기 때문에 Key 의 중복이 발생합니다.

    그래서 중복되는 Key 를 가지는 데이터들이 존재하게 됩니다.

    그 후에 Level 1 이상의 Compaction 과정에서 Key 의 중복 현상은 없어지게 됩니다.

     

    Level n.

    Level 1 이상의 SSTable 들은 Key Range 를 가지게 됩니다.

    아래 이미지처럼 각 SSTable 은 자신의 저장하는 Key 의 범위를 가지게 되며, 데이터가 샤딩되는 효과를 가집니다.

     

    이렇게 각각의 SSTable 이 관리하는 데이터의 범위가 지정됨으로써 데이터 조회 측면에서 효율성을 가집니다.

    조회하고자하는 Key 를 보관하는 SSTable 만을 탐색하기 때문에 탐색의 범위가 줄어듭니다.

     

     

    Amplification.

    Amplification 은 증폭을 뜻합니다.

    Compaction 이 누적되어 Level 의 깊이가 깊어질수록 높은 Level 이 수용하는 저장 용량이 증폭되어 갑니다.

    이는 RocksDB 설정과 관련되는데요.

    max_bytes_for_level_base 와 max_bytes_for_level_multiplier 에 의해서 저장 용량의 한계가 증폭됩니다.

     

    max_bytes_for_level_base 는 Level 0 가 허용하는 용량의 한계치입니다.

    그리고 max_bytes_for_level_multiplier 설정은 Level 이 높아질수록 max_bytes_for_level_base 과 곱해지는 계수입니다.

     

    만약 max_bytes_for_level_base 이 1Mb 이고, max_bytes_for_level_multiplier 이 10 인 경우의

    Amplification 은 아래와 같습니다.

    Level 0 : 1Mb
    Level 1 : 10Mb
    Level 2 : 100Mb
    Level 3 : 1Gb
    Level 4 : 10Gb
    Level 5 : 100Gb
    Level 6 : 1Tb
    ...

     

     

    반응형

    'Database > RocksDB' 카테고리의 다른 글

    RocksDB WAL (Write-Ahead Log) 알아보기  (2) 2024.01.10
    RocksDB Column Family 알아보기  (0) 2024.01.10
    RocksDB Architecture 알아보기 (LSM-tree)  (0) 2024.01.10
Designed by Tistory.