https://mp.weixin.qq.com/s/YFt0goPV6dIFKkPGvp_nhQ

原本想分享一下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;
Stringbucket="my-bucket";

@BeforeAll
staticvoidclient() {
    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
voidcreateBucket() {
    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.");
    }
}

booleanexistBucket(String bucketName) {
    try {
        s3.headBucket(request -> request.bucket(bucketName));
    } catch (NoSuchBucketException e) {
        returnfalse;
    }
    returntrue;
}

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
voidgetFile() {
    GetObjectRequestgetObjectRequest= GetObjectRequest.builder()
            .bucket(bucket).key("test.png").build();

    GetObjectPresignRequestsignRequest= GetObjectPresignRequest.builder()
            .getObjectRequest(getObjectRequest)
            // 设置图片的有效期
            .signatureDuration(Duration.ofMinutes(15))
            .build();

    PresignedGetObjectRequestrequest= presigner.presignGetObject(signRequest);
    System.out.println(request.url());
}

还有其他功能就不一一演示了,如分片上传,图片的删除等。

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

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

文档更新时间: 2025-09-12 07:58   作者:admin