弃用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.1kstar了。

我们就一起看看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_KEYRUSTFS_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 小结

总体感觉MinIORustFS差不多,但是小编觉得MinIOAPI用起来可能更舒服一些,可能是因为先入为主吧。在企业开发中软件的升级是慎之又慎的,不会频繁升级软件的,所以已经在用的老版MinIO依然杠杠的。

现在各种云厂商都有自己的文件存储系统,使用云厂商的企业似乎不用操心这些问题。如果做MinIORustFS的选型,你会怎么选呢?

相关推荐
AAA修煤气灶刘哥7 小时前
后端人必看!配置中心这玩意儿,用 Nacos 玩明白能少熬 3 个夜
java·后端·spring cloud
七夜zippoe7 小时前
Java 技术支撑 AI 系统落地:从模型部署到安全合规的企业级解决方案(一)
java·人工智能·安全
小蒜学长7 小时前
vue飞自在酒店管理系统(代码+数据库+LW)
java·数据库·spring boot·后端
MrSYJ7 小时前
别告诉我你还不会OAuth 2.0客户端的认证:OAuth2ClientAuthenticationFilter。
java·后端·spring
北京_宏哥7 小时前
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-38-屏幕截图利器-上篇(详细教程)
java·前端·面试
二闹7 小时前
别再混淆了 is 和 ==的区别
后端·python
awei09167 小时前
SpringBoot3中使用Caffeine缓存组件
java·缓存·springboot·springboot3
用户098 小时前
Kotlin后端开发指南
android·后端
双向338 小时前
K8s Pod CrashLoopBackOff:从镜像构建到探针配置的排查过程
后端