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 文件管理命令(如 cp
和 ls
)类似的命令,但专为本地和远程存储系统设计。它完全兼容 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
登录。
然后我们可以创建一个桶:
⚠️ 注意:某些高级功能(如版本控制)在容器化部署中不可用。
接着,我们可以进入 Object Browser 页面,点击新建的桶。在这里,我们可以:
总的来说,控制台的功能与命令行客户端基本一致,但也有几点差异:
- 控制台不支持跨桶移动对象(命令行支持)
- 控制台缺少命令行中的一些命令,如
diff
、du
、pipe
等
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 是替代云存储的理想选择。