视频加载失败

对象存储MinIO

6608 字
33 分钟
对象存储MinIO
对象存储MinIO

一、MinIO#

MinIO 是一款基于 Go 语言开发的开源、高性能、分布式对象存储系统,于 2016 年首次发布。它 100% 兼容 Amazon S3 API,可以在消费级或企业级硬件上运行,专为云原生环境、AI/ML 工作负载及大数据湖而设计。

重要提示:MinIO 社区版已于 2025 年 12 月进入维护模式,2026 年 2 月 GitHub 仓库归档。官方战略重心已转向商业版 AIStor(集成 Apache Iceberg V3)等产品。但社区版仍可正常使用和学习,只是不再有新功能更新。

1.1 对象存储与传统存储区别#

特性文件存储(NFS等)块存储(磁盘)对象存储(MinIO)
数据结构目录树/文件裸磁盘块扁平命名空间(Bucket + Object)
扩展性有限单节点水平无限扩展
适用场景共享文件数据库图片/视频/日志/备份等非结构化数据
访问方式文件系统路径块设备HTTP API(S3 协议)

1.2 核心概念#

  • Object(对象):存储的基本单元,由数据本体、元数据和唯一 ID 组成。上传的每一个文件就是对象;Object Key 是文件路径名(如 avatar/2026/user001.jpg),对象 = 文件内容 + 元数据(大小、类型、上传时间)。
  • Bucket(存储桶):对象的逻辑容器,全局唯一命名,仅支持小写字母、数字、短横线和点,长度 3-63 字符。顶层容器,相当于 “根文件夹”,一个 MinIO 里可以建多个桶;桶名全局唯一,不能有大写字母
  • Drive(驱动器):存储数据的物理磁盘
  • Erasure Set(纠删码集):一组驱动器的集合,是数据冗余的基本单位
  • API 端口 9000:S3 API 端口,程序 / SDK/mc 客户端上传下载走这个端口。
  • Console 端口 9001:Web 管理控制台,浏览器访问,可视化管理。

1.3 核心特性#

1.3.1 S3 协议兼容#

完整实现 AWS S3 核心 API(V2/V4),支持 AWS CLI、SDK 及 rclone 等工具无缝对接。应用仅需更改 Endpoint 配置即可从 AWS S3 迁移到 MinIO。

1.3.2 高性能#

  • 采用 Go 语言编写,支持异步 I/O 与 NVMe SSD 优化
  • 单节点吞吐量可超 1 GB/s
  • 32 节点集群读写速度可达 325 GiB/s,QPS 可达 20 万次/秒,延迟稳定在 2ms 以内

1.3.3 数据保护#

MinIO 使用 Reed-Solomon 纠删码替代传统 RAID,将对象拆分为数据块和校验块分散存储。默认配置下可容忍高达一半的节点或磁盘故障而不丢失数据。

例如:12 块磁盘的部署中,6 块存数据、6 块存校验,即使只剩 7 块磁盘仍可正常读写。

1.3.4 安全特性#

  • 加密:支持 AES-256-GCM、ChaCha20-Poly1305,支持服务端加密(SSE-S3/SSE-KMS/SSE-C)和客户端加密
  • WORM(对象锁定):数据一旦写入即防篡改,满足合规要求
  • Bitrot 保护:使用 HighwayHash 算法防止静默数据损坏
  • TLS/SSL:传输加密

1.3.5 云原生支持#

提供 Docker 镜像、Helm Chart 及 MinIO Operator,支持 Kubernetes 自动扩缩容、故障自愈及滚动升级。

1.4 适用场景#

MinIO 不是数据库,是对象存储(Object Storage),兼容 AWS S3 API,专门用来存图片、视频、PDF、备份、模型文件这类非结构化文件,不是用来存业务表、行数据的关系型 / NoSQL 数据库

适合图片 / 音视频存储、文件备份、AI 模型存储、数据湖、日志存储

二、MinIO部署#

MinIO 支持三种部署拓扑:

模式说明适用场景
单节点单硬盘(SNSD)一个服务器 + 一个存储目录本地开发、评估测试
单节点多硬盘(SNMD)一个服务器 + 4块以上磁盘小规模工作负载
多节点多硬盘(MNMD)多个服务器 + 多块磁盘生产环境、PB级扩展

官网地址:MinIO | 用于AI的S3 & Kubernetes原生对象存储

官方文档:MinIO对象存储 Kubernetes — MinIO中文文档 | MinIO Kubernetes中文文档

下载地址:MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容

github地址:minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.

最后一个保留完整 Web 控制台功能的 MinIO 版本是:RELEASE.2025-04-22T22-12-26Z

