跳转至

603 MinIO 分布式对象存储

一句话概述:MinIO 是高性能的 S3 兼容对象存储,用 Go 编写,适合存储海量非结构化数据(图片、视频、备份文件等),可以理解为"自建版 AWS S3"。

核心知识点速查表

知识点说明
最新状态社区版进入维护模式(2025年底),企业版推 AIStor
兼容协议完全兼容 AWS S3 API
编程语言Go 编写,单二进制部署
纠删码最少 4 块盘,最多容忍一半盘故障
客户端工具mc 命令行 + SDK(Go/Python/Java/JS)
适用场景AI训练数据、日志存储、备份归档、数据湖
许可证AGPLv3(社区版)

一、安装配置

1.1 Docker 单节点安装(推荐入门)

# Docker 快速启动 MinIO
docker run -d \
  --name minio \                                    # 容器名
  -p 9000:9000 \                                    # S3 API 端口
  -p 9001:9001 \                                    # Web 控制台端口
  -v minio_data:/data \                             # 数据持久化
  -e MINIO_ROOT_USER=admin \                        # 管理员用户名(至少3字符)
  -e MINIO_ROOT_PASSWORD=password123 \              # 管理员密码(至少8字符)
  minio/minio server /data --console-address ":9001"  # 启动服务

# 启动后访问 http://localhost:9001 进入 Web 控制台

1.2 Docker Compose 部署

# docker-compose.yml
# 白话:用 YAML 文件定义 MinIO 的运行方式,方便管理
version: '3.8'
services:
  minio:
    image: minio/minio:latest          # MinIO 官方镜像
    container_name: minio              # 容器名称
    ports:
      - "9000:9000"                    # S3 API 端口
      - "9001:9001"                    # Web 控制台端口
    volumes:
      - minio_data:/data               # 数据持久化到 Docker 卷
    environment:
      MINIO_ROOT_USER: admin           # 管理员用户
      MINIO_ROOT_PASSWORD: password123 # 管理员密码
    command: server /data --console-address ":9001"  # 启动命令
    healthcheck:                       # 健康检查
      test: ["CMD", "mc", "ready", "local"]
      interval: 30s
      timeout: 20s
      retries: 3

volumes:
  minio_data:                          # 声明数据卷

1.3 安装 mc 客户端

# mc 是 MinIO 的命令行客户端(白话:类似 aws cli 但专为 MinIO 设计)
# Linux 安装
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc  # 下载
chmod +x mc                             # 添加执行权限
sudo mv mc /usr/local/bin/              # 移到系统路径

# macOS 安装
brew install minio/stable/mc            # Homebrew 安装

# 配置连接(白话:告诉 mc 去哪里找 MinIO 服务器)
mc alias set myminio http://localhost:9000 admin password123
# myminio 是别名,后面的命令用这个别名代替完整地址

二、基本使用

2.1 存储桶操作

# 存储桶 = 文件夹的顶层容器(白话:类似硬盘的分区)
mc mb myminio/my-bucket               # 创建存储桶
mc ls myminio/                        # 列出所有存储桶
mc rb myminio/my-bucket --force       # 删除存储桶(--force 强制删除非空桶)

2.2 文件操作

# 上传文件
mc cp localfile.txt myminio/my-bucket/          # 上传单个文件
mc cp --recursive ./data/ myminio/my-bucket/    # 递归上传整个目录

# 下载文件
mc cp myminio/my-bucket/file.txt ./local/       # 下载到本地

# 列出文件
mc ls myminio/my-bucket/                        # 列出桶内文件
mc ls --recursive myminio/my-bucket/            # 递归列出所有文件

# 删除文件
mc rm myminio/my-bucket/file.txt                # 删除单个文件
mc rm --recursive --force myminio/my-bucket/old/  # 递归删除目录

# 文件信息
mc stat myminio/my-bucket/file.txt              # 查看文件详细信息
mc du myminio/my-bucket/                        # 查看存储桶使用空间

2.3 Python SDK 操作

# pip install minio
from minio import Minio  # 导入 MinIO 客户端库
from minio.error import S3Error  # 导入错误类

# 创建客户端连接
client = Minio(
    "localhost:9000",            # MinIO 服务器地址
    access_key="admin",          # 用户名
    secret_key="password123",    # 密码
    secure=False                 # 本地开发不用 HTTPS
)

# 创建存储桶
bucket_name = "my-data"                              # 桶名
if not client.bucket_exists(bucket_name):             # 检查桶是否存在
    client.make_bucket(bucket_name)                   # 不存在就创建
    print(f"存储桶 {bucket_name} 创建成功")

