展示 HN: ZeroFS - 一个适用于 S3 的日志结构文件系统
一个适用于 S3 的日志结构文件系统。ZeroFS 作为 NFS 和 9P 的 POSIX 文件系统提供 S3 兼容的存储桶,或作为原始块设备通过 NBD 提供。该引擎是日志结构的:写入作为不可变对象发送,压缩会回收你删除的内容。数据在上传前进行压缩和加密,热读操作在微秒级的本地缓存中完成,或者通过 Docker · GitHub 动作 · 其他平台 8662 1 CI 中的 POSIX 套件测试 1.6 µs 2 随机读取,热缓存 0.83 ms 3 平均小写延迟 16 EiB 4 最大文件系统大小 1 pjdfstest 在每次更改时运行。一些NFS/9P无法表达的语义情况被排除;列表在回购中是公开的。2 SQLite bench,来自本地缓存的零FS随机读取。原始 S3 往返时间为 50-300 ms。3 NFS 上的文件追加,ZeroFS bench 套件;数据在 S3 中处于静止状态。4 设计可寻址:64 位 inode 和大小字段,32 KiB 范围。01 验证 测试套件在公共 CI 中运行。CI 在每次更改时运行 pjdfstest、xfstests、内核构建、stress-ng、ZFS 检查、Jepsen 的本地文件系统套件和 Jepsen 故障转移套件。前两个在 NFS、9P 和 FUSE 客户端中分别单独运行。每个卡片链接到 CI 管道。 POSIX 语义 pjdfstest 套件在每次更改后运行,每个协议一次:权限、所有权、链接、重命名行为。排除列表,每个协议中的几个案例,已发布在回购中。pjdfstest 工作流 → xfstests 内核文件系统测试套件在 NFS、9P 和 FUSE 中以单独工作流运行。这是 ext4 和 XFS 本身会验证的测试。xfstests 工作流 → ZFS 作为端到端测试 CI 在 ZeroFS 块设备上构建一个 ZFS 池,将 Linux 内核源树提取到其中,并运行完整的检查。检查报告没有校验和错误。zfs-test 工作流 → 内核构建 CI 在 NFS、9P 和 FUSE 挂载上编译 Linux 内核,使用 make -j$(nproc)。并行编译是压力测试:许多进程同时写入同一树。kernel-compile 工作流 → stress-ng 文件系统压力测试在 CI 中对实时挂载运行:访问、chdir、chmod、chown 和其他文件处理集,全部同时进行。stress-ng 工作流 → 基于模型的检查 Jepsen 的本地文件系统套件驱动一个9P挂载,具有随机操作历史,并检查每一个与参考文件系统模型的匹配。崩溃模式在运行中杀死服务器,并验证恢复状态与最后一次 fsync 相符。jepsen 工作流 → 故障注入下的故障转移 第二个 Jepsen 套件在 MinIO 上运行一个领导和备用,然后在工作负载中间杀死、重启和暂停领导。它确认每个确认的写入在故障转移中幸存,并且恢复的文件系统保持一致。jepsen-ha 工作流 → 自托管 Rust 工具链在 ZeroFS 自身服务的文件系统上构建 ZeroFS。这是一个记录的会话,而不是 CI 作业。观看录制 → 02 协议 文件通过 NFS 和 9P,块设备通过 NBD。所有三个服务器在一个用户空间进程中以相同的存储桶运行。客户端使用 NFS 和 9P 支持来挂载它,这已经在 Linux 中存在,NFS 客户端其他系统发运,或者 nbd-client 用于块设备。 文件 · 无处不在 NFS 在 macOS、Linux、Windows 和 BSD 上通过他们自己的 NFS 支持挂载,不需要在客户端额外安装任何东西。服务器保持在用户空间。 # 来自任何主要操作系统的挂载 mount -t nfs 127.0.0.1:/ /mnt/zerofs 文件 · 精确 9P 9P 更接近于 POSIX 而不是 NFS,fsync 只有在数据到达稳定存储后才返回。捆绑的 FUSE 客户端无需 root 即可挂载,并自行重新连接。 # 捆绑的 FUSE 客户端,无需 root zerofs mount 127.0.0.1:5564 /mnt/zerofs 块 · 原始 NBD 存储在存储桶中的原始块设备持有 ext4 文件系统、ZFS 池或虚拟机启动磁盘。新设备在运行时被拾取,无需服务器重启。 # 附加块设备 nbd-client 127.0.0.1 10809 /dev/nbd0 -N vol1 运行在 Amazon S3、Google Cloud Storage、Azure Blob、任何兼容 S3 的存储、地方磁盘 03 地理分布 跨三个 S3 区域的 ZFS 镜像。每个 ZeroFS 实例将一个 S3 区域暴露为块设备。对于 ZFS,它们是普通磁盘,因此跨洲的镜像与其他池的设置相同。 global-pool — zsh $ nbd-client 10.0.1.5 10809 /dev/nbd0 -N storage -persist # us-east $ nbd-client 10.0.2.5 10809 /dev/nbd1 -N storage -persist # eu-west $ nbd-client 10.0.3.5 10809 /dev/nbd2 -N storage -persist # ap-southeast $ zpool create global-pool mirror /dev/nbd0 /dev/nbd1 /dev/nbd2 $ zpool status global-pool | grep state state: ONLINE 如果某个区域变得无法到达,池降级并且数据仍然可以从另外两个处获得。 04 能力 存储引擎的九个属性。 04.1 始终加密 每个块在上传前使用 XChaCha20-Poly1305 进行加密。数据密钥使用 Argon2id 从你的密码派生的密钥进行包装。没有未加密的模式。 04.2 压缩 数据在加密前使用 zstd 或 lz4 进行压缩。编解码器可以随时更改而无需迁移,因为编解码器
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