Minio 对象存储服务

3,860 阅读17分钟

Minio 简介

The Object Storage for AI Data Infrastructure

MinIO 是一个高性能、兼容 S3 协议的对象存储系统。它专为大规模的人工智能/机器学习、数据湖和数据库工作负载而设计。它是基于软件定义的,可以运行在任何云端或本地基础设施上。MinIO 采用双重许可,既有开源的 GNU AGPL v3 许可证,也有商业企业许可证。

官网 min.io/ Github github.com/minio

image.png

MinIO 主要特点和功能:

特点描述
对象存储MinIO 以对象的形式存储数据,每个对象由唯一的键(key)标识,并可以存储任意大小的数据。
高可用性MinIO 通过分布式部署和数据冗余来提供高可用性。它支持多副本复制和纠删码(erasure coding)等机制,确保数据的安全性和可靠性。
水平扩展MinIO 可以在多个节点上进行水平扩展,从而处理大规模的数据工作负载。它能够自动负载均衡和并行处理请求,以实现高吞吐量和低延迟。
兼容性MinIO 遵循 Amazon S3 API 的标准,因此与现有的 S3 生态系统和应用程序兼容。这使得将现有的 S3 应用程序迁移到 MinIO 变得非常简单。
安全性MinIO 提供多种安全控制机制,包括访问控制列表(ACLs)、策略管理、加密传输(TLS/SSL)等,以确保数据的安全性和隐私性。
监控和管理MinIO 提供了丰富的监控和管理功能,包括实时性能指标、日志记录、事件通知等。通过这些功能,用户可以对存储系统进行监控、故障排除和性能优化。
简单易用MinIO 的设计目标之一是提供简单易用的存储解决方案。它具有直观的 Web 管理界面和命令行工具,使得用户能够快速配置和操作存储系统。

MinIO 重要特性:

特性 描述
数据保护
  • Minio 分布式系统部署了纠删码技术,以预防多个节点的停机和位衰减状况。
  • 分布式 Minio 的运行至少需要4个节点,此时纠删码功能将被自动引入。
  • 作为一种用于恢复丢失和受损数据的数学算法,纠删码由 Minio 通过 Reed-Solomon code 实施,将对象分为 N/2 数据块和 N/2 奇偶校验块。
  • Minio 的纠删码工作原理与 RAID 或复制技术不同,例如 RAID6,在失去两块盘后才会丧失数据。而 Minio 的纠删码在丧失一半的盘后,数据依然是安全的。更重要的是,Minio 的纠删码是针对对象级别进行操作的,能以单个对象为单位进行数据恢复,而 RAID 是在卷级别进行操作,数据恢复时间较长。 Minio 对每个对象进行独立编码,一旦存储服务部署,通常无需更换硬盘或进行修复。Minio 纠删码的设计初衷是为了优化性能和尽可能的利用硬件加速。
一致性
  • Minio 无论是在分布式还是单机模式下,所有的读写操作都严格遵守读后写一致性模型。
高可用性
  • 不同于单机 Minio 服务的单点故障,分布式 Minio 服务在有 N/2 个节点在线的情况下,数据便是安全的。然而,创建新的对象至少需要 N/2+1 个节点。

image.png

本文将介绍 Minio 对象存储服务的基本知识,并提供了如何在单机环境中使用 DockerDocker-Compose 部署 Minio 服务的说明。此外,还简要介绍了使用 Minio 控制台进行基本操作的方法,以及如何使用 OpenSSL 生成具有 SAN 扩展的自签名证书。我们还会涉及到 Minio 客户端工具 mc 的使用,并演示如何通过 GoSDK 连接和操作 Minio 服务。通过本文,你将对 Minio 的基本概念和工具应用有一个全面的了解。

Minio 服务部署

Docker 单机部署

Docker 方式

# 拉取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 方式

# 编辑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 配置文件

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

多节点部署

Deploy MinIO: Multi-Node Multi-Drive

min.io/docs/minio/…

