简介
Litestream 是一个开源工具,专为 SQLite 设计,以 sidecar 进程的方式运行,持续监听 SQLite 的 WAL(Write-Ahead Log),实时将变更流式同步到对象存储(S3、GCS、Azure Blob 等)。
核心特点:
- 不改应用代码:应用仍然正常读写 SQLite,Litestream 在旁边透明工作
- 实时增量复制:默认每秒同步一次 WAL frames,不是全量快照
- RPO 秒级:最多丢失几秒内的写入,远优于每日全量备份的 24 小时 RPO
- 可恢复到任意时间点:S3 上保留完整的 WAL 历史,支持 point-in-time restore
工作原理
应用写 SQLite (enx.db)
└─ SQLite WAL 机制产生变更帧
└─ Litestream 监听 WAL
└─ 定期上传 WAL frames 到 S3
└─ S3 保留完整变更历史
恢复时,Litestream 从 S3 下载快照 + WAL frames,重放到指定时间点。
安装
# Arch Linux
yay -S litestream-bin
# 直接下载二进制(Linux amd64)
wget https://github.com/benbjohnson/litestream/releases/latest/download/litestream-linux-amd64.tar.gz
tar -xzf litestream-linux-amd64.tar.gz
sudo mv litestream /usr/local/bin/
配置
创建配置文件 /etc/litestream.yml:
dbs:
- path: /var/lib/enx-api/enx.db
replicas:
- type: s3
bucket: wiloon-enx-backup
path: litestream/enx
region: ap-northeast-1
AWS 鉴权优先使用 EC2 IAM Instance Profile,无需配置 Access Key。
运行
作为 systemd 服务
# /etc/systemd/system/litestream.service
[Unit]
Description=Litestream SQLite replication
After=network.target
[Service]
ExecStart=/usr/local/bin/litestream replicate -config /etc/litestream.yml
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now litestream
sudo systemctl status litestream
命令行手动运行
# 启动持续复制
litestream replicate -config /etc/litestream.yml
# 查看复制状态
litestream snapshots s3://wiloon-enx-backup/litestream/enx
# 列出可用的恢复时间点
litestream generations s3://wiloon-enx-backup/litestream/enx
恢复
# 停止应用
sudo systemctl stop enx-api
# 恢复到最新状态
litestream restore -config /etc/litestream.yml /var/lib/enx-api/enx.db
# 恢复到指定时间点
litestream restore \
-timestamp "2026-05-18T10:00:00Z" \
-config /etc/litestream.yml \
/var/lib/enx-api/enx.db
# 重启应用
sudo systemctl start enx-api
与每日全量备份对比
| 维度 | 每日全量备份(shell + systemd) | Litestream |
|---|---|---|
| RPO | 24 小时 | 秒级 |
| 备份方式 | 全量快照 | WAL 增量流式 |
| S3 存储量 | 每天一个完整 DB 文件 | 增量 frames(通常更小) |
| 恢复粒度 | 只能恢复到每天备份点 | 任意时间点 |
| 运维复杂度 | 低(一个 shell 脚本) | 低(一个进程 + 配置文件) |
| 改动应用代码 | 否 | 否 |
| 适用场景 | 数据变更不频繁,丢一天可接受 | 数据安全要求高 |
注意事项
- Litestream 运行期间会持有 SQLite 的共享锁,应用仍可正常读写,但不能同时运行另一个 Litestream 实例
- 恢复前必须先停止应用,避免写冲突
- S3 路径建议加子目录前缀(如
litestream/enx),与全量备份文件区分 - WAL 历史默认保留 24 小时,可通过
retention参数调整