-
RocksDB Leveled Compaction 알아보기Database/RocksDB 2024. 1. 10. 17:11728x90반응형
- 목차
들어가며.
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 가 발생합니다.
그리고 아래와 같이 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