image.png

  • MNMD 部署支持纠删码配置,即当部署中丢失多达一半的节点或驱动器时,仍能继续进行读操作。

  • MinIO 强烈推荐使用 XFS 格式的文件系统磁盘直接附着的 JBOD 盘阵,以获得最佳性能。

  • MinIO 强烈建议使用负载均衡器来管理与集群的连接。如:NGINXHAProxy

image.png

MinIO 简单使用

访问方式

在成功部署并运行 Minio 对象服务之后,我们可以通过以下几种不同的方式进行访问:

  • web:默认可以通过访问实例的 9000 端口,结合 access keysecret key 来实现对实例的访问操作。
  • mc:使用 minio 官方提供的兼容 s3 的客户端工具进行操作。
  • aws-cli:使用 aws 的客户端命令工具进行操作。
  • s3cmd:使用 s3 的开源客户端进行操作。
  • minio-go:使用 minioGo 客户端来进行操作。
  • other-sdk:除了上述几种方式外,还有一些其他的 SDK 可以用来与 s3 兼容的存储进行互动,如:JavaPython.NETJSPHP 等。

Console 控制台操作

  1. 登录 MinIO 控制台 image.png

  2. 创建一个存储桶 image.png

  3. 从本地上传一张图片

image.png

  1. 等待上传完毕

image.png

  1. 观察下数据卷的变化
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 根证书制作

  1. 生成根证书密钥
# 建议长度为4096
root@app-server:~# openssl genrsa -out ca.key 4096
  1. 生成自签名根证书
# 在此过程中,需要交互回答一些关于组织、共享主题以及其他必要信息的问题
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                            # 邮箱地址

使用根证书来签署子证书

  1. 生成证书密钥
root@app-server:~# openssl genrsa -out minio-server.key 4096
  1. 填写 OpenSSL 配置文件以添加 SANs
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 地址
  1. 创建 CSR 证书请求,它将包含在证书中的信息
# 推荐使用 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
  1. 使用私钥和 CSR 创建证书:
# 使用私钥签署 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 证书配置使生效

  1. 将私/公钥证书文件拷贝到 MinIO/root/.minio/certs 文件夹,分别取名为 private.keypublic.crt
# 将 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
  1. 重启容器,加载配置:
# 使用 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.

本地安装证书并验证

  1. 本地添加 hosts 解析,以及 ping 测试
➜ ~ 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
  1. public.crt 拉取到本地 MacOS
➜ ~ 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
  1. 图形化操作或如下命令打开进行安装,需要输入密码

image.png

  1. 打开钥匙串 -> 双击目标条目 -> 始终信任此证书 -> 关闭窗口

image.png

image.png

  1. 重新登陆控制台,可以点击浏览器访问栏查看证书(该连接是安全的 HTTPS

image.png

mc 客户端命令

MinIO Client(mc)为 ls、cat、cp、mirror、diff、find 等 UNIX 命令提供了现代替代方案。它支持文件系统和与 Amazon S3 兼容的云存储服务(AWS Signature v2 和 v4)。

MacOS Brew 安装

➜ ~ brew install minio/stable/mc

mc 帮助手册

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 常用操作

  • 使用 config 添加一个存储服务配置 (废弃命令)
# 添加一个存储服务到 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
  • 使用 alias 管理 MinIO 服务别名
# 添加或修改MinIO服务别名,它需要你提供别名,服务URL,访问密钥和秘密密钥
mc alias set <alias> <your-minio-service-url> <access-key> <secret-key>

# 查看所有已配置的别名
mc alias list

# 列出在指定MinIO服务别名上的所有存储桶
mc ls <alias>

# 创建一个新存储桶
mc mb <alias>/<bucket-name>

# 上传文件到远端
mc cp <file> <alias>/<bucket-name>/<remote-file-path>
  • 列出存储服务中的存储桶和对象
# 列出存储桶信息
➜ ~ 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
  • 移动指定的对象到目标位置
# 移动本地文件到远端
➜ ~ 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
go get github.com/minio/minio-go/v7
  • 示例代码:
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 输出:
2023/12/01 19:32:09 minioClient connected successfully
images - portal.jpeg