Clace和sqlite-fs:使用SQLite替代文件系统

Clacesqlite-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 数据库中创建和访问文件

https://www.jdon.com/76137.html

相关推荐
shuaijie05185 小时前
强制修改调用接口的api地址。
javascript·vue.js·ecmascript
JerrySir5 小时前
恶意 npm 包只活了 17 分钟:技术面试里,为什么“升级依赖”还不算止血?
javascript·安全
白帽小阳5 小时前
2026前端面试题!(附答案及解析)
javascript·网络·python·安全·web安全·网络安全·护网行动
这是个栗子5 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
Hilaku5 小时前
Vue 和 React 真正的差距,不在语法,而在团队犯错成本
前端·javascript·程序员
研☆香5 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
柯克七七6 小时前
我把 bug 修得太干净了,测试组以为这个模块本来就没问题
前端·javascript·typescript
Null1556 小时前
浏览器唤起桌面端应用(终极篇)
前端·javascript
妙码生花6 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十四):后台初始化请求实现
前端·javascript·go
JackieZhengChina7 小时前
零依赖轻量级JS悬浮提示插件title2tip-js的使用教程
开发语言·javascript·ecmascript