从下一个版本 RELEASE.2025-05-24T17-08-30Z 开始,官方正式移除了嵌入式 Web 控制台的大部分管理功能,将其降级为”对象浏览器(Object Browser)”。

2.1 单机部署#

2.1.1 二进制部署#

Terminal window
# 1. 下载 MinIO
cd /usr/local/src
wget https://github.com/minio/minio/releases/download/RELEASE.2025-04-22T22-12-26Z/minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z
chmod +x minio
mv minio /usr/local/bin/
# 2. 创建数据目录
mkdir -p /data/minio
# 3. 设置环境变量
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=Admin@123
# 4. 前台启动
minio server /data/minio --console-address ":9001"

2.1.1.1 配置systemd服务#

Terminal window
cat > /etc/systemd/system/minio.service <<'EOF'
[Unit]
Description=MinIO Object Storage Server
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
[Service]
User=root
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=Admin@123"
# 执行命令:minio server 数据目录,指定console端口
ExecStart=/usr/local/bin/minio server /data/minio --console-address ":9001"
LimitNOFILE=65536
# 进程重启策略
Restart=always
RestartSec=5
# 日志输出
StandardOutput=journal+console
StandardError=journal+console
[Install]
WantedBy=multi-user.target
EOF
Terminal window
systemctl daemon-reload
systemctl start minio.service
systemctl status minio.service
# 查看端口
netstat -tunlp | grep -E "9000|9001"

2.1.2 docker部署#

Terminal window
# 拉取镜像(推荐使用带控制台的最后一个AGPL v3版本)
docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z
# 创建数据目录
mkdir -p /data/minio
# 启动 MinIO
docker run -d \
--name minio-server \
-p 9000:9000 \
-p 9001:9001 \
-v /data/minio:/data \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=Admin@123" \
minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address ":9001"

使用docker-compose

Terminal window
# 创建docker-compose.yml
version: '3'
services:
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio-server
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Admin@123
volumes:
- /data/minio:/data
command: server /data --console-address ":9001"
restart: unless-stopped

启动

Terminal window
docker compose up -d

三、MinIO web控制台使用#

3.1 Object Browser(对象浏览器)#

作用:最基础的文件浏览与管理界面,也是登录后默认进入的页面。

核心功能:

  • 浏览所有桶:左侧或顶部展示你有权限访问的所有桶列表

    image-20260917134313644
    image-20260917134313644

  • 文件上传:支持单文件 / 多文件上传到指定桶

  • 文件下载:点击文件可下载到本地

  • 文件预览:图片、文本等常见格式可直接在线预览

  • 创建文件夹:在桶内创建虚拟目录(前缀)

  • 删除文件 / 文件夹:支持单个或批量删除

  • 分享链接:生成临时预签名 URL,可对外分享文件访问权限

    image-20260917134435807
    image-20260917134435807

  • 版本回滚(Rewind):如果桶开启了版本控制,可恢复到历史版本

  • 筛选搜索:按文件名快速过滤对象

使用场景:日常文件上传、下载、查看,是最常用的功能。

3.2 Access Keys(访问密钥)#

作用:管理 S3 API 对接用的 Access Key 和 Secret Key。

核心功能:

  • 创建密钥:为当前用户生成新的 AccessKey/SecretKey 对
  • 查看密钥:查看已创建的密钥列表
  • 禁用 / 启用密钥:临时停用某个密钥而不删除
  • 删除密钥:永久删除不再使用的密钥
  • 设置过期时间:密钥可设置自动过期时间,提升安全性
  • 关联策略:为每个密钥单独绑定权限策略

使用场景:

  • 给应用程序、开发团队对接 S3 API 时,创建专属密钥
  • 不同项目 / 人员使用不同密钥,方便权限隔离和审计

image-20260917134959546
image-20260917134959546

3.3 Buckets(桶管理)#

作用:集中管理所有存储桶的配置和状态。

核心功能:

  • 创建桶:新建存储桶,可设置区域、版本控制等参数

  • 查看桶详情:每个桶显示名称、对象数量、总大小、访问权限(R/W 读写)

    image-20260917135253492
    image-20260917135253492

  • 桶权限设置:设置桶为私有(Private)、公共读(Public Read)或公共读写

  • 版本控制:开启 / 关闭桶的对象版本控制,防止误删除

  • 生命周期规则:设置文件自动过期、自动转储到更低存储级别

  • 桶复制:配置跨桶 / 跨集群的数据自动同步

  • 对象锁定:开启 WORM(一次写入多次读取)合规保留

  • 删除桶:删除不再使用的桶

    image-20260917140352484
    image-20260917140352484

  • 搜索桶:按名称快速筛选桶