# 上传文件
client.fput_object(
    bucket_name,                     # 目标桶
    "reports/2024/data.csv",         # 对象名(可以带路径前缀)
    "/home/user/data.csv",           # 本地文件路径
    content_type="text/csv"          # MIME 类型
)
print("文件上传成功")

# 下载文件
client.fget_object(
    bucket_name,                     # 源桶
    "reports/2024/data.csv",         # 对象名
    "/tmp/downloaded.csv"            # 下载到本地的路径
)

# 列出对象
objects = client.list_objects(bucket_name, prefix="reports/", recursive=True)
for obj in objects:                   # 遍历所有匹配的对象
    print(f"{obj.object_name} - {obj.size} bytes")  # 打印文件名和大小

# 生成预签名 URL(白话:生成一个临时下载链接,7天有效)
from datetime import timedelta
url = client.presigned_get_object(
    bucket_name,
    "reports/2024/data.csv",
    expires=timedelta(days=7)        # 链接有效期 7 天
)
print(f"下载链接: {url}")

# 删除对象
client.remove_object(bucket_name, "reports/2024/data.csv")  # 删除指定文件

三、高级用法

3.1 存储桶策略

# 设置存储桶为公开只读(白话:任何人都能下载,但不能上传)
mc anonymous set download myminio/public-files

# 设置为公开读写(慎用!)
mc anonymous set public myminio/public-files

# 取消公开访问
mc anonymous set none myminio/public-files

3.2 对象生命周期管理

// lifecycle.json - 自动清理旧文件(白话:文件放30天自动删除)
{
    "Rules": [
        {
            "ID": "expire-old-logs",
            "Status": "Enabled",
            "Expiration": {
                "Days": 30
            },
            "Filter": {
                "Prefix": "logs/"
            }
        }
    ]
}
# 应用生命周期规则
mc ilm import myminio/my-bucket < lifecycle.json  # 导入规则
mc ilm ls myminio/my-bucket                       # 查看当前规则

3.3 版本控制

# 开启版本控制(白话:文件被覆盖/删除后还能恢复旧版本)
mc version enable myminio/my-bucket

# 查看文件历史版本
mc ls --versions myminio/my-bucket/important.txt

3.4 服务器端加密

# 设置自动加密(白话:文件存储时自动加密,读取时自动解密)
mc encrypt set sse-s3 myminio/secure-bucket

3.5 事件通知

# 配置 Webhook 通知(白话:有文件上传时自动通知你的应用)
mc event add myminio/my-bucket arn:minio:sqs::_:webhook \
  --event put                          # 监听上传事件
  --prefix "uploads/"                  # 只监听 uploads/ 目录
  --suffix ".csv"                      # 只监听 .csv 文件

四、常见报错与解决

4.1 连接被拒绝

mc: <ERROR> Unable to initialize new alias. Get "http://localhost:9000": dial tcp: connection refused

原因:MinIO 服务未启动或端口不对 解决

docker ps                              # 确认容器在运行
docker logs minio                      # 查看 MinIO 日志

4.2 认证失败

Access Denied

原因:用户名密码不对,或 access_key/secret_key 配置错误 解决:检查 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 环境变量。

4.3 磁盘空间不足

disk usage too high

解决

mc du myminio/                         # 查看各桶使用空间
mc rm --recursive --force --older-than 30d myminio/logs/  # 清理30天前的日志

4.4 社区版功能受限

MinIO 社区版已进入维护模式(2025年底)

替代方案:如果需要活跃维护的开源对象存储,可考虑 SeaweedFS(Apache 2.0)或 Garage(AGPLv3)。


五、速查表

操作命令
创建存储桶mc mb myminio/bucket
列出存储桶mc ls myminio/
上传文件mc cp file.txt myminio/bucket/
下载文件mc cp myminio/bucket/file.txt ./
递归上传mc cp -r ./dir/ myminio/bucket/
删除文件mc rm myminio/bucket/file.txt
查看空间mc du myminio/bucket/
设置公开mc anonymous set download myminio/bucket
开启版本mc version enable myminio/bucket
同步目录mc mirror ./local/ myminio/bucket/

六、同类工具对比

特性MinIOAWS S3SeaweedFSCeph
部署方式自建云服务自建自建
S3 兼容完全兼容原生兼容兼容
学习曲线
维护成本
性能极高
社区活跃维护模式N/A活跃活跃
适用场景中小规模任何规模中大规模大规模

选型建议:预算允许用 AWS S3;自建优先 MinIO(成熟);需要活跃开源社区考虑 SeaweedFS。


参考资料MinIO 官网 | GitHub 仓库 | MinIO 文档