ZeroFS:面向 S3 兼容存储的日志结构文件系统

ZeroFS:面向 S3 兼容存储的日志结构文件系统

ZeroFS 将 S3 兼容的对象存储转换为可用的 POSIX 文件系统或原始块设备。通过使用日志结构引擎,ZeroFS 让用户能够将云存储桶视为主存储,提供了对象存储的可扩展性与传统文件系统接口需求之间的桥梁。

架构与存储引擎

ZeroFS 采用日志结构方法来管理 S3 兼容存储桶中的数据。写入不再原地改写,而是作为不可变对象处理,随后通过压缩(compaction)过程回收已删除数据占用的空间。

引擎的关键技术特性包括:

  • 不可变段:文件数据被组织为 32 KiB 的扩展块(extents),存放在不可变的段对象中。单独的元数据索引跟踪这些扩展块,确保检查点和只读副本能够保持对存储桶的一致视图。
  • 加密与压缩:所有数据在上传前使用 XChaCha20-Poly1305 加密。数据密钥使用 Argon2id 从密码派生后进行包装。加密前,数据会使用 zstd 或 lz4 压缩;读取时会自动检测使用的编解码器,从而在不迁移数据的情况下更改压缩设置。
  • 缓存:为缓解 S3 往返的高延迟(通常 50–300 ms),ZeroFS 实现了可配置的内存和磁盘缓存。从这些缓存的热读可以在微秒级返回。
  • TRIM 支持:文件系统或 ZFS 池发出的 discard 命令会释放相应的扩展块。随后压缩过程会重新打包存活数据并从 S3 删除空段,以降低存储成本。

访问协议与接口

ZeroFS 提供三种主要方式与存储后端交互,全部在单个用户空间进程中运行:

POSIX 文件系统(NFS 与 9P)

  • NFS:使用原生 NFS 支持,可在 macOS、Linux、Windows、BSD 等主流操作系统上挂载,无需客户端软件。
  • 9P:相较 NFS 更贴近 POSIX 语义。它自带一个 FUSE 客户端,支持非 root 挂载并具备自动重连功能。

原始块设备(NBD)

  • NBD(Network Block Device):将存储桶作为原始块设备提供。这些设备可以承载 ext4、ZFS 池或虚拟机启动磁盘。新设备可在运行时添加,无需重启服务器。

高可用性与数据完整性

ZeroFS 实现了多项功能以确保耐久性和一致性:

  • 诚实的 fsync:一次成功的 fsync 操作表明每个已确认的写入已在 S3 中持久化。如果在故障转移时未刷写的写入丢失,随后执行的 fsync 将返回错误,而不是错误的成功。
  • 高可用 (HA):可选的备用实例通过同一存储桶跟踪主实例。备用实例保存主实例已确认但尚未刷写的写入,从而在故障转移时自动接管并保留这些写入。
  • 检查点:具名检查点允许在特定时间点捕获文件系统,并以只读方式打开。
  • 只读副本:多个只读实例可以服务同一存储桶,自动获取单写入者所做的更改。

验证与测试

ZeroFS 使用广泛的公开 CI 流水线来验证其稳定性和性能:

  • POSIX 合规性:在每次代码变更时运行 pjdfstest 套件,以验证权限、所有权、链接和重命名行为。
  • 内核验证:在 NFS、9P 与 FUSE 上运行 xfstests 套件(用于验证 ext4 与 XFS)。
  • 端到端 ZFS 测试:CI 在 ZeroFS 块设备上构建 ZFS 池,提取 Linux 内核源码树,并执行完整的 scrub,以确保没有校验和错误。
  • 压力测试:使用 stress-ng 以及并行的 Linux 内核编译(make -j$(nproc))对系统进行压力测试。
  • 模型检查:使用 Jepsen 的 local-fs 套件,对随机操作历史进行文件系统模型验证,包括崩溃恢复测试。

社区见解与反驳

虽然项目展示了高度的技术抱负,但 Hacker News 上的社区讨论指出了若干需要注意的点:

  • 延迟担忧:部分用户认为亚毫秒写入的说法具有误导性,因为它们可能测量的是网络或内核延迟,而非数据在 S3 中持久化所需的时间。

"The sub-millisecond writes with data in S3 is false and impossible. If you look at the benchmark the fsync is not timed, so this is just the latency of either the network or in kernel file operations..."

  • 抽象开销:批评者指出,将 S3 抽象为文件系统本身就效率低下,因为对象存储与文件系统的工作方式差异巨大。有人建议让应用程序直接“了解对象存储”,而不是使用文件系统抽象层。
  • 性能 vs. Ceph:有用户声称,在本地 S3 环境中,ZeroFS 的性能明显低于 Ceph 等替代方案,尤其是在小 I/O 场景下。
  • 元数据管理:有人质疑在故障转移期间元数据如何处理,以及是否已完全存放在存储桶中以简化高可用性实现。

Sources