Compaction은 RocksDB에서 데이터를 효율적으로 관리하기 위해 사용되는 과정으로, 데이터베이스에 있는 오래된 데이터와 새로운 데이터를 병합하여 불필요한 중복을 제거하고 저장 공간을 확보합니다. 이 과정을 통해 데이터베이스의 읽기 속도가 향상되고, 저장 공간이 최적화됩니다. 쉽게 말해서, Compaction은 데이터베이스를 "정리"하고 "압축"하여 더 빠르고 효율적으로 작동하도록 돕는 과정입니다.
compaction_style
, disable_auto_compactions
등의 옵션을 동적으로 변경할 수 있습니다.Leveled Compaction: 데이터가 여러 레벨로 구성되며, 각 레벨에서 일부 데이터가 정리되고 다음 레벨로 이동합니다. 읽기 성능이 좋고, 쓰기 증폭(write amplification)이 낮습니다.
CompactRange
: 특정 키 범위를 대상으로 레벨 간 데이터를 병합하여 읽기 성능을 높입니다.level0_file_num_compaction_trigger
: 레벨 0에 파일이 쌓일 때 자동으로 컴팩션이 트리거되는 파일 수를 지정합니다.Universal Compaction: 주로 쓰기 성능을 최적화하기 위해 사용되며, 여러 파일을 병합하여 큰 파일로 만듭니다. 다만, 읽기 증폭(read amplification)이 높아질 수 있습니다.
compaction_options_universal
: 크기 비율, 최소/최대 병합 파일 수 등의 옵션을 설정하여 병합 방법을 제어합니다.FIFO Compaction: 캐시와 같은 일시적인 데이터를 위해 설계된 스타일로, 오래된 데이터를 삭제하며 새로운 데이터를 추가합니다.
compaction_options_fifo
: FIFO 방식으로 오래된 파일을 삭제하며, 이를 위한 설정 옵션을 제공합니다.Manual Compaction: 사용자가 명시적으로 Compaction을 트리거할 수 있는 방식입니다.
CompactFiles
: 특정 파일들을 수동으로 컴팩션하는 메서드입니다.Subcompaction: 큰 Compaction 작업을 여러 작은 작업으로 분할하여 병렬로 처리하는 기능입니다.
max_subcompactions
: 한 번의 컴팩션 작업을 여러 개의 작은 작업으로 나눌 때 사용되는 옵션입니다.Choose Level Compaction Files: 특정 레벨에서 Compaction에 포함될 파일을 선택하는 알고리즘입니다.
Managing Disk Space Utilization: 디스크 공간 사용량을 최적화하는 여러 방법과 설정을 제공합니다.
max_compaction_bytes
: 한 번의 컴팩션에서 병합할 수 있는 최대 바이트 수를 제한하여 디스크 공간 활용을 관리합니다.Trivial Move Compaction: Compaction 시 일부 데이터를 단순히 옮겨서 추가적인 연산 없이 최적화하는 방법입니다.
Remote Compaction (Experimental): Compaction 작업을 원격 서버에서 수행하는 기능으로, 이는 실험적인 단계에 있습니다.
다음은 각 Compaction 스타일과 관련된 주요 메서드들에 대한 코드 예제입니다:
Leveled Compaction:
CompactRange
예제:let cf_handle = db.cf_handle("default").unwrap();
db.compact_range_cf(cf_handle, Some(b"start_key"), Some(b"end_key"));
level0_file_num_compaction_trigger
설정:let mut opts = Options::default();
opts.set_level0_file_num_compaction_trigger(4);
Universal Compaction:
compaction_options_universal
설정:let mut cf_opts = ColumnFamilyOptions::default();
cf_opts.set_compaction_style(rocksdb::DBCompactionStyle::Universal);
FIFO Compaction:
compaction_options_fifo
설정:let mut cf_opts = ColumnFamilyOptions::default();
let fifo_opts = rocksdb::FifoCompactionOptions::default();
cf_opts.set_fifo_compaction_options(fifo_opts);
Manual Compaction:
CompactFiles
예제:let files_to_compact = vec!["file1.sst", "file2.sst"];
db.compact_files(&files_to_compact, 1);
Subcompaction:
max_subcompactions
설정:let mut opts = Options::default();
opts.set_max_subcompactions(4);
Managing Disk Space Utilization:
max_compaction_bytes
설정:let mut cf_opts = ColumnFamilyOptions::default();
cf_opts.set_max_compaction_bytes(104857600); // 100 MB