用途:在 Kubernetes 中以 SQLite 作为主数据库,通过 Litestream 把 WAL 变更持续复制到 S3 兼容对象存储(Cloudflare R2、AWS S3 等),Pod 启动时自动恢复,无需 PersistentVolumeClaim。适合单二进制、无外部数据库依赖的应用;需要水平扩展或并发写入时应改用 Postgres。
主要能力:对象存储提供持久性与时间点恢复,每个 WAL 段都被保留;兼容任意 S3 兼容后端;使用 emptyDir 作为数据卷,Litestream 即持久层。
文件结构:Dockerfile(多阶段构建并安装 litestream)、run.sh(入口:恢复→复制→启动应用)、litestream.yml(复制配置,凭据用环境变量)、.env.prod(S3/R2 凭据)、k8s/prod/deployment.yaml(在 /data 挂载 emptyDir)。
用法:litestream.yml 中 dbs[].path 设为 /data/app.db,replicas 用 type: s3 并引用 LITESTREAM_BUCKET、LITESTREAM_ENDPOINT、LITESTREAM_ACCESS_KEY_ID、LITESTREAM_SECRET_ACCESS_KEY。run.sh 中若数据库不存在则执行 litestream restore -if-replica-exists -o "$DB_PATH" "$DB_PATH",然后 exec litestream replicate -exec "/app"。Dockerfile 从 GitHub Releases 下载指定版本 tar.gz 安装。部署时 replicas 保持 1,数据卷用 emptyDir。
恢复:可用 litestream restore -config litestream.yml -timestamp "..." -o /tmp/restored.db /data/app.db 恢复到任意时间点,再用 sqlite3 检查并把需要的行插回在线库。
限制与注意事项:SQLite 单写入者,副本数绝不能大于 1,否则数据库会损坏;不要替换在线数据库文件,否则破坏 WAL 跟踪;run.sh 必须用 exec 以正确接收 SIGTERM;首次部署需 -if-replica-exists;纯 Go 驱动可用 CGO_ENABLED=0,使用 mattn/go-sqlite3 则需 CGO_ENABLED=1 并安装 build-base;热重载时旧进程可能持有 SQLite 锁,需在重启间清理数据库文件。