关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
原本想分享一下MinIO
,因为之前搭建过,用起来相比FastDFS
要好太多。但是最新版本的MinIO
动了一些手脚,一时间掀起千层浪,引来万千网友的口诛笔伐。
我们来看看网友整理的时间线:
- 2021.5.11
MinIO
官方宣布服务器协议切换到AGPL v3
的许可证 - 2022.7.19 首次公开指控
Nutanix
违反开源协议 - 2023.3.24 指控并撤销
weka
的软件使用许可证 - 2024.10 移除开源版本
K8s Operator
中的集成控制台 - 2025.5 开源版本删除了
WebUI
的功能
还依稀记得Redis
的协议切换导致网友的不满,其他类似的替代方案迅速崛起,直到Redis 8.0
原作者回归,坚持重新开源,这才消停。
而MinIO
为了将侧重点放在自己的付费产品上,在一定程度上在削弱开源产品的功能。使用者也纷纷担忧起来,很多都在寻找替代方案。
RustFS
则在此时迅速崛起,收到很多开发者的青睐。目前已经有8.1k
的star
了。

我们就一起看看RustFS
的庐山真面目吧!
02 RustFS
简介

2.1 介绍
RustFS
是一个使用 Rust
(全球最受欢迎的编程语言之一)构建的高性能分布式对象存储软件。与 MinIO
一样,它具有简单性、S3 兼容性、开源特性以及对数据湖、AI 和大数据的支持等一系列优势。
此外,与其他存储系统相比,它采用 Apache
许可证构建,拥有更好、更用户友好的开源许可证。由于以 Rust
为基础,RustFS
为高性能对象存储提供了更快的速度和更安全的分布式功能。
官方地址:rustfs.com/zh/
GitHub地址:github.com/rustfs/rust...
2.2 特性
- 高性能:使用 Rust 构建,确保速度和效率。
- 分布式架构:可扩展且容错的设计,适用于大规模部署。
- S3 兼容性:与现有 S3 兼容应用程序无缝集成。
- 数据湖支持:针对大数据和 AI 工作负载进行了优化。
- 开源:采用 Apache 2.0 许可证,鼓励社区贡献和透明度。
- 用户友好:设计简单,易于部署和管理。
官方也对比了和MinIO
的性能,大约是MinIO
的2倍。

03 部署
支持多种部署方式

为了方便,我们直接使用容器部署。
sh
# 拉取镜像
docker pull rustfs/rustfs:latest
# 启动镜像
docker run -p 9000:9000 --name rustfs \
###########
-e RUSTFS_ACCESS_KEY=rustfsadmin \
-e RUSTFS_SECRET_KEY=rustfsadmin \
##########
-v /mnt/rustfs/data:/data \
-d rustfs/rustfs
RUSTFS_ACCESS_KEY
和RUSTFS_SECRET_KEY
使用管理页面登录的用户名和密码。默认就是rustfsadmin/rustfsadmin
,可以通过这两个参数修改。
3.1 管理界面
直接访问IP + 端口
就可以进入后台管理页面。

使用配置的账号登录即可。
进入管理界面之后:

3.2 主要功能
文件浏览器:
在这里可以功能创建存储的桶,以及管理桶内的文件。
策略
配置账号只读、只写等,还可以新建策略。

性能
整个存储空间的报告。

04 Java SDK
4.1 Maven依赖
xml
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>${latest.version}</version>
</dependency>
4.2 初始刷客户端
java
static S3Client s3;
static S3Presigner presigner;
String bucket = "my-bucket";
@BeforeAll
static void client() {
s3 = S3Client.builder()
// RustFS 地址
.endpointOverride(URI.create("http://127.0.0.1:9000"))
// 可写死,RustFS 不校验 region
.region(Region.US_EAST_1)
// 用户名和密码
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create("rustfsadmin", "rustfsadmin")
)
)
// 关键配置!RustFS 需启用 Path-Style
.forcePathStyle(true)
.build();
}
4.3 创建Bucket
java
@Test
void createBucket() {
try {
// 是否存在
if (!existBucket(bucket)) {
// 创建桶
s3.createBucket(CreateBucketRequest.builder().bucket(bucket).build());
}
System.out.println("Bucket created: " + bucket);
} catch (BucketAlreadyExistsException | BucketAlreadyOwnedByYouException e) {
System.out.println("Bucket already exists.");
}
}
boolean existBucket(String bucketName) {
try {
s3.headBucket(request -> request.bucket(bucketName));
} catch (NoSuchBucketException e) {
return false;
}
return true;
}
4.4 上传文件
java
@Test
void uploadFile() {
s3.putObject(
// 设置上传文件的要保存的桶和名称
PutObjectRequest.builder().bucket(bucket).key("test.png").build(),
// 文件的路径
Paths.get("image_1750938250722.png")
);
System.out.println("Uploaded image_1750938250722.png");
}
4.5 查看文件
文件的查看需要使用其他客户端:
java
// 预览客户端,当然也可以直接用来上传,返回文件地址
S3Presigner presigner = S3Presigner.builder()
.endpointOverride(URI.create("http://10.100.213.25:9000"))
.region(Region.US_EAST_1)
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create("rustfsadmin", "rustfsadmin")
)
).build();
文件查看
java
@Test
void getFile() {
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucket).key("test.png").build();
GetObjectPresignRequest signRequest = GetObjectPresignRequest.builder()
.getObjectRequest(getObjectRequest)
// 设置图片的有效期
.signatureDuration(Duration.ofMinutes(15))
.build();
PresignedGetObjectRequest request = presigner.presignGetObject(signRequest);
System.out.println(request.url());
}
还有其他功能就不一一演示了,如分片上传,图片的删除等。
05 小结
总体感觉MinIO
和RustFS
差不多,但是小编觉得MinIO
的API
用起来可能更舒服一些,可能是因为先入为主吧。在企业开发中软件的升级是慎之又慎的,不会频繁升级软件的,所以已经在用的老版MinIO
依然杠杠的。
现在各种云厂商都有自己的文件存储系统,使用云厂商的企业似乎不用操心这些问题。如果做MinIO
和RustFS
的选型,你会怎么选呢?