3. Write-Ahead Logging

Tasker_Jang·2024년 8월 31일
0

1) Write-Ahead Log란 무엇인가?

WAL(Write-Ahead Log)은 데이터베이스에서 모든 변경 사항을 실제 데이터에 반영하기 전에 로그 파일에 먼저 기록하는 방식입니다. 이를 통해 시스템이 장애가 발생해도 로그를 사용해 데이터베이스를 복구할 수 있게 해줍니다. 쉽게 말해, WAL은 데이터베이스의 안전한 백업과 복구를 보장하기 위한 일종의 "변경 기록"이라고 할 수 있습니다.

RocksDB는 모든 업데이트를 메모리 내의 데이터 구조(memtable)와 디스크의 Write-Ahead Log(WAL)에 기록합니다. 이는 장애 발생 시 WAL을 사용하여 데이터를 복구할 수 있게 합니다. WAL은 모든 Column Family의 쓰기 로그를 포착하며, 각 Column Family를 독립적으로 설정하고 관리할 수 있습니다. WAL의 수명은 데이터베이스가 열릴 때 생성되어, Column Family가 플러시될 때 새로운 WAL로 대체됩니다. WAL의 크기는 설정에 따라 제한될 수 있으며, 플러시 및 압축 등의 옵션도 제공합니다.

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

  1. DB::flush_wal: WAL을 강제로 플러시(디스크에 기록)하는 메서드입니다. 수동으로 WAL을 플러시하고 싶을 때 사용됩니다.

  2. DB::put: 데이터를 쓰면서 WAL에도 기록을 남깁니다. 기본적으로 모든 쓰기 작업은 WAL에 기록됩니다.

  3. DB::open_with_ttl: WAL 파일이 일정 시간이 지나면 자동으로 삭제되도록 설정할 수 있습니다.

  4. DBOptions::manual_wal_flush: WAL 플러시를 자동이 아닌 수동으로 설정할 수 있는 옵션입니다.

  5. DBOptions::wal_dir: WAL 파일을 저장할 디렉터리를 지정할 수 있습니다.

  6. WriteOptions::disable_wal: WAL 기록을 비활성화하여 성능을 높이되, 데이터 무결성에 대한 보장을 포기할 수 있습니다.

3) 예제 코드

use rocksdb::{DB, Options, ColumnFamilyDescriptor, WriteOptions, FlushOptions};
use std::path::Path;

fn main() {
    // DB 경로 설정
    let path = Path::new("testdb");

    // DB 옵션 설정
    let mut opts = Options::default();
    opts.create_if_missing(true);

    // Column Families 설정
    let cf_descriptors = vec![
        ColumnFamilyDescriptor::new("default", Options::default()),
        ColumnFamilyDescriptor::new("new_cf", Options::default()),
    ];

    // DB 열기
    let db = DB::open_cf_descriptors(&opts, path, cf_descriptors).unwrap();

    // Column Family 핸들 얻기
    let cf_handle_default = db.cf_handle("default").unwrap();
    let cf_handle_new = db.cf_handle("new_cf").unwrap();

    // 데이터 추가
    db.put_cf(cf_handle_new, b"key1", b"value1").unwrap();
    db.put_cf(cf_handle_default, b"key2", b"value2").unwrap();

    // Column Family Flush
    db.flush_cf(cf_handle_new).unwrap();

    // 새로운 데이터 추가
    db.put_cf(cf_handle_new, b"key3", b"value3").unwrap();
    db.put_cf(cf_handle_default, b"key4", b"value4").unwrap();

    // Flush 후의 WAL 관리
    db.flush_cf(cf_handle_default).unwrap();
}
profile
터널을 지나고 있을 뿐, 길은 여전히 열려 있다.

0개의 댓글