使用场景:

  • 初始化存储桶并配置权限策略

  • 监控每个桶的存储用量和对象数量

  • 配置自动清理规则,节省存储空间

3.4 Policies(IAM 权限策略)#

作用:基于策略的访问控制(PBAC),定义用户 / 用户组能对哪些资源做什么操作。

核心功能:

  • 内置默认策略:MinIO 自带 5 个常用策略

    • consoleAdmin:控制台完全管理员权限

    • diagnostics:诊断和监控只读权限

    • readonly:只读权限,可查看所有桶和文件

    • readwrite:读写权限,可上传下载文件

    • writeonly:只写权限,只能上传不能下载

image-20260917140544516
image-20260917140544516

  • 创建自定义策略:用 JSON 语法编写细粒度权限策略

    • 精确到某个桶、某个前缀(文件夹)

    • 精确到允许的 API 操作(GetObject、PutObject、DeleteObject 等)

  • 搜索策略:按名称查找已有策略

  • 删除策略:删除自定义策略

策略示例:all-bucket-readwrite,允许访问所有桶

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::*",
"arn:aws:s3:::*/*"
]
}
]
}

使用场景:

  • 给不同团队 / 项目分配不同的存储权限

  • 限制某个用户只能访问指定桶或指定文件夹

  • 实现最小权限原则,提升安全性

3.5 Identity(身份管理)#

3.5.1 Users(用户管理)#

作用:管理 MinIO 本地用户账号。

核心功能:

  • 创建用户:新建用户,设置用户名和密码

  • 分配策略:为用户绑定一个或多个权限策略

  • 加入用户组:将用户添加到某个用户组,继承组权限

  • 禁用 / 启用用户:临时停用某个用户登录

  • 删除用户:永久删除用户账号

  • 搜索用户:按用户名筛选

image-20260917141050388
image-20260917141050388

说明:

  • 每个用户由唯一的 Access Key(用户名)和 Secret Key(密码)组成

  • 用户通过所属用户组继承权限,也可以直接绑定策略

  • 支持策略的叠加:用户自己的策略 + 所在组的策略,权限取并集

3.5.2 Groups(用户组管理)#

作用:按团队 / 部门分组管理用户,简化权限分配。

核心功能:

  • 创建用户组:新建用户组

  • 添加 / 移除用户:在组内管理成员

  • 分配策略:为整个组绑定权限策略,组内所有成员自动继承

  • 禁用 / 启用组:一次性停用整个组的权限

  • 删除用户组:删除组本身(不删除组内用户)

使用场景:

  • 按部门分组建用户组,如 “研发组”、“运营组”、“备份组”

  • 给整个组分配相同的桶访问权限,不用逐个用户配置

image-20260917141142124
image-20260917141142124

3.5.3 OpenID(OpenID 集成)#

作用:对接外部 OpenID Connect 身份提供商(如 Keycloak、Auth0、Google 等)。

核心功能:

  • 配置外部 OIDC 身份源

  • 允许用户用第三方单点登录(SSO)访问 MinIO

  • 支持将 OIDC 中的用户组映射到 MinIO 权限策略

使用场景:企业已有统一身份认证系统,希望员工用统一账号登录 MinIO,不用单独创建账号。

3.5.4 LDAP(LDAP 集成)#

作用:对接企业内部 LDAP/Active Directory 目录服务。

核心功能:

  • 配置 LDAP 服务器连接参数(地址、端口、绑定账号)

  • 配置用户搜索和组搜索的基准 DN

  • 自动将 LDAP 用户同步到 MinIO

  • 支持将 LDAP 组映射到 MinIO 权限策略

使用场景:大型企业用 AD/LDAP 管理员工账号,MinIO 直接复用现有组织架构和账号体系。

3.6 Monitoring(监控中心)#

3.6.1 Metrics(系统指标仪表盘)#

作用:实时查看 MinIO 集群运行状态和资源使用情况。

核心功能(顶部有 4 个标签页):

  • Info(概览):

    • 桶数量、对象总数

    • 服务器节点数量(在线 / 离线)

    • 磁盘数量(在线 / 离线)

    • 后端存储类型、存储纠删码配置

  • Usage(用量):

    • 总存储容量和已使用空间

    • 各桶存储用量分布

    • 对象数量增长趋势

  • Traffic(流量):

    • 读写请求 QPS

    • 网络入站 / 出站带宽

    • API 调用延迟统计

  • Resources(资源):

    • CPU 使用率

    • 内存使用率

    • 磁盘 I/O 性能

使用场景:日常运维监控,快速判断集群是否健康,存储是否快满了。

