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