6. Compaction

Tasker_Jang·2024년 8월 31일
0

1) Compaction이란 무엇인가?

Compaction은 RocksDB에서 데이터를 효율적으로 관리하기 위해 사용되는 과정으로, 데이터베이스에 있는 오래된 데이터와 새로운 데이터를 병합하여 불필요한 중복을 제거하고 저장 공간을 확보합니다. 이 과정을 통해 데이터베이스의 읽기 속도가 향상되고, 저장 공간이 최적화됩니다. 쉽게 말해서, Compaction은 데이터베이스를 "정리"하고 "압축"하여 더 빠르고 효율적으로 작동하도록 돕는 과정입니다.

2) Compaction을 다룰 수 있는 주요 메서드

  1. CompactRange: 특정 키 범위에 대해 수동으로 Compaction을 실행합니다.
  2. CompactFiles: 특정 SST 파일에 대해 Compaction을 실행합니다.
  3. SetOptions: compaction_style, disable_auto_compactions 등의 옵션을 동적으로 변경할 수 있습니다.
  4. PauseBackgroundWorkContinueBackgroundWork: 모든 백그라운드 작업(예: Compaction)을 일시 중지하거나 재개할 수 있습니다.

3) Compaction과 관련된 주요 스타일과 개념

  1. Leveled Compaction: 데이터가 여러 레벨로 구성되며, 각 레벨에서 일부 데이터가 정리되고 다음 레벨로 이동합니다. 읽기 성능이 좋고, 쓰기 증폭(write amplification)이 낮습니다.

    • CompactRange: 특정 키 범위를 대상으로 레벨 간 데이터를 병합하여 읽기 성능을 높입니다.
    • level0_file_num_compaction_trigger: 레벨 0에 파일이 쌓일 때 자동으로 컴팩션이 트리거되는 파일 수를 지정합니다.
  2. Universal Compaction: 주로 쓰기 성능을 최적화하기 위해 사용되며, 여러 파일을 병합하여 큰 파일로 만듭니다. 다만, 읽기 증폭(read amplification)이 높아질 수 있습니다.

    • compaction_options_universal: 크기 비율, 최소/최대 병합 파일 수 등의 옵션을 설정하여 병합 방법을 제어합니다.
  3. FIFO Compaction: 캐시와 같은 일시적인 데이터를 위해 설계된 스타일로, 오래된 데이터를 삭제하며 새로운 데이터를 추가합니다.

    • compaction_options_fifo: FIFO 방식으로 오래된 파일을 삭제하며, 이를 위한 설정 옵션을 제공합니다.
  4. Manual Compaction: 사용자가 명시적으로 Compaction을 트리거할 수 있는 방식입니다.

    • CompactFiles: 특정 파일들을 수동으로 컴팩션하는 메서드입니다.
  5. Subcompaction: 큰 Compaction 작업을 여러 작은 작업으로 분할하여 병렬로 처리하는 기능입니다.

    • max_subcompactions: 한 번의 컴팩션 작업을 여러 개의 작은 작업으로 나눌 때 사용되는 옵션입니다.
  6. Choose Level Compaction Files: 특정 레벨에서 Compaction에 포함될 파일을 선택하는 알고리즘입니다.

  7. Managing Disk Space Utilization: 디스크 공간 사용량을 최적화하는 여러 방법과 설정을 제공합니다.

    • max_compaction_bytes: 한 번의 컴팩션에서 병합할 수 있는 최대 바이트 수를 제한하여 디스크 공간 활용을 관리합니다.
  8. Trivial Move Compaction: Compaction 시 일부 데이터를 단순히 옮겨서 추가적인 연산 없이 최적화하는 방법입니다.

    • RocksDB는 일부 파일이 이미 정렬되어 있어 컴팩션 시 단순히 옮기는 것만으로도 성능을 최적화할 수 있습니다. 이 경우 추가적인 병합이 필요 없습니다.
  9. Remote Compaction (Experimental): Compaction 작업을 원격 서버에서 수행하는 기능으로, 이는 실험적인 단계에 있습니다.

4) 예제 코드

다음은 각 Compaction 스타일과 관련된 주요 메서드들에 대한 코드 예제입니다:

  1. 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);
  2. Universal Compaction:

    • compaction_options_universal 설정:
      let mut cf_opts = ColumnFamilyOptions::default();
      cf_opts.set_compaction_style(rocksdb::DBCompactionStyle::Universal);
  3. 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);
  4. Manual Compaction:

    • CompactFiles 예제:
      let files_to_compact = vec!["file1.sst", "file2.sst"];
      db.compact_files(&files_to_compact, 1);
  5. Subcompaction:

    • max_subcompactions 설정:
      let mut opts = Options::default();
      opts.set_max_subcompactions(4);
  6. Managing Disk Space Utilization:

    • max_compaction_bytes 설정:
      let mut cf_opts = ColumnFamilyOptions::default();
      cf_opts.set_max_compaction_bytes(104857600); // 100 MB
profile
터널을 지나고 있을 뿐, 길은 여전히 열려 있다.

0개의 댓글