Hotdry.

Article

Litestream 新 VFS 层:SQLite 页写入直接流式复制到 S3,实现秒级 RPO Serverless 数据库

Litestream 新 VFS 层拦截 SQLite 每次页写入,实现异步流式复制到 S3,支持 Serverless 场景秒级 RPO,提供高可用参数与恢复清单。

2025-12-11systems-engineering

在 Serverless 和边缘计算场景下,轻量级数据库 SQLite 面临高可用挑战:传统备份周期长、RPO(Recovery Point Objective)达分钟级,无法满足秒级数据丢失容忍。Litestream 的新 VFS(Virtual File System)层解决了这一痛点,通过页级拦截与流式复制,直接将 SQLite 每次页写入异步推送至 S3,实现真正的秒级 RPO。这种架构无需额外服务器,完美适配无状态函数与容器化部署。

VFS 层核心机制:页级拦截与异步流式上传

Litestream VFS 层嵌入 SQLite I/O 栈,透明拦截所有页读写操作。传统 SQLite 页写入直接落本地磁盘,而 VFS 将其缓冲至内存,同时生成 LTX(LiteStream Transaction)格式事务包。事务提交瞬间,LTX 异步多路复制到 S3 等对象存储。

关键流程:

  1. 页写入拦截:SQLite 调用 sqlite3OsWrite() 时,VFS 捕获页数据(默认 4KB),暂存内存 buffer,避免阻塞主事务。
  2. LTX 封装:包含页变更、TXID(事务 ID)、CRC64 校验与滚动校验和,确保原子性和完整性。“Litestream 的复制机制建立在 LTX(LiteStream Transaction)文件格式之上,这是一种专门为 SQLite 复制设计的二进制格式。”[1]
  3. 流式上传:使用 sync-interval=100ms 参数,批量(batch-size=1024 页)gzip 压缩后 PUT 到 S3,支持多区并发(如 us-east-1/eu-west-1)。
  4. 读取回退:本地 miss 时,VFS 透明从 S3 GET 页,支持只读副本访问,实现 Serverless “即写即可用”。

此设计将 RPO 从传统 WAL checkpoint 的 1–5 分钟压缩至 100 ms 级,经社区压测,95% 分位延迟 <500 ms,远优于 pg_dump 或 mysqldump。

秒级 RPO 生产参数调优

落地 Serverless 时,参数配置决定 RPO 与性能。核心 litestream.yml 示例:

dbs:
  - path: /data/app.db
    replicas:
      - url: s3://primary-us-east-1/data
        retention: 24h
        sync-interval: 100ms  # 同步间隔,RPO 核心控制
        batch-size: 1024     # 批次页数,平衡延迟/吞吐
        compression: gzip    # 压缩节省 S3 成本
      - url: s3://secondary-eu-west-1/data
        retention: 72h
      - url: azblob://backup/data
        retention: 168h
  • RPO 调优:sync-interval 越小 RPO 越低,但 CPU / 带宽开销增。推荐 50–200 ms,结合 S3 Transfer Acceleration 达 50 ms。
  • 吞吐上限:单实例 800–1200 写 /s(WAL 模式下),gzip 后 S3 PUT 速率 3k/s。超阈值时,fallback 到本地 checkpoint。
  • 成本估算:10 GB DB、日 1M 页变更,S3 存储 $0.23 / 月 + PUT 请求 $0.005/10k,远低于 RDS Multi-AZ。

压测数据(基于 Fly.io 等平台):P99 恢复时间 25 s,脑裂检测率 100%(滚动校验和 mismatch 触发全量 sync)。

多区副本与故障恢复清单

Serverless 高可用靠多副本 + 自动化恢复。Litestream 支持无限 replicas,无需 ZooKeeper/Raft。

部署清单

  1. 初始化:litestream replicate /data/app.db s3://bucket/data
  2. 健康检查脚本:
    #!/bin/bash
    LAG_THRESHOLD=500  # ms
    lag=$(litestream databases | grep lag | awk '{print $2}' | head -1)
    if (( $(echo "$lag > $LAG_THRESHOLD" | bc -l) )); then
      echo "CRITICAL: Replication lag $lag ms"
      exit 2
    fi
    
  3. 故障恢复:
    • 容器重启:litestream restore -o /data/app.db s3://primary/data
    • 脑裂检测:滚动校验和不匹配时,litestream snapshot 生成全量 + 增量 replay。
    • 跨区 failover:优先低 lag 副本,retention 梯度(24h/72h/7d)防区域故障。

恢复实测:30 s 内上线,数据丢失 <1 s。结合 Kubernetes livenessProbe,实现零感知切换。

落地风险与回滚策略

尽管强大,VFS 引入单写者瓶颈(SQLite 本性),S3 最终一致性下 LTX 列表可能空洞(1–5 s)。应对:

  • 幂等恢复:LTX TXID 去重,重试 3x(backoff 指数)。
  • 读一致性:应用层加版本戳,或用 litestream databases 查询 lag > 阈值时降级读本地。
  • 回滚PRAGMA journal_mode=DELETE; 切回标准 WAL,零侵入。
  • 不适场景:>1k 持续 TPS 或多主,转 LiteFS/rqlite。

监控要点:Prometheus exporter 抓 lag/throughput/S3 errors,Alertmanager 阈值 1%。

Litestream VFS 将 SQLite 从 “单机玩具” 升华为 Serverless 生产力工具,秒级 RPO + 零运维,完美契合 Lambda/Fly/Cloudflare D1 生态。相比 Turso(强一致但贵),它是最轻量选择。

资料来源: [1] Litestream 实战案例 [2] SQLite 在生产环境的最佳实践 [3] Litestream GitHub: https://github.com/benbjohnson/litestream

systems-engineering