3.6.2 Logs(系统日志)#

作用:查看 MinIO 服务器运行日志。

核心功能:

  • 实时滚动查看服务端日志输出

  • 按日志级别过滤(Info、Warning、Error)

  • 查看启动信息、配置加载、API 请求错误等

使用场景:排查服务启动失败、API 调用异常等问题。

3.6.3 Audit(审计日志)#

作用:记录所有用户的 API 访问行为,用于安全审计。

核心功能:

  • 记录每个 API 请求的时间、调用者、操作类型

  • 记录请求的桶、对象路径

  • 记录请求的来源 IP、响应状态码

  • 支持按用户、按操作类型筛选

使用场景:

  • 安全合规审计,追溯谁在什么时间访问 / 修改了什么文件

  • 排查误删除操作,找到操作人

  • 统计用户访问行为

3.7 Events(事件通知)#

作用:当桶内发生文件上传、删除等事件时,自动推送到外部系统。

核心功能:

  • 添加事件目的地:配置接收通知的外部服务

    • Webhook(HTTP 回调)

    • Kafka 消息队列

    • Redis

    • MySQL/PostgreSQL 数据库

    • MQTT

    • Elasticsearch

  • 触发事件类型:

    • 文件上传(s3:ObjectCreated)

    • 文件删除(s3:ObjectRemoved)

    • 恢复文件、复制完成等

  • 按桶配置:每个桶单独配置要推送的事件类型

  • 筛选条件:可按文件名前缀 / 后缀过滤要通知的事件

使用场景:

  • 用户上传图片后,自动通知后端服务做缩略图处理

  • 文件删除后,自动触发数据备份

  • 业务系统需要实时感知存储桶变化

3.8 Configuration(系统配置)#

作用:MinIO 服务器级别的全局参数配置。

核心配置项(左侧标签页):

  • Region(区域):设置服务器物理区域标识,影响 S3 API 的区域头信息

  • Compression(压缩):配置服务端传输压缩,减小网络带宽占用

  • API:API 请求相关配置,如请求大小限制、超时时间

  • Scanner(扫描器):后台磁盘扫描任务的配置,用于数据完整性校验

  • Etcd:对接外部 Etcd 服务发现配置(分布式模式用)

  • Logger Webhook:将系统日志推送到外部 HTTP 接口

  • Audit Webhook:将审计日志推送到外部 HTTP 接口

  • Audit Kafka:将审计日志推送到 Kafka 集群

操作:

  • 导出配置:下载当前配置到本地

  • 导入配置:从本地文件导入配置

  • 恢复默认:一键恢复出厂设置

使用场景:

  • 高级运维调优,比如调整 API 超时、压缩级别

  • 配置日志统一收集到 ELK、Prometheus 等监控系统

四、MinIO命令使用#

使用 mc 命令行客户端MinIO Client,mc 是官方命令行工具,兼容 S3

github项目地址:minio/mc: Unix like utilities for object store

官方中文文档:MinIO客户端 — MinIO中文文档 | MinIO Linux中文文档

Terminal window
cd /usr/local/src
wget https://github.com/minio/mc/releases/download/RELEASE.2025-04-16T18-13-26Z/mc.linux-amd64.RELEASE.2025-04-16T18-13-26Z
mv mc.linux-amd64.RELEASE.2025-04-16T18-13-26Z mc
chmod +x mc
mv mc /usr/local/bin/

4.1 mc常用命令#

Terminal window
# 添加minio服务别名(起名字,后面直接用别名操作)
mc alias set myminio http://127.0.0.1:9000 admin Admin@123
# 删除别名minio
mc alias rm myminio
# 查看已配置的所有别名
mc alias list
# 配置命令补全
mc --autocompletion
# 卸载自动补全
mc --autocompletion remove

4.1.1 桶操作#

Terminal window
# 1.查看所有桶
[root@localhost /usr/local/src]# mc ls myminio
[2026-09-17 10:52:14 CST] 0B bucket-2/
[2026-09-17 10:48:56 CST] 0B upload-file/
# 2.创建桶
[root@localhost /root]# mc mb myminio/test-bucket
Bucket created successfully `myminio/test-bucket`.
# 3.删除桶:桶必须是空的才能直接删;带--force会先删除桶内所有对象再删桶
mc rb myminio/test-bucket
mc rb myminio/test-bucket --force
# 4.查看桶信息(容量、对象数量)
[root@localhost /root]# mc du myminio/test-bucket
13B 1 object test-bucket
# 4.开启桶版本控制
mc version enable myminio/test-bucket
# 查看版本状态
mc version info myminio/test-bucket
# 暂停版本控制
mc version suspend myminio/test-bucket
# 5.设置桶访问策略
# 私有(默认,推荐业务使用)
mc policy set private myminio/test-bucket
# 公开只读:任何人可以直接访问文件链接(图片静态资源用)
mc policy set public myminio/test-bucket
# 查看当前桶策略
mc policy get myminio/test-bucket

