💻 minio - object storage

minio

入门

minio是分布式对象存储系统,兼容S3协议,可以作为对象存储服务使用。

  • 对象存储 vs 文件存储 vs 块存储

    对象存储:

    • 以对象为单位进行存储,每个对象包含数据、元数据和全局唯一标识符
    • 扁平的命名空间,没有传统的目录层级结构
    • 高度可扩展,适合存储海量非结构化数据
    • 通过 HTTP/HTTPS 协议访问,适合云端存储
    • 应用场景:图片、视频、备份文件等大文件存储 \
    • 常见的有:
      • 云服务商提供的服务(S3、OSS、COS等)
      • 开源解决方案(MinIO、Ceph)

    文件存储:

    • 采用传统的目录树结构组织数据
    • 支持文件级别的存取和共享
    • 使用 POSIX 接口,方便用户直接操作
    • 适合需要频繁读写的场景
    • 应用场景:共享文件系统、文档管理系统
    • 常见的有:
      • 传统协议(NFS、SMB/CIFS)
      • 分布式文件系统(GlusterFS、HDFS)
      • 云服务(EFS、NAS)

    块存储:

    • 将存储空间划分为固定大小的块
    • 直接对硬件设备进行操作,性能最好
    • 需要文件系统来组织数据
    • 适合需要高性能、低延迟的场景
    • 应用场景:数据库、虚拟机磁盘等
    • 常见的有:
      • 传统解决方案(SAN、iSCSI)
      • 云服务(EBS)
      • 开源方案(Ceph RBD、LVM)
  • 对象存储中的核心概念

    对象(Object)

    • 存储的基本单位
    • 包含:数据本身、元数据(metadata)、对象键(key)
    • 元数据包含:文件类型、创建时间、大小、自定义属性等

    存储桶(Bucket)

    • 存储对象的逻辑容器
    • 具有全局唯一的名称
    • 可以设置访问权限、生命周期规则等策略

    访问密钥(Access Key)

    • Access Key ID:用于身份识别
    • Secret Access Key:用于签名认证
    • 类似于用户名和密码的概念

    策略(Policy)

    • 访问控制策略:控制用户对资源的访问权限
    • 生命周期策略:自动管理对象的存储周期
    • 版本控制:管理对象的多个版本

    端点(Endpoint)

    • 访问存储服务的 URL 地址
    • 可以是公网或内网地址
    • 用于 API 调用和访问对象

安装

  • 使用docker安装
$ docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

minio-docker

部署好之后,可以直接在浏览器中访问:http://127.0.0.1:9001 中可视化访问。(默认用户名:minioadmin,密码:minioadminminio-admin-dashboard

CLI - mc

mc是minio的命令行工具,可以用来管理minio的存储桶和对象。

在本机Mac上安装mc

$ brew install minio/stable/mc

常用命令

  • alias: 设置别名
➜  ~ mc alias set myminio http://localhost:9000 minioadmin minioadmin
mc: Configuration written to `/Users/wangxg/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/Users/wangxg/.mc/share`.
mc: Initialized share uploads `/Users/wangxg/.mc/share/uploads.json` file.
mc: Initialized share downloads `/Users/wangxg/.mc/share/downloads.json` file.
Added `myminio` successfully.
  • mb: 创建存储桶
  • ls: 列出存储桶
  • rb: 删除存储桶
➜  ~ mc mb myminio/bucket-mc
Bucket created successfully `myminio/bucket-mc`.

➜  ~ mc ls myminio
[2025-02-14 18:45:24 CST]     0B bucket-1/
[2025-02-14 19:16:02 CST]     0B bucket-mc/

➜  ~ mc rb myminio/bucket-mc
Removed `myminio/bucket-mc` successfully.

➜  ~ mc ls myminio
[2025-02-14 18:45:24 CST]     0B bucket-1/
  • stat: 查看存储桶信息
➜  ~ mc stat myminio/bucket-1
Name      : bucket-1
Date      : 2025-02-14 19:19:17 CST
Size      : N/A
Type      : folder

Properties:
  Versioning: Un-versioned
  Location: us-east-1
  Anonymous: Disabled
  ILM: Disabled

Usage:
      Total size: 175 KiB
   Objects count: 1
  Versions count: 0

Object sizes histogram:
   1 object(s) BETWEEN_1024B_AND_1_MB
   0 object(s) BETWEEN_1024_B_AND_64_KB
   0 object(s) BETWEEN_10_MB_AND_64_MB
   0 object(s) BETWEEN_128_MB_AND_512_MB
   0 object(s) BETWEEN_1_MB_AND_10_MB
   0 object(s) BETWEEN_256_KB_AND_512_KB
   0 object(s) BETWEEN_512_KB_AND_1_MB
   1 object(s) BETWEEN_64_KB_AND_256_KB
   0 object(s) BETWEEN_64_MB_AND_128_MB
   0 object(s) GREATER_THAN_512_MB
   0 object(s) LESS_THAN_1024_B
  • cp: 上传对象、下载对象
  • ls: 列出存储桶内对象
# 上传:
➜  ~ mc cp ./Downloads/good.jpg myminio/bucket-1
...s/good.jpg: 1.55 MiB / 1.55 MiB  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  60.13 MiB/s 0s

# 列出:
➜  ~ mc ls myminio/bucket-1
[2025-02-14 19:02:06 CST] 175KiB STANDARD 2.png
[2025-02-14 19:21:10 CST] 1.6MiB STANDARD good.jpg

# 删除对象:
➜  ~ mc rm myminio/bucket-1/2.png
Removed `myminio/bucket-1/2.png`.

➜  ~ mc ls myminio/bucket-1
[2025-02-14 19:21:10 CST] 1.6MiB STANDARD good.jpg

# 下载:
➜  ~ mc cp myminio/bucket-1/good.jpg ./
...1/good.jpg: 1.55 MiB / 1.55 MiB  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  152.92 MiB/s 0s

SDK

  • python
$ pip install minio
from minio import Minio

client = Minio(
    "127.0.0.1:9000",         # 直接使用主机名:端口号格式
    access_key="minioadmin",
    secret_key="minioadmin",
    secure=False              # 使用 HTTP 而不是 HTTPS
)
# 查看存储桶
buckets = client.list_buckets()
for bucket in buckets:
    print(bucket.name)


# run:
  ~ python3 miniodemo.py
bucket-1