WAL(Write-Ahead Log)은 데이터베이스에서 모든 변경 사항을 실제 데이터에 반영하기 전에 로그 파일에 먼저 기록하는 방식입니다. 이를 통해 시스템이 장애가 발생해도 로그를 사용해 데이터베이스를 복구할 수 있게 해줍니다. 쉽게 말해, WAL은 데이터베이스의 안전한 백업과 복구를 보장하기 위한 일종의 "변경 기록"이라고 할 수 있습니다.
RocksDB는 모든 업데이트를 메모리 내의 데이터 구조(memtable)와 디스크의 Write-Ahead Log(WAL)에 기록합니다. 이는 장애 발생 시 WAL을 사용하여 데이터를 복구할 수 있게 합니다. WAL은 모든 Column Family의 쓰기 로그를 포착하며, 각 Column Family를 독립적으로 설정하고 관리할 수 있습니다. WAL의 수명은 데이터베이스가 열릴 때 생성되어, Column Family가 플러시될 때 새로운 WAL로 대체됩니다. WAL의 크기는 설정에 따라 제한될 수 있으며, 플러시 및 압축 등의 옵션도 제공합니다.
DB::flush_wal
: WAL을 강제로 플러시(디스크에 기록)하는 메서드입니다. 수동으로 WAL을 플러시하고 싶을 때 사용됩니다.
DB::put
: 데이터를 쓰면서 WAL에도 기록을 남깁니다. 기본적으로 모든 쓰기 작업은 WAL에 기록됩니다.
DB::open_with_ttl
: WAL 파일이 일정 시간이 지나면 자동으로 삭제되도록 설정할 수 있습니다.
DBOptions::manual_wal_flush
: WAL 플러시를 자동이 아닌 수동으로 설정할 수 있는 옵션입니다.
DBOptions::wal_dir
: WAL 파일을 저장할 디렉터리를 지정할 수 있습니다.
WriteOptions::disable_wal
: WAL 기록을 비활성화하여 성능을 높이되, 데이터 무결성에 대한 보장을 포기할 수 있습니다.
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();
}