在构建企业级 AI 训练平台时,对象存储选型往往是后端架构中最“不起眼”却最致命的一环。起初,我们以为这只是一个关于“吞吐量”和“IOPS”的技术比拼,为此我们搭建了 3 节点集群进行压测。但最终让我们推倒重来、从 MinIO 迁移到 RustFS 的核心原因,并非后者性能有压倒性优势,而是开源协议这道隐形的“红线”。

我们想分享下在选型过程中踩过的坑,特别是 AGPLv3 协议在实际商业落地中的真实影响,以及两款存储在 AI 高并发小文件场景下的真实表现。

一、开源协议不是“摆设”:差点让我们返工的 AGPLv3

项目初期,出于“求稳”的心态,我们首选了行业老牌方案 MinIO。它是 Go 语言写的,生态成熟,S3 兼容性极好。我们的业务场景需要存储海量 4K 级别的训练样本,这对元数据管理和小文件读写提出了极高要求。

为了适配业务,我们在 MinIO 的基础上做了一些深度定制,主要是调整了纠删码策略以适配小文件场景。开发进展很顺利,直到我们将方案提交给法务部门进行合规审核,问题来了。

法务的观点非常明确:MinIO 采用的是 AGPLv3 协议。

很多技术人员(包括当时的我们)对协议的理解停留在“只要我们不分发二进制文件就没事”。但 AGPLv3 有一个极具杀伤力的条款——网络交互触发生效。这意味着,如果我们基于修改后的 MinIO 对外提供私有化部署服务,或者通过 SaaS 方式服务客户,就必须向用户开源所有修改过的代码。

对于 AI 公司而言,底层的存储调度逻辑往往包含了很多针对特定硬件和业务流的优化,这部分属于核心知识产权。如果被迫开源,不仅意味着技术细节暴露,还可能陷入复杂的法律纠纷。当时为了界定“修改”和“配置”的边界,我们甚至花费了不菲的咨询成本,依然无法完全消除合规隐患。

最终,技术团队做出了一个痛苦的决定:放弃已经开发适配两周的 MinIO 版本,重新选型。

这次教训让我们意识到:对于有商业化分发需求、或者核心代码需要保密的企业来说,协议自由度(如 Apache 2.0)是准入线,性能是加分项。 MinIO 很强,但它的协议定位更适合纯内部使用或愿意开源的场景。

二、技术实测:RustFS 凭什么打动我们?

在排除了协议风险后,RustFS 进入了我们的视野。它是一个基于 Rust 语言编写的开源对象存储,采用 Apache 2.0 协议。这意味着我们可以放心地基于它进行闭源二次开发,甚至将深度定制的版本随商业产品交付给客户,而无需公开源码。这正是我们需要的“商业友好”。

为了验证它能否扛住 AI 训练的流量,我们在相同的硬件环境下(32核 64G,NVMe + SATA 混合存储,万兆内网)对两者进行了实测。以下是真实的体验对比:

小文件性能:AI 场景的决胜点

AI 训练尤其是 CV(计算机视觉)任务,最大的痛点不是大文件传输,而是海量小文件的随机读取。

MinIO 的表现: 在 4K 小文件随机读的测试中,MinIO 的 IOPS 表现尚可,但在高并发下延迟抖动比较明显,偶尔会飙升至 80ms 以上。这会导致 GPU 训练卡顿,等待数据加载的时间变长。

RustFS 的表现: 这得益于 Rust 语言的零成本抽象和内存安全特性,RustFS 在小文件处理上非常惊艳。实测 4K 随机读 IOPS 比同环境下的 MinIO 高出约 30%,且延迟非常稳定,基本控制在 15ms 以内。这对提升 GPU 利用率至关重要。

资源占用与稳定性

MinIO: Go 语言的垃圾回收(GC)机制在低延迟场景下有时是个“变量”。开启纠删码后,MinIO 的内存占用偏高,CPU 在空闲时也有一定的基础开销。

