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 服务器端加密¶
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 服务未启动或端口不对 解决:
4.2 认证失败¶
原因:用户名密码不对,或 access_key/secret_key 配置错误 解决:检查 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 环境变量。
4.3 磁盘空间不足¶
解决:
4.4 社区版功能受限¶
替代方案:如果需要活跃维护的开源对象存储,可考虑 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/ |
六、同类工具对比¶
| 特性 | MinIO | AWS S3 | SeaweedFS | Ceph |
|---|---|---|---|---|
| 部署方式 | 自建 | 云服务 | 自建 | 自建 |
| S3 兼容 | 完全兼容 | 原生 | 兼容 | 兼容 |
| 学习曲线 | 低 | 低 | 中 | 高 |
| 维护成本 | 低 | 无 | 中 | 高 |
| 性能 | 极高 | 高 | 高 | 高 |
| 社区活跃 | 维护模式 | N/A | 活跃 | 活跃 |
| 适用场景 | 中小规模 | 任何规模 | 中大规模 | 大规模 |
选型建议:预算允许用 AWS S3;自建优先 MinIO(成熟);需要活跃开源社区考虑 SeaweedFS。