4.1.2 对象(文件)操作#

Terminal window
# 1.上传本地文件到桶
mc cp ./111.json myminio/test-bucket/
# 2.下载文件到本地
mc cp myminio/test-bucket/111.json ./
# 递归下载整个目录
mc cp -r myminio/test-bucket/files ./
# 3.删除对象
mc rm myminio/test-bucket/111.json
# 递归删除桶内全部文件(桶保留,只删内容)
mc rm -r myminio/test-bucket/ --force
# 4.本地 ./files 目录全部上传到minio的demo-bucket/files
mc cp -r ./files myminio/demo-bucket/files
# 5.上传到模拟子目录(自动创建avatar/路径)
mc cp /tmp/avatar.jpg myminio/demo-bucket/avatar/user1.jpg
# 6.列出桶内文件
# 列出根目录
mc ls myminio/demo-bucket
# 递归列出所有子目录全部文件
mc ls -r myminio/demo-bucket
# 列出带文件大小、修改时间
mc ls --human-readable myminio/demo-bucket
# 7.对象移动/重命名 minio 里重命名本质是复制 + 删除原对象
# 桶内移动(改名)
mc mv myminio/demo-bucket/old.jpg myminio/demo-bucket/new.jpg
# 跨桶移动文件
mc mv myminio/demo-bucket/file.txt myminio/other-bucket/
# 8.对象复制
mc cp myminio/demo-bucket/file.txt myminio/demo-bucket/file_bak.txt

4.1.3 预签名URL#

生成临时下载链接,带过期时间,不需要账号密码即可访问

Terminal window
# 生成1小时有效期下载链接
mc presign myminio/demo-bucket/test.txt 1h
# 20分钟有效期
mc presign myminio/demo-bucket/test.txt 20m
# 7天有效期
mc presign myminio/demo-bucket/test.txt 7d
# 生成预签名上传 URL
mc presign --put myminio/demo-bucket/uploadfile.txt 30m

4.1.4 元数据 & 对象信息#

Terminal window
# 查看对象详细信息(大小、etag、内容类型等)
mc stat myminio/demo-bucket/test.txt

4.1.5 镜像同步#

mc mirror 用来本地目录 ↔ minio,或者 minioA ↔ minioB 双向 / 单向同步,做备份。

Terminal window
# 本地目录同步到minio(增量,只上传新增/修改文件)
mc mirror /data/backup myminio/demo-bucket/backup
# minio桶同步到本地
mc mirror myminio/demo-bucket/backup /data/backup
# 删除目标端多余文件(保持两边完全一致,谨慎使用)
mc mirror --remove /data/backup myminio/demo-bucket/backup

4.1.6 IAM 用户 & 访问密钥#

Terminal window
# 创建子用户,生成accesskey/secretkey
mc admin user add myminio appuser App@123456
# 列出所有用户
mc admin user list myminio
# 禁用用户
mc admin user disable myminio appuser
# 启用用户
mc admin user enable myminio appuser

用户策略:给子用户单独权限,比如只允许读写 demo-bucket,后面可以练自定义 policy。

4.1.7 集群信息、服务状态#

Terminal window
# 查看minio服务信息
mc admin info myminio
# 查看服务日志
mc admin logs myminio
# 查看磁盘状态
mc admin disk list myminio

五、MinIO单节点多硬盘部署#

单节点单硬盘SNSD 使用零奇偶校验的纠删码后端(零冗余),而单节点多硬盘(SNMD) 使用标准纠删码(有数据冗余)。两者的底层数据格式完全不同,MinIO 无法直接将 SNSD 数据目录转换为 SNMD 格式,以此需要先备份数据。

5.1 前置准备#

