Minio 简介
The Object Storage for AI Data Infrastructure
MinIO
是一个高性能、兼容 S3
协议的对象存储系统。它专为大规模的人工智能/机器学习、数据湖和数据库工作负载而设计。它是基于软件定义的,可以运行在任何云端或本地基础设施上。MinIO
采用双重许可,既有开源的 GNU AGPL v3
许可证,也有商业企业许可证。
官网 min.io/ Github github.com/minio
MinIO 主要特点和功能:
特点 | 描述 |
---|---|
对象存储 | MinIO 以对象的形式存储数据,每个对象由唯一的键(key)标识,并可以存储任意大小的数据。 |
高可用性 | MinIO 通过分布式部署和数据冗余来提供高可用性。它支持多副本复制和纠删码(erasure coding)等机制,确保数据的安全性和可靠性。 |
水平扩展 | MinIO 可以在多个节点上进行水平扩展,从而处理大规模的数据工作负载。它能够自动负载均衡和并行处理请求,以实现高吞吐量和低延迟。 |
兼容性 | MinIO 遵循 Amazon S3 API 的标准,因此与现有的 S3 生态系统和应用程序兼容。这使得将现有的 S3 应用程序迁移到 MinIO 变得非常简单。 |
安全性 | MinIO 提供多种安全控制机制,包括访问控制列表(ACLs)、策略管理、加密传输(TLS/SSL)等,以确保数据的安全性和隐私性。 |
监控和管理 | MinIO 提供了丰富的监控和管理功能,包括实时性能指标、日志记录、事件通知等。通过这些功能,用户可以对存储系统进行监控、故障排除和性能优化。 |
简单易用 | MinIO 的设计目标之一是提供简单易用的存储解决方案。它具有直观的 Web 管理界面和命令行工具,使得用户能够快速配置和操作存储系统。 |
本文将介绍 Minio
对象存储服务的基本知识,并提供了如何在单机环境中使用 Docker
或 Docker-Compose
部署 Minio
服务的说明。此外,还简要介绍了使用 Minio
控制台进行基本操作的方法,以及如何使用 OpenSSL
生成具有 SAN
扩展的自签名证书。我们还会涉及到 Minio
客户端工具 mc
的使用,并演示如何通过 Go
的 SDK
连接和操作 Minio
服务。通过本文,你将对 Minio
的基本概念和工具应用有一个全面的了解。
Minio 服务部署
Docker 单机部署
Docker 方式
bash
# 拉取MinIO镜像
root@app-server:~# docker pull minio/minio
root@app-server:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
minio/minio latest 88c665b1183a 9 days ago 147MB
# 创建卷目录和证书目录
root@app-server:~# mkdir -p /opt/minio/{data,config}
# 运行MinIO对象存储服务器
root@app-server:~# docker run -d \
--name minio-server \
--restart always \
-p 9000:9000 -p 9090:9090 \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
-v /opt/minio/data:/data \
-v /opt/minio/config:/root/.minio/certs \
minio/minio \
server /data --console-address ":9090"
# 查看容器状态
root@app-server:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e948d2be72fd minio/minio "/usr/bin/docker-ent..." 6 seconds ago Up 6 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp minio-server
# 进入容器内部
root@app-server:~# docker exec -it minio-server /bin/bash
# 查看MinIO版本(server)
bash-5.1# minio --version
minio version RELEASE.2023-11-20T22-40-07Z (commit-id=f56a182b719cb262e0628ef3f544371ea8842551)
Runtime: go1.21.4 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2023 MinIO, Inc.
# 查看MinIO版本(client)
bash-5.1# mc --version
mc version RELEASE.2023-11-20T16-30-59Z (commit-id=937b34616f012ad30e1cd6fd61e1da25ff931648)
Runtime: go1.21.4 linux/amd64
Copyright (c) 2015-2023 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
# 查看暴露的端口
root@app-server:~# lsof -i tcp:9090
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 16160 root 4u IPv4 93746 0t0 TCP *:9090 (LISTEN)
docker-pr 16166 root 4u IPv6 94274 0t0 TCP *:9090 (LISTEN)
# 关闭容器
root@app-server:~# docker stop e948d2be72fd
e948d2be72fd
# 删除容器
root@app-server:~# docker rm e948d2be72fd
e948d2be72fd
Docker-compose 方式
bash
# 编辑docker-compose配置文件
root@app-server:~# vim docker-compose.yml
# 启动docker-compose
root@app-server:~# docker-compose up -d
Creating minio_server ... done
# 查看容器状态
root@app-server:~# docker-compose ps -a
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------------------
minio-server /usr/bin/docker-entrypoint ... Up 0.0.0.0:9000->9000/tcp,:::9000->9000/tcp, 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp
# 查看启动日志
root@app-server:~# docker-compose logs
Attaching to minio-server
minio-server | WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables
minio-server | MinIO Object Storage Server
minio-server | Copyright: 2015-2023 MinIO, Inc.
minio-server | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio-server | Version: RELEASE.2023-11-20T22-40-07Z (go1.21.4 linux/amd64)
minio-server |
minio-server | Status: 1 Online, 0 Offline.
minio-server | S3-API: http://172.24.0.2:9000 http://127.0.0.1:9000
minio-server | Console: http://172.24.0.2:9090 http://127.0.0.1:9090
minio-server |
minio-server | Documentation: https://min.io/docs/minio/linux/index.html
minio-server | Warning: The standard parity is set to 0. This can lead to data loss.
docker-compose
配置文件
yaml
version: '3'
services:
minio:
container_name: minio-server
image: minio/minio # Image name for the MinIO container
ports:
- 9000:9000 # Used to access the MinIO object storage service
- 9090:9090 # Used to access the MinIO console
environment:
- MINIO_ROOT_USER=minioadmin # MinIO user
- MINIO_ROOT_PASSWORD=minioadmin # MinIO password
volumes:
- /opt/minio/data:/data # Maps a data volume for storing MinIO data
- /opt/minio/config:/root/.minio/certs # Maps a configuration volume for storing MinIO certificates
command: server /data --console-address ":9090" # Starts the MinIO server and specifies the console address
restart: always # Container restart policy, always restarts the container
MinIO 简单使用
Console 控制台操作
-
登录
MinIO
控制台 -
创建一个存储桶
-
从本地上传一张图片
- 等待上传完毕
- 观察下数据卷的变化
bash
root@app-server:~# tree /opt/minio/
/opt/minio/
├── config # MinIO 对象存储服务器的配置目录
│ ├── CAs
│ ├── private.key # 私钥文件
│ └── public.crt # 公钥证书文件
└── data # MinIO 对象存储服务器的数据目录
└── images # 创建的 bucket 存储桶
└── portal.jpeg # 原文件被分成多个部分,并以 UUID 作为子目录的名称
├── dff78ec9-c903-483f-a4c9-10ce67a29cda
│ └── part.1 # 文件分片
└── xl.meta # xl.meta 文件是与原文件相关的元数据文件,如文件大小、创建日期等
7 directories, 4 files
开启 TLS 访问
以下是使用 OpenSSL 生成自签名证书,用于在本地 "MacOS 环境下" 进行 HTTPS 的测试方案。
虽然这是一个自签名证书,但在受信任的第三方机构中可能不会被接受,因此仅适用于测试、开发或内部使用等目的。建议在生产环境中使用由受信任的证书颁发机构(CA)签发的证书。
在浏览器兼容性方面,新版本主要针对域名认证放弃了 Common Name (CN) 字段,因此该部分会介绍使用 Subject Alternative Name (SAN),以支持当前流行的主流浏览器。
SAN 是 SSL 标准 x509 中定义的扩展。通过使用 SAN 字段的 SSL 证书,可以扩展该证书支持的域名,使其能够解析多个不同域名。
CA 根证书制作
- 生成根证书密钥
bash
# 建议长度为4096
root@app-server:~# openssl genrsa -out ca.key 4096
- 生成自签名根证书
bash
# 在此过程中,需要交互回答一些关于组织、共享主题以及其他必要信息的问题
root@app-server:~# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN # Country/Region 的两个字母代码
State or Province Name (full name) [Some-State]:Beijing # 省/州全名
Locality Name (eg, city) []:Beijing # 城市名称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tech # 组织名称
Organizational Unit Name (eg, section) []:infra # 组织单位名称
Common Name (e.g. server FQDN or YOUR name) []:mystic.tech # 颁发者名字
Email Address []:mystic.tech@mail.com # 邮箱地址
使用根证书来签署子证书
- 生成证书密钥
bash
root@app-server:~# openssl genrsa -out minio-server.key 4096
- 填写
OpenSSL
配置文件以添加SANs
bash
root@app-server:~# cat minio-san.conf
[req]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = CN # 国家代码
stateOrProvinceName = Beijing # 省份名称
localityName = Beijing # 城市名称
organizationName = Tech # 公司名称
commonName = minio-console.net # 域名或 IP 地址
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = minio-console.net # DNS 域名解析
DNS.2 = www.minio-console.net
IP.1 = 10.2.102.244 # IP 地址
- 创建
CSR
证书请求,它将包含在证书中的信息
bash
# 推荐使用 sha256 算法
root@app-server:~# openssl req -new -key minio-server.key -out minio-server.csr -config minio-san.conf -sha256
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
CN []:CN
Beijing []:Beijing
Beijing []:Beijing
Tech []:Tech
minio-console.net []:minio-console.net
# 检查 CSR 信息
root@app-server:~# openssl req -text -in minio-server.csr | grep -A 4 "Attributes"
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:minio-console.net, DNS:www.minio-console.net, IP Address:10.2.102.244
Signature Algorithm: sha256WithRSAEncryption
- 使用私钥和
CSR
创建证书:
bash
# 使用私钥签署 CSR,生成一个有效期为 10 年的自签名证书
root@app-server:~# openssl x509 -req -days 3650 -in minio-server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out minio-server.crt -extfile minio-san.conf -extensions v3_req
Certificate request self-signature ok
subject=C = CN, ST = Beijing, L = Beijing, O = Tech, CN = minio-console.net
# 检查证书相关信息
root@app-server:~# openssl x509 -text -in minio-server.crt | grep -A 6 "X509v3 extensions"
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:minio-console.net, DNS:www.minio-console.net, IP Address:10.2.102.244
X509v3 Subject Key Identifier:
A8:48:0D:8F:6A:7A:E4:E2:FB:5C:B7:19:49:FB:13:1E:72:1B:CC:81
X509v3 Authority Key Identifier:
C9:51:42:CF:36:58:93:80:49:41:4F:1F:90:AE:FA:44:67:8D:9B:F9
MinIO 证书配置使生效
- 将私/公钥证书文件拷贝到
MinIO
的/root/.minio/certs
文件夹,分别取名为private.key
和public.crt
。
bash
# 将 private.key 拷贝到 /opt/minio/config/ 目录
root@app-server:~# cp -a minio-server.key /opt/minio/config/private.key
# 将 public.crt 拷贝到 /opt/minio/config/ 目录
root@app-server:~# cp -a minio-server.crt /opt/minio/config/public.crt
# 验证拷贝结果
root@app-server:~# ll /opt/minio/config/
total 12
drwx------ 2 root root 4096 Nov 30 00:20 CAs
-rw------- 1 root root 3268 Dec 1 02:29 private.key
-rw-r--r-- 1 root root 2098 Dec 1 02:44 public.crt
- 重启容器,加载配置:
bash
# 使用 docker-compose 重启容器
root@app-server:~# docker-compose restart
Restarting minio-server ... done
# 查看容器日志
root@app-server:~# docker-compose logs
minio-server | Exiting on signal: TERMINATED
minio-server | WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables
minio-server | MinIO Object Storage Server
minio-server | Copyright: 2015-2023 MinIO, Inc.
minio-server | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio-server | Version: RELEASE.2023-11-20T22-40-07Z (go1.21.4 linux/amd64)
minio-server |
minio-server | Status: 1 Online, 0 Offline.
minio-server | S3-API: https://172.24.0.2:9000 https://127.0.0.1:9000 # 可以看到访问协议已从http改为https
minio-server | Console: https://172.24.0.2:9090 https://127.0.0.1:9090
minio-server |
minio-server | Documentation: https://min.io/docs/minio/linux/index.html
minio-server | Warning: The standard parity is set to 0. This can lead to data loss.
本地安装证书并验证
- 本地添加
hosts
解析,以及ping
测试
bash
➜ ~ echo "10.2.102.244 app-server minio-console.net" | sudo tee -a /etc/hosts
Password: xxx
10.2.102.244 app-server minio-console.net
➜ ~ ping -c 3 minio-console.net
PING app-server (10.2.102.244): 56 data bytes
64 bytes from 10.2.102.244: icmp_seq=0 ttl=50 time=112.644 ms
64 bytes from 10.2.102.244: icmp_seq=1 ttl=50 time=14.433 ms
64 bytes from 10.2.102.244: icmp_seq=2 ttl=50 time=70.070 ms
--- app-server ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 14.433/65.716/112.644/40.213 ms
- 将
public.crt
拉取到本地MacOS
端
bash
➜ ~ scp root@app-server:/opt/minio/config/public.crt Downloads/
public.crt 100% 2098 61.7KB/s 00:00
➜ ~ ll Downloads/public.crt
-rw-r--r-- 1 mystic staff 2098 12 1 19:00 Downloads/public.crt
- 图形化操作或如下命令打开进行安装,需要输入密码
- 打开钥匙串 -> 双击目标条目 -> 始终信任此证书 -> 关闭窗口
- 重新登陆控制台,可以点击浏览器访问栏查看证书(该连接是安全的
HTTPS
)
mc 客户端命令
MinIO Client(mc)为 ls、cat、cp、mirror、diff、find 等 UNIX 命令提供了现代替代方案。它支持文件系统和与 Amazon S3 兼容的云存储服务(AWS Signature v2 和 v4)。
MacOS Brew 安装
bash
➜ ~ brew install minio/stable/mc
mc 帮助手册
bash
NAME:
mc - 对象存储和文件系统的 MinIO 客户端
USAGE:
mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]
COMMANDS:
alias 管理配置文件中的服务器凭据
ls 列出桶和对象
mb 创建一个桶
rb 删除一个桶
cp 复制对象
mv 移动对象
rm 删除对象
mirror 同步对象到远程站点
cat 显示对象内容
head 显示对象的前 n 行
pipe 将 STDIN 流传输到对象
find 搜索对象
sql 在对象上运行 SQL 查询
stat 显示对象元数据
tree 以树状格式列出桶和对象
du 递归统计磁盘使用情况
retention 为对象设置持有
legalhold 管理对象的合法持有
support 支持相关命令
license 许可证相关命令
share 生成临时访问对象的 URL
version 管理桶版本控制
ilm 管理桶生命周期
quota 管理桶配额
encrypt 管理桶加密配置
event 管理对象通知
watch 监听对象通知事件
undo 撤销 PUT/DELETE 操作
anonymous 管理对桶和对象的匿名访问
tag 管理桶和对象的标签
diff 列出两个桶之间对象名称、大小和日期的差异
replicate 配置服务器端桶复制
admin 管理 MinIO 服务器
idp 管理 MinIO 身份提供者服务器配置
update 将 mc 更新到最新版本
ready 检查集群是否就绪
ping 执行活性检查
od 测量单个流的上传和下载
batch 管理批处理作业
GLOBAL FLAGS:
--autocompletion 为您的 Shell 安装自动补全功能
--config-dir value, -C value 配置文件夹的路径 (默认值: "/Users/xxx/.mc") [$MC_CONFIG_DIR]
--quiet, -q 禁用进度条显示 [$MC_QUIET]
--no-color 禁用颜色主题 [$MC_NO_COLOR]
--json 启用 JSON 行格式化输出 [$MC_JSON]
--debug 启用调试输出 [$MC_DEBUG]
--insecure 禁用 SSL 证书验证 [$MC_INSECURE]
--limit-upload value 限制以 KiB/s、MiB/s、GiB/s 的最大速率上传 (默认值: 无限制) [$MC_LIMIT_UPLOAD]
--limit-download value 限制以KiB/s、MiB/s、GiB/s的最大速率下载。(默认值:无限制) [$MC_LIMIT_DOWNLOAD]
--help, -h 显示帮助
--version, -v 打印版本
TIP:
使用 'mc --autocompletion' 启用Shell自动补全
COPYRIGHT:
Copyright (c) 2015-2023 MinIO, Inc.
LICENSE:
GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
mc 常用操作
- 添加一个存储服务配置
bash
# 添加一个存储服务到 mc 的配置文件
➜ ~ mc config host add minioserver http://10.2.102.244:9000 minioadmin minioadmin --api s3v4
Added `minioserver` successfully.
# 查看配置文件相关信息(注意:这里如果想要精确匹配内容,需本地安装 jq 命令)
➜ ~ cat ~/.mc/config.json | jq '.aliases.minioserver'
{
"url": "http://10.2.102.244:9000",
"accessKey": "minioadmin",
"secretKey": "minioadmin",
"api": "s3v4",
"path": "auto"
}
# 检查配置的存储服务
➜ ~ mc config host list minioserver
minioserver
URL : http://10.2.102.244:9000
AccessKey : minioadmin
SecretKey : minioadmin
API : s3v4
Path : auto
- 列出存储服务中的存储桶和对象
bash
# 列出存储桶信息
➜ ~ mc ls minioserver
[2023-11-30 23:53:28 CST] 0B images/
# 以 json 格式输出信息
➜ ~ mc ls minioserver --json
{
"status": "success",
"type": "folder",
"lastModified": "2023-11-30T23:53:28.699+08:00",
"size": 0,
"key": "images/",
"etag": "",
"url": "http://10.2.102.244:9000/",
"versionOrdinal": 1
}
# 列出指定存储桶中的对象信息
➜ ~ mc ls minioserver/images
[2023-11-30 23:55:58 CST] 5.0MiB STANDARD portal.jpeg
- 移动指定的对象到目标位置
bash
# 移动本地文件到远端
➜ ~ mc mv Downloads/output.png minioserver/images
/Users/mystic/Downloads/output.png: 1.18 MiB / 1.18 MiB ━━━━━━━━━━━━━━━━━━━━━━ 2.39 MiB/s 0s
# 检查本地文件
➜ ~ ll Downloads/output.png
ls: Downloads/output.png: No such file or directory
# 检查远端对象文件
➜ ~ mc ls minioserver/images/output.png
[2023-12-01 12:52:38 CST] 1.2MiB STANDARD output.png
# 删除远端对象文件
➜ ~ mc rm minioserver/images/output.png
Removed `minioserver/images/output.png`.
Go SDK 操作
详细用法请参考官方指南:min.io/docs/minio/...
- 安装
sdk
:
bash
go get github.com/minio/minio-go/v7
- 示例代码:
go
package main
import (
"context"
"fmt"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
const (
// MinIO 主机地址
endpoint = "minio-console.net:9000"
// 登录账号
accessKeyID = "minioadmin"
// 登录口令
secretAccessKey = "minioadmin"
// 使用 HTTPS 协议
useSSL = true
// 指定查询的存储桶名称
bucketName = "images"
)
func main() {
// 初始化 MinIO 客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalf("Connection failed: %v\n", err)
}
log.Println("minioClient connected successfully")
// 检查是否存在存储桶
ctx := context.Background()
isExist, err := minioClient.BucketExists(ctx, bucketName)
if err != nil {
log.Fatalf("Error: %v\n", err)
}
// 如果有指定的存储桶
if isExist {
// 遍历存储桶下的对象
objectCh := minioClient.ListObjects(ctx, bucketName, minio.ListObjectsOptions{
Recursive: true,
})
for object := range objectCh {
if object.Err != nil {
log.Fatalln(object.Err)
}
fmt.Printf("%s - %s\n", bucketName, object.Key)
}
} else {
fmt.Printf("the '%s' bucket isn't exist???\n", bucketName)
}
}
output
输出:
output
2023/12/01 19:32:09 minioClient connected successfully
images - portal.jpeg