1. 背景:快照脚本的黄昏
如果你用 SQLite 跑生产,一定做过这种 “快照”:
cp production.db backup-$(date +%Y%m%d).db
简单,却隐患满满:
- 复制期间写事务可能被中断,快照不一致;
- 文件越大,耗时越久,IO 占用越高;
- 回滚只能到天级,无法精确到 “5 分钟前”。
Litestream VFS 给出新思路 ——把备份做成一组只追加的 LTX 文件,直接放在对象存储;本地 sqlite3 通过 FUSE 插件按需读取,无需整库拉回。 从此 “文件即备份”,零运维、秒级启动、支持任意时间点查询。
2. 30 行配置:把 500 GiB 生产库挂到 S3
① 部署 Litestream(已有正常复制)
# /etc/litestream.yml
dbs:
- path: /var/lib/app/production.db
replicas:
- url: s3://mybkt/db/ltx
retention: 168h # 7 天 LTX 分层留存
sync-interval: 1s # L0 每秒上传
systemctl enable --now litestream
② 编译加载 VFS 插件
git clone https://github.com/benbjohnson/litestream
make liblitestream.so
③ 本地挂载
export AWS_REGION=ap-east-1
sqlite3
sqlite> .load ./liblitestream.so
sqlite> .open file:///my.db?vfs=litestream&bucket=mybkt&path=db/ltx
首次启动 <1 s;500 GiB 的库只占 40 MiB 本地缓存,因为只拉索引与热页。
3. 原理解剖:LTX 文件与 Page Index
3.1 LTX 格式
- 每个 LTX 文件 = 一段连续 WAL 页(4 KiB)+ 尾部索引;
- 只追加写,天然适合对象存储;
- 支持 Compaction:同一 page 的多次出现只保留最后一次,读放大最低可至 0.01。
3.2 VFS 读页流程
- SQLite 要读 page N;
- VFS 查内存索引 → 得到 {s3_key, offset};
- 发 Range GET
bytes=offset..offset+4095; - 缓存进本地 LRU,默认 64 MiB,可配;
- 返回给 SQLite,应用无感。
3.3 索引体积
尾部索引占 LTX 体积约 1 %。以 500 GiB 库、page 4 KiB 计:
- 总 page 数 ≈ 125 M;
- 索引大小 ≈ 125 M × 32 B ≈ 4 GiB;
- 首次挂载只需拉 4 GiB 索引,随后增量更新。
4. 实战:误删表后 10 秒回滚
-- 灾难现场:忘记 WHERE
UPDATE sandwich_ratings SET stars = 1;
-- 本地开发机直接回到 5 分钟前
sqlite> PRAGMA litestream_time = '5 minutes ago';
sqlite> SELECT * FROM sandwich_ratings LIMIT 3;
Meatball|Los Angeles|5
Ham & Swiss|Los Angeles|2
Chicken Shawarma|Detroit|5
-- 星星回来了!
无需 restore、无需复制新文件、无需停机。
5. 落地清单:3 个参数即可上线
| 参数 | 建议值 | 说明 |
|---|---|---|
cache_size |
64 MiB | 热页缓存,按工作集调整 |
range_timeout |
3 s | 对象存储 Range GET 超时 |
lag_alert |
60 s | 索引落后阈值,Prometheus 告警 |
监控示例:
# 索引落后时间
litestream_index_lag_seconds > 60
6. 限制与权衡
- 只读:写入仍需回本地主库;VFS 不做锁协调。
- 延迟敏感:跨洋 RTT 200 ms 时,冷页未命中会放大查询延迟;建议同 Region 部署或预热热页。
- 一致性模型:最终一致;S3 列举延迟 <1 s,可满足 99 % 场景。
7. 结语
Litestream VFS 把 “备份” 从运维任务变成了文件属性:只要对象存储桶在,数据库就在;任何一台空机器,装插件、配凭证、秒级挂载,即可查询最新或任意历史版本。SQLite 依旧轻量,却拥有了企业级 PITR 能力 ——零运维、低成本、高可靠,正是边缘与云原生时代需要的 “文件即备份” 方案。
资料来源
[1] Fly.io Blog: Litestream VFS – Query SQLite Directly Off Object Storage, 2025. https://fly.io/blog/litestream-vfs/