RustFS: 部署后最直观的感受是“轻”。单二进制文件,依赖极少。Rust 的所有权机制从编译层解决了内存安全问题,运行两个月来,我们没有遇到过一次因内存泄漏导致的宕机。对于人手紧张的运维团队来说,这种“省心”的稳定性极具吸引力。

生态与功能的取舍

当然,RustFS 并非完美。作为一个新兴项目,它的社区体量确实不如 MinIO。

MinIO 的优势: 原生支持非常丰富的企业级功能,比如图片处理、完善的监控面板、极多的文档案例。遇到问题,搜一下基本能找到答案。

RustFS 的短板: 一些增值功能(如图片裁剪、智能检索)目前还不完善,我们需要自己通过 Nginx+Lua 或接 ELK 来补齐。此外,在适配国产化操作系统(如麒麟 OS)时,由于社区现成方案少,我们需要自己花时间排查。

三、落地建议:别被性能数字迷惑,先看协议

结合我们的这次“折腾”,给同行几条实在的建议:

1. 先过法务,再写代码: 如果你做的是 toB 业务,涉及私有化部署,一定要先搞清楚开源协议。不要等到开发完成了才发现协议不兼容,那种返工的痛苦我们深有体会。如果你的企业需要闭源保护技术壁垒,Apache 2.0(RustFS)比 AGPLv3(MinIO)安全得多。

2. 关注具体场景的性能: 不要只看官网的大文件吞吐量(这往往都很漂亮)。如果你的业务是 AI 训练、日志分析、网页存储,务必实测小文件 IOPS 和延迟。

3. 评估团队能力: MinIO 像一个成熟稳重的老手,文档全,坑少,适合“求稳”且无二次开发需求的团队;RustFS 像一个天赋异禀的新人,性能猛、协议松,但需要你的团队有一定的技术排查能力,去填补目前尚不完善的生态。

四、运维侧的一点点经验(附命令)

最后,分享一点我们在部署 RustFS 时的实操经验,主要是为了避开新手容易踩的坑。

目前 RustFS 的部署方式比较简洁,但要注意集群初始化的顺序。

准备工作(所有节点)

建议直接从官方 GitHub 或镜像源下载二进制文件,避免使用第三方不明链接。

1. 下载并赋予执行权限

wget https://github.com/rustfs/rustfs/releases/download/1.0.0-alpha.82/rustfs-linux-aarch64-gnu-latest.zip 
chmod +x rustfs-linux-aarch64-gnu-latest 
mv rustfs-linux-amd64 /usr/local/bin/rustfs

2. 初始化集群(仅在第一个节点执行)

这一步会生成元数据,一定要确保数据盘挂载正确。

注意:data-dir 和 meta-dir 建议分开挂载到不同磁盘,避免IO竞争

sudo rustfs init 
--name my-ai-cluster 
--data-dir /data/rustfs 
--meta-dir /meta/rustfs 
--replica 3

3. 加入节点(其他节点执行)

加入节点时,--peer 地址指向第一个节点的 IP。

sudo rustfs join 
--peer 192.168.1.10:9000 
--data-dir /data/rustfs 
--meta-dir /meta/rustfs

4. 启动服务

生产环境务必加 --daemon 参数,防止终端断开服务退出。

9000 端口为数据端口,8080 为管理控制台

sudo rustfs server 
--listen 0.0.0.0:9000 
--console 0.0.0.0:8080 
--daemon

结语

从 MinIO 切换到 RustFS,对于我们来说,不仅是一次技术栈的升级,更是一次关于“商业可行性”的校准。AGPLv3 并没有错,Apache 2.0 也没有绝对优劣,关键在于谁更匹配你当下的商业模式。

如果你也在为对象存储选型纠结,我们的建议是:先看协议红线,再测性能瓶颈。 在合规的基础上追求极致性能,才是企业级技术落地的最优解。

以下是深入学习 RustFS 的推荐资源:RustFS

官方文档: RustFS 官方文档- 提供架构、安装指南和 API 参考。

GitHub 仓库: GitHub 仓库 - 获取源代码、提交问题或贡献代码。

社区支持: GitHub Discussions- 与开发者交流经验和解决方案。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