-
Litestream v0.5.0는 SQLite 기반 애플리케이션의 복원력을 크게 향상시키는 업데이트임
- 새로운 LTX 파일 포맷을 도입하여 효율적인 시점 복구(PITR) 및 데이터 압축 기능을 지원함
- 여러 Litestream 인스턴스 간 세대(generation) 개념을 제거하여 관리 및 운용을 간소화했음
- JetStream 지원 및 모던 Go SQLite 드라이버로의 전환 등 개발과 통합 환경이 더 편리해짐
- 향후 VFS 기반 읽기 복제본 등 더 강력한 기능의 추가가 예고됨
개요 및 주요 업데이트
- Litestream은 SQLite 애플리케이션을 위한 백업 및 복구 도구로, 오픈소스이며 어디서나 실행 가능한 점이 특징임
-
서버 장애 복구가 간편하여, SQLite를 기반으로 한 전체 스택 애플리케이션 구축에 안전성을 보장함
- 최신 버전(v0.5.0)은 속도 개선과 시점 복구(Point-In-Time Recovery, PITR) 를 지원함
LiteFS와 Litestream의 발전 흐름
- Fly.io의 Ben Johnson이 개발한 주요 SQLite 관련 프로젝트는 Litestream과 LiteFS임
-
LiteFS는 FUSE 파일 시스템을 활용해 데이터베이스 내부 트랜잭션 수준의 라이브 복제를 지향함
- 그러나 시장의 수요는 운용이 더 간단한 Litestream에 집중되어, LiteFS에서 얻은 기술적 교훈을 Litestream에 다시 적용하게 되었음
LTX 파일 포맷 도입
-
기존의 SQLite 페이지 단위 백업 방식의 한계와 비효율성 해소를 위해 LTX(트랜잭션 기반 포맷) 를 도입함
-
LTX는 트랜잭션 순서에 따른 페이지 범위 관리 및 중복 페이지 압축(compaction) 기능을 제공함
- 예시: 여러 LTX 파일을 최신순으로 적용, 중복된 페이지는 최신 버전만 반영하여 최종 데이터베이스 상태를 빠르게 복원 가능함
- 파일 계층 구조를 통해 30초, 5분, 1시간 단위로 LTX 파일을 통합하여 복원에 필요한 파일 수를 대폭 줄임
-
데이터 복구 속도는 오직 I/O 처리량에 의해 제한됨
세대(generation) 개념 제거
- Litestream은 일반적인 유닉스 프로세스처럼 실행 및 충돌 가능하며, 동작 중단 시 데이터 동기화에 불일치 현상이 발생함
- 이전에는 여러 인스턴스 간 충돌 방지를 위해 세대(generation) 라는 관리 방식을 도입했으나,
- LTX로 전환하면서 트랜잭션 ID 기반 복구가 가능해져, 복잡한 세대 관리가 불필요해짐
Litestream v0.5.0 업그레이드
- 워낙 파일 포맷이 변경되어, v0.3.x WAL 세그먼트에서 직접 복구가 불가능함
- 업그레이드는 단순하게 새 버전 실행 → 신 LTX 파일 생성 방식이고, 이전 WAL 파일도 그대로 보존됨
- 구성 파일 호환성도 유지됨
- 주요 변경점: 이제 데이터베이스 당 단일 복제 대상만 허용되며, 이는 개발 용이성과 복제 충돌 회피를 위한 결정임
- 명령어는 기존과 같으나, 트랜잭션 ID(TXID) 기반 참조 방식으로 변경됨
기타 개선점
- LTX 파일 포맷 라이브러리의 페이지 단위 압축 및 인덱스 추가로 대용량 파일 내 선택적 페이지 접근 및 기능 확장 가능함
- 향후 특정 시점 데이터 쿼리 등 추가 기능이 구현 가능해짐
-
CGO 의존성 제거 및 Go SQLite 드라이버를 modernc.org/sqlite로 전환하여 자동 빌드와 크로스 컴파일 환경에 이점이 생김
-
JetStream 지원 복제본 타입과, S3/Google Storage/Azure Blob Storage 클라이언트 최신화 및 S3 API 신버전 지원이 포함됨
향후 계획
- 읽기 복제(target) 환경을 위한 Litestream VFS 기능 개발이 진행되고 있음
- 이 기능을 통해 S3에서 필요한 페이지만 즉시 읽어서 빠른 복제 생성이 가능해질 예정임
- 프로토타입이 이미 존재하며, 공개를 앞두고 있음