硬件准备:

  • 准备至少 4 块独立磁盘(纠删码最少需要 4 块盘)(学习使用可以使用是个不同的目录来替代。只是纠删码数据冗余形同虚设)

  • 每块磁盘使用 XFS 文件系统格式化(MinIO 官方强烈推荐)

  • 确保每块磁盘有独立挂载点,如 /mnt/disk1、/mnt/disk2、/mnt/disk3、/mnt/disk4(没有那么独立磁盘,这里直接创建四个不同的目录:disk1到disk4)

    Terminal window
    # 创建新的存储目录
    mkdir -p /data1
    # MinIO 支持用loop 设备(文件模拟磁盘),在单块硬盘上虚拟出 4 个独立文件系统
    # 创建4个镜像文件,两个个2G,两个1G,可以改大小
    dd if=/dev/zero of=/data1/disk1.img bs=1G count=2
    dd if=/dev/zero of=/data1/disk2.img bs=1G count=2
    dd if=/dev/zero of=/data1/disk3.img bs=1G count=1
    dd if=/dev/zero of=/data1/disk4.img bs=1G count=1
    # 格式化xfs(如果提示命令错误,安装软件包即可:apt install -y xfsprogs)
    mkfs.xfs /data1/disk1.img
    mkfs.xfs /data1/disk2.img
    mkfs.xfs /data1/disk3.img
    mkfs.xfs /data1/disk4.img
    # 创建挂载目录
    mkdir -p /data1/minio/disk{1..4}
    # 挂载loop设备
    mount -o loop /data1/disk1.img /data1/minio/disk1
    mount -o loop /data1/disk2.img /data1/minio/disk2
    mount -o loop /data1/disk3.img /data1/minio/disk3
    mount -o loop /data1/disk4.img /data1/minio/disk4
    # fstab 持久化(可选,重启自动挂载)
    cat >> /etc/fstab << 'EOF'
    /data1/disk1.img /data1/minio/disk1 xfs loop 0 0
    /data1/disk2.img /data1/minio/disk2 xfs loop 0 0
    /data1/disk3.img /data1/minio/disk3 xfs loop 0 0
    /data1/disk4.img /data1/minio/disk4 xfs loop 0 0
    EOF
    # 执行生效
    mount -a

5.2 备份旧数据#

Terminal window
# 连接minio并设置别名,(直接使用之前的myminio也行)
mc alias set old_minio http://127.0.0.1:9000 admin Admin@123
# 列出所有的桶
mc ls old_minio
# 全量备份到本地文件对象
mkdir -p /backup/minio_data/
mc mirror --overwrite old_minio/ /backup/minio_data/
# 导出所有桶的配置(桶元信息)并移动到指定位置
mc admin cluster bucket export old_minio && mv old_minio-bucket-metadata.zip /backup/
# 完整导出old_minio全部IAM(用户、策略、用户绑定的策略) 执行完成后,在 `/backup/` 下会得到 zip 包
mc admin cluster iam export old_minio -o /backup/old_minio-iam-metadata.zip
# 关闭minio
systemctl stop minio

5.3 搭建单节点多硬盘MinIO#

5.3.1 二进制部署#

直接修改启动方式即可

Terminal window
# 配置环境变量
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=Admin@123
# 前台启动
minio server /data1/minio/disk{1...4} --console-address ":9001"

修改systemd配置文件:

Terminal window
sed -i '/^ExecStart=/c ExecStart=/usr/local/bin/minio server /data1/minio/disk{1...4} --console-address ":9001"' /etc/systemd/system/minio.service
Terminal window
systemctl daemon-reload
systemctl start minio.service
systemctl status minio.service

5.3.2 docker部署#

Terminal window
# 拉取镜像(推荐使用带控制台的最后一个AGPL v3版本)
docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z
# 创建数据目录
mkdir -p /data/minio
# 启动 MinIO
docker run -d \
--name minio-server \
-p 9000:9000 \
-p 9001:9001 \
-v /data1/minio/disk1:/data/disk1 \
-v /data1/minio/disk2:/data/disk2 \
-v /data1/minio/disk3:/data/disk3 \
-v /data1/minio/disk4:/data/disk4 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=Admin@123" \
minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data/disk{1...4} --console-address ":9001"

使用docker-compose

Terminal window
version: '3'
services:
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: minio123456
volumes:
- /data1/minio/disk1:/data/disk1
- /data1/minio/disk2:/data/disk2
- /data1/minio/disk3:/data/disk3
- /data1/minio/disk4:/data/disk4
command: server /data/disk{1...4} --console-address ":9001"
restart: unless-stopped

启动

Terminal window
docker compose up -d

5.4 迁移文件数据到新实例#

Terminal window
# 配置新实例的别名
mc alias set new_minio http://127.0.0.1:9000 admin Admin@123
# 导入桶配置,自动在new_minio创建所有桶,并且恢复桶的生命周期/版本等配置
mc admin cluster bucket import new_minio /backup/old_minio-buckets.zip
# 从备份恢复数据
mc mirror --overwrite /backup/minio_data/ new_minio/
# 或者如果旧实例还能启动(用不同端口),直接从旧实例迁移
# 先用旧端口启动旧实例
minio server /old_data --address ":9002" --console-address ":9003"
mc alias set old_minio http://127.0.0.1:9002 旧AccessKey 旧SecretKey
mc mirror --overwrite old_minio/ new_minio/

