1. 概述

MinIO 是一个高性能分布式对象存储器服务器。旨在成为云存储服务的开源替代品,兼容亚马逊S3云存储服务接口。

本文我们将学习什么是MinIO,如何安装、使用以及如何在Java中访问。

2. 关于 MinIO

MinIO 从一开始就定位是完全兼容亚马逊 S3 存储 API 的开源替代品。他们声称自己是兼容性最强的 S3 替代方案,同时还提供可比的性能和可扩展性。

MinIO 提供了多种部署方式。它可以裸机部署,也可以使用 Docker 或 Kubernetes 容器化技术部署。

此外,MinIO是开源软件。组织可以根据AGPLv3许可证的条款免费使用它。只需注意,这个选项除了在线文档和MinIO用户社区外没有其他支持。对于大型企业,也提供付费订阅和专门的支持服务。

2.1. 对象存储是如何工作的

对象存储的概念与操作系统的文件系统类似,但我们 使用的是存储桶(Buckets)和对象(Objects),而不是目录和文件。

存储桶可以像文件系统目录一样嵌套, 而对象可以被视为只是一组字节的集合。这些集合可以是任意的字节数组,也可以是普通文件,如图像、PDF等。

对象存储系统示例:

/
/images/
  imge1.png
  image2.jpg
/videos/
  video1.mp4
/users/
  /john.doe/
    3rd quarter revenue report.docx

和目录和文件一样,存储桶和对象也可以拥有权限。允许对数据进行细粒度的访问控制,尤其是在拥有众多用户的大型组织中。

3. 安装 MinIO

如前所述 MinIO 支持多种部署方式,提供 Windows、Linux 和 MacOS 安装程序。为了开发测试,我们使用Docker安装单机版 MinoIO 服务器:

$ docker run -p 9000:9000 -p 9001:9001 \
  quay.io/minio/minio server /data --console-address ":9001"

需要说明的是,单机版只适用于测试学习。一些高级功能(如版本控制、对象锁定和存储桶复制)无法使用,这些功能需要 MinIO 的分布式部署。

4. 使用 MinIO

安装完MinIO后,我们开始学习如何使用它。我们可以通过命令行、控制台界面、SDK 等方式与 MinIO 服务器进行交互,下面我们分别进行介绍。

4.1. MinIO 客户端

MinIO client 提供了与Linux上相同的文件命令, 例如 cpls 等。 but is designed for both local and remote storage systems. It’s fully compatible with AWS S3, and its syntax mimics that of the AWS client tool.

使用 MinIO Client 之前,我们需要先配置URL、账号密码这些:

$ mc alias set docker_minio http://127.0.0.1:9000 minioadmin minioadmin

This command creates an alias to a containerized deployment of MinIO, which is available on localhost, port 9000. The default access key and secret key are both minioadmin in this deployment.

使用 mc admin 命令验证连接是否OK:

$ mc admin info docker_minio

   127.0.0.1:9000
   Uptime: 3 minutes
   Version: 2023-05-04T21:44:30Z
   Network: 1/1 OK
   Drives: 1/1 OK
   Pool: 1

Pools:
   1st, Erasure sets: 1, Drives per erasure set: 1

1 drive online, 0 drives offline

现在,我们可以开始执行基本操作,例如创建存储桶和对象。大部分 MinIO 子命令用法和Linux是一样的:

  • cp: 文件复制
  • ls: 列出存储桶里的文件/对象
  • mb: 新建桶 (类似与Linux中的 mkdir)
  • mv: Move/relocate a file or object from one file system to another.
  • rb: 删除桶 (类似与Linux中的 rmdir).
  • rm: 删除对象

Most of these sub-commands work on both local file systems and cloud storage. For example, we can use the following command sequence to create new a new bucket, copy a file into that bucket, move the object between buckets, then remove a bucket:

$ mc mb user1
$ mc cp ~/Resume.pdf prattm
$ mc mb user2
$ mc cp user1/Resume.pdf user2
$ mc rb user1
$ mc ls user2
[2023-05-15 21:39:10 MDT]     491K Resume.pdf

4.2. MinIO 控制台

Another way to manage data in a MinIO deployment is with the web-based admin console. With the containerized deployment, we start by opening the address http://127.0.0.1:9001 in a web browser. We log in using the default credentials of minioadmin / minioadmin.

From there, we can create our first bucket:

minio admin console create bucket

Recall that not all options, such as versioning, will be applicable to our containerized deployment.

Now, we can navigate to Object Browser and click on our new bucket. On this screen, we have several options. First, we can create child buckets using the Create new path button:

minio admin console create path

We can also upload files as new objects inside the bucket:

minio admin console upload file

In general, the MinIO admin console’s functionality is equivalent to that of the command-line client. However, it does have some minor differences.

First, moving objects between buckets is not possible with the client like it is with the command-line client.

Additionally, the command-line client also has a number of sub-commands that do not exist in the admin console. For example, the diff, du, and pipe sub-commands all mimic standard Unix commands and do not have an equivalent in the admin console.

4.3. Java SDK 集成

MinIO Maven 依赖

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>

第一步需要,创建 MinioClient 实例:

MinioClient minioClient =
  MinioClient.builder()
    .endpoint("http://127.0.0.1:9000")
    .credentials("minioadmin", "minioadmin")
    .build();

创建存储桶:

minioClient.makeBucket(
  MakeBucketArgs
    .builder()
    .bucket("user1")
    .build());

将文件作为对象上传到该存储桶中:

minioClient.putObject(PutObjectArgs
  .builder()
  .bucket("user1")
  .object("Resume.pdf")
  .stream(new FileInputStream("/tmp/Resume.pdf")
  .build());

从存储桶中获取对象:

try (InputStream stream =
  minioClient.getObject(GetObjectArgs
    .builder()
    .bucket("user2")
    .object("Resume.pdf")
    .build())) {
    // Read the stream
}

这只是Java SDK的冰山一角。值得一提的是,由于MinIO完全兼容S3协议,这些代码同样适用于Amazon S3服务。这意味着你可以轻松地在MinIO和Amazon S3之间切换,而无需修改代码。

5. 总结

本文我们简单介绍了MinIO这款对象存储引擎。MinIO不仅完全兼容S3协议,还是一个功能强大的生产级存储系统。它的应用场景非常广泛,不仅限于对象存储。作为一个开源项目,MinIO可以灵活部署在任何环境中。再加上它与S3的完全兼容性,MinIO成为了开发和测试环境中的理想之选。无论是用作临时存储还是模拟S3环境,MinIO都能轻松胜任。