Litestream VFS

1 month ago 16

  • Litestream VFS는 SQLite 데이터베이스를 객체 스토리지(S3 등) 에서 직접 읽고 쿼리할 수 있게 하는 플러그인 형태의 확장 기능
  • 전체 데이터베이스를 다운로드하지 않고도 원격 백업 파일에서 즉시 쿼리시점 복구(Point-in-Time Recovery, PITR) 수행 가능
  • 내부적으로 LTX 포맷을 사용해 변경된 페이지 집합을 효율적으로 관리하고, 중복 페이지를 건너뛰는 압축(compaction) 으로 복구 속도를 향상
  • SQLite의 VFS 인터페이스를 활용해 읽기 동작만 가로채며, 쓰기 처리는 기존 Litestream 프로세스가 담당
  • 초 단위 백업과 인덱스 갱신을 통해 거의 실시간에 가까운 복제본을 제공, 클라우드 환경에서 빠른 쿼리 실행을 지원

Litestream VFS 개요

  • Litestream VFS는 SQLite가 객체 스토리지 URL을 직접 데이터 소스로 사용할 수 있게 하는 기능
    • SQLite 셸에서 .load litestream.so 와 .open file:///my.db?vfs=litestream 명령으로 활성화
    • 이후 S3에 저장된 백업 파일을 기반으로 쿼리 실행 가능
  • 전체 데이터베이스를 다운로드하지 않고도 원격 백업에서 직접 쿼리 수행 가능
    • 예시에서는 SELECT * FROM sandwich_ratings 쿼리를 통해 S3에 저장된 데이터 일부를 즉시 조회

시점 복구(PITR) 기능

  • PRAGMA litestream_time = '5 minutes ago'; 명령으로 특정 시점의 데이터 상태를 조회 가능
    • 상대적 시간(5 minutes ago) 또는 절대적 시간(2000-01-01T00:00:00Z) 지정 가능
  • 이를 통해 즉시 시점 복구(Point-in-Time Recovery) 를 SQL 수준에서 수행
    • 예시에서는 잘못된 UPDATE 실행 후, 5분 전 상태로 되돌려 정상 데이터 확인

LTX 포맷과 데이터 압축

  • Litestream v0.5LTX(Litestream Transaction eXchange) 포맷을 통합
    • 이전 버전은 SQLite 페이지 전체를 전송했으나, LTX는 순서가 있는 페이지 집합만 전송
  • LTX의 핵심은 “compaction” 기능으로, 복구 시 최신 버전의 페이지만 선택
    • 예시: 1 2 3 5 3 5 4 5 5 중에서 가장 오른쪽의 5, 4, 3, 2, 1만 사용
  • LTX는 전체 데이터베이스뿐 아니라 LTX 파일 집합 간에도 압축 가능, 이를 통해 PITR 복구가 가능해짐
  • LTX 파일의 트레일러(trailer) 에는 각 페이지의 오프셋 인덱스가 포함되어 있어,
    • 전체 파일을 다운로드하지 않고 S3 Range 요청으로 필요한 페이지만 읽을 수 있음

VFS 구현 방식

  • SQLite의 VFS(Virtual File System) 인터페이스를 이용해 Litestream VFS 구현
    • VFS는 SQLite의 OS 접근 계층을 추상화하는 플러그인 구조
  • Litestream VFS는 읽기(Read) 동작만 처리하며, 쓰기(Write) 는 기존 Litestream 프로세스가 담당
  • SQLite가 페이지를 읽을 때, VFS는 요청된 바이트 오프셋 대신 페이지 인덱스 기반 매핑을 수행
    • 인덱스에서 파일명, 실제 오프셋, 페이지 크기를 찾아 S3 API의 Range 헤더로 해당 블록만 다운로드
  • LRU 캐시를 구현해 자주 접근되는 “핫 페이지”를 메모리에 유지, S3 호출 횟수를 최소화

실시간 복제 및 성능

  • Litestream은 초당 한 번씩 L0 레벨 백업을 수행
    • VFS는 S3 경로를 주기적으로 폴링하여 인덱스를 점진적으로 갱신
    • 결과적으로 거의 실시간에 가까운 복제본(near-realtime replica) 생성
  • 전체 데이터베이스를 스트리밍하지 않아도 즉시 사용 가능
  • 이러한 구조 덕분에 빠른 시작 속도짧은 복구 시간 확보

활용 및 의의

  • Litestream은 데이터베이스의 모든 상태를 초 단위 해상도로 백업 유지
    • DELETE나 UPDATE 실수 시, 원하는 시점으로 즉시 복원 가능
  • 객체 스토리지에서 직접 쿼리하는 구조로 에페메럴 서버 환경에서도 빠르게 동작
  • 복잡한 메커니즘 없이 SQLite의 기본 기능을 활용해 단순하면서 강력한 백업·복구 체계 제공
  • Fly.io 내부 API에서도 사용 중이며, 생산 환경에서도 안정적으로 운용 가능

Read Entire Article