피드로 돌아가기
I Built a Tiny Database in Go to Understand How Real Ones Work
Dev.toDev.to
Database

WAL과 Snapshot 기반의 Crash-consistent KV 스토리지 설계

I Built a Tiny Database in Go to Understand How Real Ones Work

Yussuf Ajao2026년 5월 1일8intermediate

Context

단순 메모리 맵 기반 저장소의 프로세스 종료 시 데이터 유실 문제 해결 필요. 쓰기 작업 도중 크래시가 발생해도 디스크 상의 데이터 일관성을 보장하는 Storage Engine 설계에 집중.

Technical Solution

  • Write-Ahead Log(WAL)를 메모리 업데이트 전 단계에 배치하여 데이터 유실 방지를 위한 불변성 유지
  • Record 단위 CRC32 Checksum 도입을 통한 Torn Write 감지 및 손상된 데이터 제외 복구 프로세스 구축
  • fsync 빈도에 따른 SyncAlways, SyncPeriodic, SyncNone 세 가지 Durability Policy로 성능과 안정성 트레이드오프 제공
  • Snapshot.tmp 생성 후 Atomic Rename 방식을 통한 원자적 상태 저장으로 불완전한 스냅샷 생성 방지
  • MaxWALSizeBytes 임계치 기반의 WAL Compaction을 통한 스타트업 시 Replay 시간 최적화
  • internal/engine과 Transport 계층을 분리한 Adapter 구조 설계로 비즈니스 로직과 인터페이스 간 결합도 제거

- 쓰기 작업 시 '로그 기록 후 메모리 반영' 순서를 엄격히 준수하고 있는지 검토 - 파일 쓰기 작업 시 원자적 교체(Write-then-Rename) 패턴을 적용하여 파일 손상 가능성 차단 - 시스템 요구사항에 맞춰 fsync 호출 주기를 조정하여 Throughput과 Durability 사이의 균형 설정 - 복구 시나리오에서 손상된 데이터(Torn Write)를 처리하는 정교한 검증 로직(Checksum 등) 설계

원문 읽기