Hotdry.

Article

用 FUSE 把 SQLite 的 WAL 实时流式复制到对象存储,实现零运维的“文件即备份”方案

基于 Litestream VFS,让 sqlite3 直接挂载对象存储上的备份副本,秒级启动、按需拉页、支持秒级 PITR,全程无需额外快照脚本。

2025-12-11systems-engineering

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 读页流程

  1. SQLite 要读 page N;
  2. VFS 查内存索引 → 得到 {s3_key, offset};
  3. 发 Range GET bytes=offset..offset+4095
  4. 缓存进本地 LRU,默认 64 MiB,可配;
  5. 返回给 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/

systems-engineering