查看数据底层存在的数据:

Terminal window
cd /data1/minio
[root@localhost /data1/minio]# tree
.
├── disk1
│   ├── bucket-2
│   ├── test-bucket
│   │   └── 111.json
│   │   └── xl.meta
│   └── upload-file
│   └── 新建文本文档.txt
│   └── xl.meta
├── disk2
│   ├── bucket-2
│   ├── test-bucket
│   │   └── 111.json
│   │   └── xl.meta
│   └── upload-file
│   └── 新建文本文档.txt
│   └── xl.meta
├── disk3
│   ├── bucket-2
│   ├── test-bucket
│   │   └── 111.json
│   │   └── xl.meta
│   └── upload-file
│   └── 新建文本文档.txt
│   └── xl.meta
└── disk4
├── bucket-2
├── test-bucket
│   └── 111.json
│   └── xl.meta
└── upload-file
└── 新建文本文档.txt
└── xl.meta

5.5 迁移用户、策略等配置#

数据迁移只迁移对象数据,用户、策略、桶配置需要单独重建:

Terminal window
# 在新实例上导入备份的IAM数据
mc admin cluster iam import new_minio /backup/old_minio-iam-metadata.zip

5.6 验证#

Terminal window
# 检查新实例状态
mc admin info new_minio
# 对比数据
mc ls new_minio
mc diff old_minio/bucket new_minio/bucket # 无输出即一致
# 检查纠删码状态
mc admin info new_minio | grep -i erasure

六、MinIO多节点多硬盘部署#

6.1 环境规划#

搭建一个 3 节点 × 每节点 4 盘 的分布式集群

节点IP 地址磁盘挂载
minio-node-110.22.51.91/data2/minio/disk{1…4}
minio-node-210.22.51.72/data2/minio/disk{1…4}
minio-node-310.22.51.74/data2/minio/disk{1…4}

总磁盘数 = 12 块,满足纠删码要求(至少 4 块,推荐 4 的倍数)。

10.22.51.91安装nginx同时作为负载均衡器

6.2 前置准备#

这里使用二进制的方式进行安装,docker的安装方式类似,只是环境变量和启动参数发生变换

6.2.1 所有节点安装MinIO#

Terminal window
# 1. 下载 MinIO
cd /usr/local/src
wget https://github.com/minio/minio/releases/download/RELEASE.2025-04-22T22-12-26Z/minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z
mv minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z minio
chmod +x minio
mv minio /usr/local/bin/
# 2. 创建数据目录
mkdir -p /data2/minio

6.2.2 各节点初始化磁盘#

Terminal window
# 创建新的存储目录
mkdir -p /data2
# MinIO 支持用loop 设备(文件模拟磁盘),在单块硬盘上虚拟出 4 个独立文件系统
# 创建4个镜像文件,两个个2G,两个1G,可以改大小
dd if=/dev/zero of=/data2/disk1.img bs=1G count=2
dd if=/dev/zero of=/data2/disk2.img bs=1G count=2
dd if=/dev/zero of=/data2/disk3.img bs=1G count=1
dd if=/dev/zero of=/data2/disk4.img bs=1G count=1
# 格式化xfs(如果提示命令错误,安装软件包即可:apt install -y xfsprogs)
mkfs.xfs /data2/disk1.img
mkfs.xfs /data2/disk2.img
mkfs.xfs /data2/disk3.img
mkfs.xfs /data2/disk4.img
# 创建挂载目录
mkdir -p /data2/minio/disk{1..4}
# 挂载loop设备
mount -o loop /data2/disk1.img /data2/minio/disk1
mount -o loop /data2/disk2.img /data2/minio/disk2
mount -o loop /data2/disk3.img /data2/minio/disk3
mount -o loop /data2/disk4.img /data2/minio/disk4
# fstab 持久化(可选,重启自动挂载)
cat >> /etc/fstab << 'EOF'
/data2/disk1.img /data2/minio/disk1 xfs loop 0 0
/data2/disk2.img /data2/minio/disk2 xfs loop 0 0
/data2/disk3.img /data2/minio/disk3 xfs loop 0 0
/data2/disk4.img /data2/minio/disk4 xfs loop 0 0
EOF
# 执行生效
mount -a

6.3各节点配置启动服务#

