在Docker和Kubernetes上使用Litestream运行SQLite应用

Hacker News Top 产品

摘要

OpenRun为SQLite应用引入内置Litestream支持,实现到对象存储的自动复制,并在Docker和Kubernetes上提供与GitOps集成的无缝部署。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/30 18:45

# 内置Litestream复制功能的SQLite生产环境应用 来源:https://openrun.dev/blog/litestream/ OpenRun是一个开源(https://github.com/openrundev/openrun)、自托管的GitOps平台,用于在Docker、Podman或Kubernetes上部署Web应用和内部工具。它提供身份验证、授权、审计和RBAC功能,无需修改应用程序。 OpenRun现已内置对SQLite应用的Litestream(https://litestream.io/)支持。应用数据库会持续复制到AWS S3或S3兼容对象存储(如Cloudflare R2、MinIO和SeaweedFS)。恢复过程是自动的:当OpenRun检测到空的应用卷或重新创建的卷时,会在启动应用前从副本恢复数据库。相同的设置既可在单节点Docker/Podman环境中工作,也可在Kubernetes环境中运行。 其结果是,应用开发者可以正常使用SQLite,而无需安装Litestream、配置对象存储、修改容器镜像或实现恢复逻辑。 ## 背景https://openrun.dev/blog/litestream/#background SQLite非常适合内部工具和小型Web应用:数据库基于文件,读取速度快,且无需单独维护数据库服务器。Litestream将SQLite的变更持续复制到对象存储,提供持久化的节点外备份和时间点恢复功能。 然而,若无平台集成,您仍需在应用旁边部署Litestream,配置副本,并在启动时处理数据库恢复。 OpenRun将这些运维工作移至平台层面。Litestream设置只需在服务器配置中定义一次,而OpenRun在应用容器外管理复制和恢复。应用镜像保持不变,新的SQLite应用可以无需任何Litestream特定设置即可使用复制功能。 ## 部署SQLite应用https://openrun.dev/blog/litestream/#deploying-a-sqlite-app 在OpenRun服务器配置中一次性定义Litestream: openrun\.toml `` [litestream.mainbackup] bucket = "openrun-backups" region = "us-east-1" access_key_id = '{{secret_from "env" "LITESTREAM_KEY_ID"}}' secret_access_key = '{{secret_from "env" "LITESTREAM_KEY"}}' `` 然后创建一个引用它的SQLite服务,并将应用绑定到该服务: `` openrun service create sqlite/main --is-default --config litestream_config=mainbackup openrun app create --bind sqlite --approve github.com/example/notes-app /notes `` 相同的应用也可以用声明式方式定义。将定义放在Git中的apply文件里,与其他配置并存: apps\.star `` app("/notes", "github.com/example/notes-app", bindings=["sqlite"]) `` `` openrun apply --promote github.com/example/config/apps.star `` `openrun apply`的工作方式类似Kubernetes的apply:它会创建新应用、更新配置已更改的应用,并保持其他应用不变。所有应用管理,包括SQLite绑定,均可通过GitOps驱动。 以上就是全部设置。应用会获得挂载在`/data`的持久卷,并通过注入的环境变量(`SQLITE\_DB\_PATH`、`SQLITE\_DIR`)找到数据库。应用在该目录中创建的任何`*.db`文件都会被复制,包括运行时创建的文件。 在默认情况下,更改通常在大约一秒内复制完成(`sync\_interval`可配置)。 ## 单节点https://openrun.dev/blog/litestream/#single-node 在Docker和Podman上,OpenRun在每个应用的伴随容器中运行Litestream,并与应用共享数据卷。在应用容器启动空卷之前,恢复容器会从副本中拉回所有复制的数据库。当应用在空闲时缩放至零时,Litestream容器会执行最终同步并停止。 单节点部署中,应用数据和服务器元数据通过Litestream复制到S3兼容存储服务器自身的元数据也可以同样方式复制。Litestream作为Go库内嵌在OpenRun二进制文件中,因此在服务器配置中设置`metadata\.litestream\_config`即可复制元数据和审计数据库,无需额外的Litestream进程。 ## Kuberneteshttps://openrun.dev/blog/litestream/#kubernetes 当OpenRun部署到Kubernetes集群(https://openrun.dev/docs/container/kubernetes/)时,相同的应用配置同样适用。绑定的卷会变为PersistentVolumeClaim,OpenRun会自动向应用Pod添加一个恢复初始化容器和一个原生Litestream边车(需Kubernetes 1\.29或更新版本)。边车在应用容器之前启动,并在其之后终止,允许Litestream在有序关闭期间执行最终同步。具有SQLite绑定的应用以单副本运行,并使用`Recreate`更新策略,防止多个应用Pod在更新期间写入同一SQLite卷。 Kubernetes部署中,应用Pod包含恢复初始化容器、应用容器和Litestream边车,将SQLite PVC复制到S3兼容存储## 卷或节点丢失时会发生什么https://openrun.dev/blog/litestream/#what-happens-on-a-volume-or-node-loss 对于丢失的应用卷,从应用角度来看恢复是自动的。下次应用启动时,OpenRun会看到空卷,运行恢复容器从副本中拉回数据库,然后启动应用容器并使用恢复的数据。副本按绑定索引,因此将相同绑定附加到新应用也会将数据恢复到该应用的新卷中。 对于完全节点丢失且启用了元数据复制的情况,恢复过程如下: 1. 在新机器上安装OpenRun。 2. 使用相同的配置文件启动服务器。 在启动时,服务器发现元数据数据库缺失,从副本中恢复元数据和审计数据库,并带着所有应用、绑定、服务、版本和审计历史记录完整启动。然后每个应用在首次请求时重新部署,在容器启动前从自己的副本恢复其SQLite数据。要恢复节点,您只需要服务器配置及其引用的机密。OpenRun的元数据和复制的应用数据将从对象存储中恢复。 因此,应用程序数据和OpenRun自身的元数据可以从同一对象存储后端恢复。复制是异步的。在正常情况下,默认一秒的`sync\_interval`,突然崩溃可能会丢失最近一秒内尚未到达对象存储的写入。 节点丢失场景在CI测试(https://github.com/openrundev/openrun/blob/7baff958df092121b014ac36d469771bc54f547b/tests/run_cli_tests.sh#L1344)中进行了端到端测试。测试会强制终止服务器,删除容器、卷和OpenRun安装目录(包括元数据数据库)。然后验证所有内容是否从对象存储自动重建,包括应用SQLite数据。 ## 监控https://openrun.dev/blog/litestream/#monitoring `openrun replication status`报告每个复制数据库的状态: `` $ openrun replication status -f table Kind Target Config State LastSync Files Apps metadata metadata mainbackup healthy 2026-08-25 16:31:42 - metadata audit mainbackup healthy 2026-08-25 16:31:42 - app /auto/app_prd_.../sqlite (prod) mainbackup healthy 2026-08-25 23:31:30 data.db /notes app /auto/app_prd_.../sqlite (staged) mainbackup pending - - stage.localhost:/notes `` 应用状态结合了对象存储中的副本列表和复制容器的状态,因此即使对象存储仍包含最近的副本,失败的复制容器也可见。 有关完整配置选项,请参阅Litestream参考(https://openrun.dev/docs/applications/litestream/);有关应用最佳实践(WAL模式、繁忙超时、短写入事务),请参阅SQLite托管用例(https://openrun.dev/docs/use-cases/sqliteapps/)。 复制状态也可在控制台应用(https://openrun.dev/console-tour/)中查看——请参见实时演示(https://utils.demo.clace.io/console/containers?query=&filter=litestream)。

相似文章

SQLite:持久化工作流的全部所需

Hacker News Top

这篇博文认为,SQLite 结合 Litestream 进行异步备份,为许多工作流系统(尤其是 AI 智能体)提供了一种简单而有效的持久化执行方法,无需单独编排层或网络数据库。

我们如何为SQLite构建零磁盘、S3分层存储引擎

Lobsters Hottest

Rivet工程师详细介绍了他们如何为SQLite构建零磁盘、S3分层的存储引擎,实现了隔离数据库,具备即时启动、低延迟写入、时间点恢复和无限存储能力,可支持数百万Actors。

SQLite:万能数据库解决方案

Lobsters Hottest

本文倡导将SQLite视为一种多功能且稳定的数据库解决方案,强调其在不同技术栈中替代多种其他工具的能力。