弃用MinIO,拥抱全新一代分布式文件系统RustFS
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
为高性能对象存储提供了更快的速度和更安全的分布式功能。
官方地址:https://rustfs.com/zh/
GitHub地址:https://github.com/rustfs/rustfs
2.2 特性
- 高性能:使用 Rust 构建,确保速度和效率。
- 分布式架构:可扩展且容错的设计,适用于大规模部署。
- S3 兼容性:与现有 S3 兼容应用程序无缝集成。
- 数据湖支持:针对大数据和 AI 工作负载进行了优化。
- 开源:采用 Apache 2.0 许可证,鼓励社区贡献和透明度。
- 用户友好:设计简单,易于部署和管理。
官方也对比了和MinIO
的性能,大约是MinIO
的2倍。
03 部署
支持多种部署方式
为了方便,我们直接使用容器部署。
# 拉取镜像
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依赖
<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>${latest.version}</version></dependency>
4.2 初始刷客户端
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
@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 上传文件
@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 查看文件
文件的查看需要使用其他客户端:
// 预览客户端,当然也可以直接用来上传,返回文件地址
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();
文件查看
@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
的选型,你会怎么选呢?