Terminal window
cat > /etc/systemd/system/minio-cluster.service <<'EOF'
[Unit]
Description=MinIO Object Storage Server
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
[Service]
User=root
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=Admin@123456"
# 后续负载均衡使用
Environment="MINIO_SERVER_URL=http://10.22.51.91:19000"
Environment="MINIO_BROWSER_REDIRECT_URL=http://10.22.51.91:19001"
# 集群数据目录,使用环境变量
Environment="MINIO_VOLUMES=http://10.22.51.91/data2/minio/disk1 \
http://10.22.51.91/data2/minio/disk2 \
http://10.22.51.91/data2/minio/disk3 \
http://10.22.51.91/data2/minio/disk4 \
http://10.22.51.72/data2/minio/disk1 \
http://10.22.51.72/data2/minio/disk2 \
http://10.22.51.72/data2/minio/disk3 \
http://10.22.51.72/data2/minio/disk4 \
http://10.22.51.74/data2/minio/disk1 \
http://10.22.51.74/data2/minio/disk2 \
http://10.22.51.74/data2/minio/disk3 \
http://10.22.51.74/data2/minio/disk4"
# 执行命令:minio server 数据目录,指定console端口
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES --console-address ":9001"
LimitNOFILE=65536
# 进程重启策略
Restart=always
RestartSec=5
# 日志输出
StandardOutput=journal+console
StandardError=journal+console
[Install]
WantedBy=multi-user.target
EOF
Terminal window
systemctl daemon-reload
systemctl start minio-cluster.service
systemctl status minio-cluster.service
# 查看端口
netstat -tunlp | grep -E "9000|9001"

6.4 配置负载均衡器#

在10.22.51.91安装nginx作为负载均衡器

Terminal window
apt install -y nginx
# 备份原nginx.conf
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

修改nginx.conf:

Terminal window
user root;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
upstream minio_api {
ip_hash;
server 10.22.51.91:9000;
server 10.22.51.72:9000;
server 10.22.51.74:9000;
}
upstream minio_console {
server 10.22.51.91:9001;
server 10.22.51.72:9001;
server 10.22.51.74:9001;
}
server {
listen 19000;
server_name _;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_cache off;
proxy_buffering off;
proxy_pass http://minio_api;
}
}
server {
listen 19001;
server_name _;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_cache off;
proxy_buffering off;
proxy_pass http://minio_console;
}
}
}
Terminal window
# 验证语法
nginx -t
# 启动nginx
systemctl start nginx

6.5 各节点配置mc别名#

Terminal window
# # mc 测试,替换为负载服务器IP
mc alias set minio-cluster http://10.22.51.91:19000 admin Admin@123456
[root@localhost /root]# mc admin info minio-cluster
● 10.22.51.72:9000
Uptime: 4 minutes
Version: 2025-04-22T22:12:26Z
Network: 3/3 OK
Drives: 4/4 OK
Pool: 1
● 10.22.51.74:9000
Uptime: 4 minutes
Version: 2025-04-22T22:12:26Z
Network: 3/3 OK
Drives: 4/4 OK
Pool: 1
● 10.22.51.91:9000
Uptime: 4 minutes
Version: 2025-04-22T22:12:26Z
Network: 3/3 OK
Drives: 4/4 OK
Pool: 1
┌──────┬──────────────────────┬─────────────────────┬──────────────┐
│ Pool │ Drives Usage │ Erasure stripe size │ Erasure sets │
│ 1st │ 2.9% (total: 12 GiB) │ 12 │ 1 │
└──────┴──────────────────────┴─────────────────────┴──────────────┘
12 drives online, 0 drives offline, EC:4

6.6 网页访问#

访问minio控制台,使用10.22.51.91:19001,输入账号密码admin/Admin@123456

6.7导入数据#

根据之前的实验,将备份出来的数据迁移回去。回到10.22.51.91

Terminal window
[root@localhost /etc/nginx]# cd /backup/
[root@localhost /backup]# ls
minio_data old_minio-iam-metadata.zip policies.txt users.txt
# 导入桶元数据,自动在new_minio创建所有桶,并且恢复桶的生命周期/版本等配置
mc admin cluster bucket import minio-cluster /backup/old_minio-bucket-metadata.zip
# 导入文件数据
mc mirror --overwrite /backup/minio_data/ minio-cluster/
# 导入备份的IAM数据(用户、策略、桶配置)
mc admin cluster iam import minio-cluster /backup/old_minio-iam-metadata.zip

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

对象存储MinIO
https://2233941.xyz/posts/对象存储minio/
作者
lumifly
发布于
2026-09-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
统计
--
总浏览量
--
今日访问
--
本月访问
✨ 今日一言
"加载中..."
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
本年还剩 -- 天--%
本月还剩 -- 天--%
本周还剩 -- 天--%
距离--
--
--
天气预报
最新动态
站点统计
文章
31
分类
2
标签
23
总字数
218,787
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录