最近一直在搞SpringAI。
为了处理用户上传的PDF、RAG切分的块、多轮对话的临时JSON等,我使用了老牌分布式存储系统MinIO。因为老牌所以生态较为完善。
但是开始做项目的时候我发现了MinIO的不友好的地方。
1. 严苛的AGPL协议
MinIO采用的是极度严格的AGPL协议,对一般人极其不友好。
2. 小文件带来的I/O问题
做RAG向量化,需要把大文档切成无数个小文本块。这种海量小文件的疯狂读写,MinIO显得有点“重”。高并发跑起来不够丝滑,比较耗费资源。
我开始寻找MinIO的平替,最终在GitHub挖到了一个项目:RustFS。
什么是RustFS?
一句话总结:它是用Rust写的对象存储系统,MinIO的完美平替。
有什么优点呢?
1. 彻底告别“开源协议”焦虑
RustFS采用的是目前对商业最友好的Apache 2.0协议。可以随意修改,随意打包,没有任何法务问题。
2. 专治“小文件”高并发,性能离谱
得益于Rust没有垃圾回收,导致他处理4kb小文件的速度是MinIO的2.3倍。RAG海量数据入库时,肉眼可见地变流畅了。并且打包后只有100MB左右,极轻量。
3.协议完美兼容
它完美兼容 S3 协议。从MinIO切到RustFS,不需要换SDK,一句代码都不用改
怎么用?
第一步:一行命令把它跑起来
用Docker直接搞定
先拉取对象docker pull rustfs/rustfs
启动容器
docker run -d \
--name rustfs_local \
-p 9000:9000 \
-p 9001:9001 \
-v /tmp/rustfs/data:/data \ //本地路径用来挂载对象数据
rustfs/rustfs:latest \
/data第二步:修改 Spring Boot 的yaml配置
打开application.yml,把原本MinIO的连接地址换掉
spring:
s3:
# 直接把 ip 指向刚用 docker 跑起来的 RustFS 地址
endpoint: http://127.0.0.1:9000
access-key: admin
secret-key: admin123
#access-key和secret-key需要在RustFS的后台管理进行生成
# S3 协议的通用配置,照旧保留即可
path-style-access: true
region: us-east-1第三步:代码层直接调用
业务代码怎么写?以前怎么写,现在还怎么写。因为RustFS是完美兼容S3协议的。
比如存一段 Agent 的对话上下文:
@Autowired
private S3Client s3Client;
public void saveAgentContext(String bucket, String chunkId, String jsonContent) {
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucket)
.key("agent/context/" + chunkId + ".json")
.build();
s3Client.putObject(request, RequestBody.fromString(jsonContent));
}RustFS管理后台
运行成功后,访问localhost:9001进入管理后台
- 用户名: rustfsadmin
- 密码: rustfsadmin
在后台可以进行一系列的操作:
- 创建和管理Bucket
- 查看文件列表
- 配置访问策略
- 生成Key——access-key和secret-key


总结
RustFS对比MinlO的优势
- 商用协议宽松;
- 资源占用更少,性能更高;
- 配置改两行就能上,十分方便。






