1. 简介

MinIO 是一个高性能的对象存储系统,设计初衷是作为云原生存储系统的替代方案。它的一大亮点是 API 完全兼容 Amazon S3

在本文中,我们将快速上手 MinIO 的基本操作。

2. 关于 MinIO

MinIO 从一开始就设计成与 Amazon S3 API 完全兼容的替代方案。官方宣称它是兼容性最高、性能和扩展性表现相当出色的 S3 替代品。

支持多种部署方式:MinIO 可以作为本地应用运行在主流架构上,也支持使用 Docker 或 Kubernetes 进行容器化部署。

此外,MinIO 是开源软件,企业可以在 AGPLv3 许可证 下自由使用。不过要注意的是,这种使用方式仅提供在线文档和社区支持。对于大型企业,MinIO 也提供付费订阅服务,包含专业的技术支持。

由于其 S3 兼容性、灵活的部署方式和开源特性,MinIO 非常适合用于开发、测试以及 DevOps 场景

2.1. 对象存储的工作原理

对象存储的概念与标准 Unix 文件系统类似,但 它使用的是“桶(bucket)”和“对象(object)”的概念,而不是目录和文件

桶可以像目录一样嵌套形成层级结构,而对象则是一组任意的字节数据,可以是图片、PDF 或其他任何文件类型。

一个典型的对象存储结构可能如下所示:

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

与文件系统类似,桶和对象也可以设置权限,实现细粒度的访问控制,特别适用于用户众多的大型组织。

3. 安装 MinIO

如前所述,MinIO 几乎支持所有主流平台。它为 Windows、Linux 和 macOS 提供了独立的安装包。但在开发和测试场景下,最便捷的方式是使用容器化部署

我们可以通过以下命令运行一个单机版的 MinIO 容器:

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

虽然容器化部署非常适合评估 MinIO,但 ❌ 需要注意一些高级功能(如版本控制、对象锁定、桶复制)无法使用。这些功能需要分布式部署,而单机模式不支持。

4. 使用 MinIO

有多种方式可以与 MinIO 服务器交互,管理桶和对象。下面我们来一一介绍。

4.1. MinIO 客户端(mc)

MinIO 客户端(mc) 提供了与 Unix 文件管理命令(如 cpls)类似的命令,但专为本地和远程存储系统设计。它完全兼容 AWS S3,语法也与 AWS CLI 类似。

使用 MinIO 客户端的第一步是配置其与存储系统的连接。我们可以使用以下命令连接到上面的容器化部署:

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

这条命令为本地 9000 端口上的 MinIO 容器设置了一个别名。默认的访问密钥和密码均为 minioadmin

可以通过 admin 子命令验证连接:

$ 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

现在就可以执行基本操作,如创建桶和对象。许多 mc 子命令与 Unix 命令相似:

  • cp:在文件系统之间复制文件或对象
  • ls:列出桶中的对象
  • mb:创建桶(类似 Linux 的 mkdir
  • mv:移动对象或文件
  • rb:删除桶(类似 Linux 的 rmdir
  • rm:删除对象或文件

大多数命令都支持本地文件系统和云存储系统。例如,我们可以通过以下命令创建桶、上传文件、移动对象并删除桶:

$ mc mb user1
$ mc cp ~/Resume.pdf user1
$ 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 控制台

另一种管理 MinIO 数据的方式是使用基于 Web 的管理控制台。对于容器化部署,我们只需在浏览器中访问 http://127.0.0.1:9001,使用默认用户名和密码 minioadmin / minioadmin 登录。

然后我们可以创建一个桶:

minio admin console create bucket

⚠️ 注意:某些高级功能(如版本控制)在容器化部署中不可用

接着,我们可以进入 Object Browser 页面,点击新建的桶。在这里,我们可以:

  • 使用 Create new path 创建子路径(类似子目录):

    minio admin console create path

  • 上传文件作为对象:

    minio admin console upload file

总的来说,控制台的功能与命令行客户端基本一致,但也有几点差异:

  • 控制台不支持跨桶移动对象(命令行支持)
  • 控制台缺少命令行中的一些命令,如 diffdupipe

4.3. MinIO Java SDK

最后,我们来看如何通过 Java SDK 使用 MinIO。首先在项目中添加依赖:

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

使用 SDK 的第一步是创建客户端实例:

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())) {
    // 读取流
}

这只是 Java SDK 的一小部分功能。由于 MinIO 完全兼容 S3,相同的代码也可以直接用于 Amazon S3

5. 总结

本文简要介绍了 MinIO,一个完全兼容 S3 的对象存储引擎。虽然它是一个生产级别的存储系统,但同样适用于开发和测试环境。由于其开源、部署灵活和 S3 兼容的特性,MinIO 是替代云存储的理想选择。


原始标题:Introduction to MinIO | Baeldung