Clace和sqlite-fs都利用 SQLite 提供取代传统文件系统的创新解决方案,每种解决方案都适用于不同的用例。
Clace 概述
Clace 是一个专为内部工具设计的 Web 应用部署平台,允许开发人员在一台机器上安全地托管多个应用程序。主要功能包括:
- 跨平台兼容性:适用于 Linux、Windows 和 macOS。
- GitOps 工作流:方便从 GitHub 存储库直接部署,无需构建步骤。
- 容器管理:使用Docker或Podman管理应用程序容器。
- 超媒体应用程序:支持使用无需容器的 Starlark 构建应用程序。
- SQLite 持久性:利用 SQLite 实现应用程序数据持久性,并维护由 SQLite 数据库支持的虚拟文件系统,从而实现高效的静态内容缓存
Clace 的特点
-
原子更新:确保跨多个应用程序的更新要么完全完成,要么根本不完成。
-
暂存模式:允许在正式上线之前测试代码和配置更改。
-
OAuth 身份验证:为应用程序提供安全的访问控制。
-
性能增强:包括静态资产的 Brotli 压缩和自动 SSL 证书创建
使用 SQLite 提供文件服务
对于 Clace,决定使用SQLite来存储应用文件,而不是使用文件系统。这样做的主要原因是为了能够进行原子版本更改。在更新应用时,由于可能会更新大量文件,因此使用数据库将允许在事务中原子地完成所有更改。这将防止在版本更改期间提供损坏的网页。
Clace 在应用程序创建和更新期间将所有文件上传到 SQLite 数据库。文件从 GitHub 或本地磁盘上传。仅在开发模式下,才使用本地文件系统。
使用 SQLite 的好处
决定使用 SQLite 进行文件存储提供了许多额外的好处(有些是意料之外的)。
事务更新:这是主要的好处。可以在一个事务中更新多个文件。隔离可确保更新期间不会出现任何损坏的 Web 应用程序。
部署回滚:事务的另一个好处是能够在出现错误时回滚部署。如果要更新多个应用程序,则可以一次性回滚所有应用程序。回滚数据库事务比清理文件系统上的文件要容易得多。
跨版本文件重复数据删除:Clace 自动对所有更新进行版本控制。这可能会导致大量重复文件。文件数据存储在具有以下架构的表中
CREATE TABLE files (sha text, compression_type text, content blob, create_time datetime, PRIMARY KEY(sha));
未压缩内容的 SHA256 哈希用作存储文件数据的主键。这意味着即使应用程序的多个版本具有相同的文件,文件内容也只会存储一次。
跨应用程序去重复:Clace 中的每个生产应用程序都有一个暂存应用程序。 应用程序可以有多个预览应用程序。 这会导致大量文件重复。 使用数据库有助于避免所有重复。 即使在不同的应用程序中,也会有内容相同的文件。 跨应用程序的文件也会被去重。
轻松备份: 使用 SQLite 意味着备份非常简单。 使用 Litestream 等 SQLite 备份工具,可以轻松备份整个系统、元数据和文件的状态。
内容加密:为了在浏览器上实现内容缓存,网络服务器会返回一个 ETag 标头。 使用文件数据库可以在上传文件时轻松保存一次 SHA 内容,而无需稍后重新计算。
压缩: 文件内容经 Brotli 压缩后保存在 SQLite 表中。 数据库方法的优点是可以轻松地以多种格式保存内容。 只需在文件表中添加一列,即可添加 GZip 压缩数据和未压缩数据。
性能
对于 Clace 来说,SQLite 数据库方法提供了出色的性能。没有使用文件系统的等效实现可供比较,因此没有进行直接基准测试。根据SQLite 团队进行的基准测试,对于某些工作负载,SQLite 的性能可能比直接使用文件系统更好。
多节点支持
Clace 目前在单个节点上运行。当稍后添加多节点支持时,计划使用共享 Postgres 数据库,而不是使用本地 SQLite 来存储元数据和文件数据。这将带来延迟问题。计划使用本地 SQLite 数据库作为文件缓存,以避免访问 Postgres 时出现延迟。
为什么这种方法不那么普遍?
大多数 Web 服务器使用文件系统的原因之一是方便。可以使用任何文件系统工具进行文件更新:rsync、tar 等可用于复制文件。另一个原因可能是历史原因:在出现良好的进程内关系数据库之前,人们使用的是文件系统。使用数据库意味着需要某种 API 接口来上传文件,但这并不总是可行的。
sqlite-fs 概述
另一方面,sqlite-fs 是一款允许用户在 Linux 和 macOS 上将 SQLite 数据库挂载为传统文件系统的工具。该项目对于想要直接在数据库环境中管理文件的用户特别有用。
sqlite-fs 的功能
-
文件系统操作:支持标准文件系统操作,例如创建、读取、写入、删除文件和目录。
-
内存数据库选项:用户可以选择临时的、卸载后不会持久存在的内存数据库。
-
与 FUSE 集成:利用 FUSE(用户空间文件系统)创建虚拟文件系统接口
示例用法
要将 SQLite 数据库挂载为文件系统,用户可以执行:
sqlite-fs ~/mount ~/filesystem.sqlite &
echo "Hello world!" > ~/mount/hello.txt
cat ~/mount/hello.txt
此示例演示了如何轻松地在已挂载的 SQLite 数据库中创建和访问文件