对象存储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下载和安装 | 用于创建高性能对象存储的代码和下载内容
最后一个保留完整 Web 控制台功能的 MinIO 版本是:
RELEASE.2025-04-22T22-12-26Z从下一个版本
RELEASE.2025-05-24T17-08-30Z开始,官方正式移除了嵌入式 Web 控制台的大部分管理功能,将其降级为”对象浏览器(Object Browser)”。
2.1 单机部署
2.1.1 二进制部署
# 1. 下载 MinIOcd /usr/local/srcwget https://github.com/minio/minio/releases/download/RELEASE.2025-04-22T22-12-26Z/minio.linux-amd64.RELEASE.2025-04-22T22-12-26Zchmod +x miniomv minio /usr/local/bin/
# 2. 创建数据目录mkdir -p /data/minio
# 3. 设置环境变量export MINIO_ROOT_USER=adminexport MINIO_ROOT_PASSWORD=Admin@123
# 4. 前台启动minio server /data/minio --console-address ":9001"2.1.1.1 配置systemd服务
cat > /etc/systemd/system/minio.service <<'EOF'[Unit]Description=MinIO Object Storage ServerDocumentation=https://docs.min.ioWants=network-online.targetAfter=network-online.target
[Service]User=rootEnvironment="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=alwaysRestartSec=5
# 日志输出StandardOutput=journal+consoleStandardError=journal+console
[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reload
systemctl start minio.servicesystemctl status minio.service
# 查看端口netstat -tunlp | grep -E "9000|9001"2.1.2 docker部署
# 拉取镜像(推荐使用带控制台的最后一个AGPL v3版本)docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z
# 创建数据目录mkdir -p /data/minio
# 启动 MinIOdocker 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
# 创建docker-compose.ymlversion: '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启动
docker compose up -d三、MinIO web控制台使用
3.1 Object Browser(对象浏览器)
作用:最基础的文件浏览与管理界面,也是登录后默认进入的页面。
核心功能:
-
浏览所有桶:左侧或顶部展示你有权限访问的所有桶列表

image-20260917134313644 -
文件上传:支持单文件 / 多文件上传到指定桶
-
文件下载:点击文件可下载到本地
-
文件预览:图片、文本等常见格式可直接在线预览
-
创建文件夹:在桶内创建虚拟目录(前缀)
-
删除文件 / 文件夹:支持单个或批量删除
-
分享链接:生成临时预签名 URL,可对外分享文件访问权限

image-20260917134435807 -
版本回滚(Rewind):如果桶开启了版本控制,可恢复到历史版本
-
筛选搜索:按文件名快速过滤对象
使用场景:日常文件上传、下载、查看,是最常用的功能。
3.2 Access Keys(访问密钥)
作用:管理 S3 API 对接用的 Access Key 和 Secret Key。
核心功能:
- 创建密钥:为当前用户生成新的 AccessKey/SecretKey 对
- 查看密钥:查看已创建的密钥列表
- 禁用 / 启用密钥:临时停用某个密钥而不删除
- 删除密钥:永久删除不再使用的密钥
- 设置过期时间:密钥可设置自动过期时间,提升安全性
- 关联策略:为每个密钥单独绑定权限策略
使用场景:
- 给应用程序、开发团队对接 S3 API 时,创建专属密钥
- 不同项目 / 人员使用不同密钥,方便权限隔离和审计

3.3 Buckets(桶管理)
作用:集中管理所有存储桶的配置和状态。
核心功能:
-
创建桶:新建存储桶,可设置区域、版本控制等参数
-
查看桶详情:每个桶显示名称、对象数量、总大小、访问权限(R/W 读写)

image-20260917135253492 -
桶权限设置:设置桶为私有(Private)、公共读(Public Read)或公共读写
-
版本控制:开启 / 关闭桶的对象版本控制,防止误删除
-
生命周期规则:设置文件自动过期、自动转储到更低存储级别
-
桶复制:配置跨桶 / 跨集群的数据自动同步
-
对象锁定:开启 WORM(一次写入多次读取)合规保留
-
删除桶:删除不再使用的桶

image-20260917140352484 -
搜索桶:按名称快速筛选桶
使用场景:
-
初始化存储桶并配置权限策略
-
监控每个桶的存储用量和对象数量
-
配置自动清理规则,节省存储空间
3.4 Policies(IAM 权限策略)
作用:基于策略的访问控制(PBAC),定义用户 / 用户组能对哪些资源做什么操作。
核心功能:
-
内置默认策略:MinIO 自带 5 个常用策略
-
consoleAdmin:控制台完全管理员权限 -
diagnostics:诊断和监控只读权限 -
readonly:只读权限,可查看所有桶和文件 -
readwrite:读写权限,可上传下载文件 -
writeonly:只写权限,只能上传不能下载
-

-
创建自定义策略:用 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 本地用户账号。
核心功能:
-
创建用户:新建用户,设置用户名和密码
-
分配策略:为用户绑定一个或多个权限策略
-
加入用户组:将用户添加到某个用户组,继承组权限
-
禁用 / 启用用户:临时停用某个用户登录
-
删除用户:永久删除用户账号
-
搜索用户:按用户名筛选

说明:
-
每个用户由唯一的 Access Key(用户名)和 Secret Key(密码)组成
-
用户通过所属用户组继承权限,也可以直接绑定策略
-
支持策略的叠加:用户自己的策略 + 所在组的策略,权限取并集
3.5.2 Groups(用户组管理)
作用:按团队 / 部门分组管理用户,简化权限分配。
核心功能:
-
创建用户组:新建用户组
-
添加 / 移除用户:在组内管理成员
-
分配策略:为整个组绑定权限策略,组内所有成员自动继承
-
禁用 / 启用组:一次性停用整个组的权限
-
删除用户组:删除组本身(不删除组内用户)
使用场景:
-
按部门分组建用户组,如 “研发组”、“运营组”、“备份组”
-
给整个组分配相同的桶访问权限,不用逐个用户配置

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
cd /usr/local/srcwget 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常用命令
# 添加minio服务别名(起名字,后面直接用别名操作)mc alias set myminio http://127.0.0.1:9000 admin Admin@123
# 删除别名miniomc alias rm myminio
# 查看已配置的所有别名mc alias list
# 配置命令补全mc --autocompletion# 卸载自动补全mc --autocompletion remove4.1.1 桶操作
# 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-bucketBucket created successfully `myminio/test-bucket`.
# 3.删除桶:桶必须是空的才能直接删;带--force会先删除桶内所有对象再删桶mc rb myminio/test-bucketmc rb myminio/test-bucket --force
# 4.查看桶信息(容量、对象数量)[root@localhost /root]# mc du myminio/test-bucket13B 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-bucket4.1.2 对象(文件)操作
# 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/filesmc 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.txt4.1.3 预签名URL
生成临时下载链接,带过期时间,不需要账号密码即可访问
# 生成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
# 生成预签名上传 URLmc presign --put myminio/demo-bucket/uploadfile.txt 30m4.1.4 元数据 & 对象信息
# 查看对象详细信息(大小、etag、内容类型等)mc stat myminio/demo-bucket/test.txt4.1.5 镜像同步
mc mirror 用来本地目录 ↔ minio,或者 minioA ↔ minioB 双向 / 单向同步,做备份。
# 本地目录同步到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/backup4.1.6 IAM 用户 & 访问密钥
# 创建子用户,生成accesskey/secretkeymc 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 集群信息、服务状态
# 查看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=2dd if=/dev/zero of=/data1/disk2.img bs=1G count=2dd if=/dev/zero of=/data1/disk3.img bs=1G count=1dd if=/dev/zero of=/data1/disk4.img bs=1G count=1# 格式化xfs(如果提示命令错误,安装软件包即可:apt install -y xfsprogs)mkfs.xfs /data1/disk1.imgmkfs.xfs /data1/disk2.imgmkfs.xfs /data1/disk3.imgmkfs.xfs /data1/disk4.img# 创建挂载目录mkdir -p /data1/minio/disk{1..4}# 挂载loop设备mount -o loop /data1/disk1.img /data1/minio/disk1mount -o loop /data1/disk2.img /data1/minio/disk2mount -o loop /data1/disk3.img /data1/minio/disk3mount -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 0EOF# 执行生效mount -a
5.2 备份旧数据
# 连接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
# 关闭miniosystemctl stop minio5.3 搭建单节点多硬盘MinIO
5.3.1 二进制部署
直接修改启动方式即可
# 配置环境变量export MINIO_ROOT_USER=adminexport MINIO_ROOT_PASSWORD=Admin@123# 前台启动minio server /data1/minio/disk{1...4} --console-address ":9001"修改systemd配置文件:
sed -i '/^ExecStart=/c ExecStart=/usr/local/bin/minio server /data1/minio/disk{1...4} --console-address ":9001"' /etc/systemd/system/minio.servicesystemctl daemon-reload
systemctl start minio.servicesystemctl status minio.service5.3.2 docker部署
# 拉取镜像(推荐使用带控制台的最后一个AGPL v3版本)docker pull minio/minio:RELEASE.2025-04-22T22-12-26Z
# 创建数据目录mkdir -p /data/minio
# 启动 MinIOdocker 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
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启动
docker compose up -d5.4 迁移文件数据到新实例
# 配置新实例的别名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 旧SecretKeymc mirror --overwrite old_minio/ new_minio/查看数据底层存在的数据:
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.meta5.5 迁移用户、策略等配置
数据迁移只迁移对象数据,用户、策略、桶配置需要单独重建:
# 在新实例上导入备份的IAM数据mc admin cluster iam import new_minio /backup/old_minio-iam-metadata.zip5.6 验证
# 检查新实例状态mc admin info new_minio
# 对比数据mc ls new_miniomc diff old_minio/bucket new_minio/bucket # 无输出即一致
# 检查纠删码状态mc admin info new_minio | grep -i erasure六、MinIO多节点多硬盘部署
6.1 环境规划
搭建一个 3 节点 × 每节点 4 盘 的分布式集群
| 节点 | IP 地址 | 磁盘挂载 |
|---|---|---|
| minio-node-1 | 10.22.51.91 | /data2/minio/disk{1…4} |
| minio-node-2 | 10.22.51.72 | /data2/minio/disk{1…4} |
| minio-node-3 | 10.22.51.74 | /data2/minio/disk{1…4} |
总磁盘数 = 12 块,满足纠删码要求(至少 4 块,推荐 4 的倍数)。
10.22.51.91安装nginx同时作为负载均衡器
6.2 前置准备
这里使用二进制的方式进行安装,docker的安装方式类似,只是环境变量和启动参数发生变换
6.2.1 所有节点安装MinIO
# 1. 下载 MinIOcd /usr/local/srcwget 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 miniochmod +x miniomv minio /usr/local/bin/
# 2. 创建数据目录mkdir -p /data2/minio6.2.2 各节点初始化磁盘
# 创建新的存储目录mkdir -p /data2
# MinIO 支持用loop 设备(文件模拟磁盘),在单块硬盘上虚拟出 4 个独立文件系统
# 创建4个镜像文件,两个个2G,两个1G,可以改大小dd if=/dev/zero of=/data2/disk1.img bs=1G count=2dd if=/dev/zero of=/data2/disk2.img bs=1G count=2dd if=/dev/zero of=/data2/disk3.img bs=1G count=1dd if=/dev/zero of=/data2/disk4.img bs=1G count=1
# 格式化xfs(如果提示命令错误,安装软件包即可:apt install -y xfsprogs)mkfs.xfs /data2/disk1.imgmkfs.xfs /data2/disk2.imgmkfs.xfs /data2/disk3.imgmkfs.xfs /data2/disk4.img
# 创建挂载目录mkdir -p /data2/minio/disk{1..4}
# 挂载loop设备mount -o loop /data2/disk1.img /data2/minio/disk1mount -o loop /data2/disk2.img /data2/minio/disk2mount -o loop /data2/disk3.img /data2/minio/disk3mount -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 0EOF# 执行生效mount -a6.3各节点配置启动服务
cat > /etc/systemd/system/minio-cluster.service <<'EOF'[Unit]Description=MinIO Object Storage ServerDocumentation=https://docs.min.ioWants=network-online.targetAfter=network-online.target
[Service]User=rootEnvironment="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=alwaysRestartSec=5
# 日志输出StandardOutput=journal+consoleStandardError=journal+console
[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reload
systemctl start minio-cluster.servicesystemctl status minio-cluster.service
# 查看端口netstat -tunlp | grep -E "9000|9001"6.4 配置负载均衡器
在10.22.51.91安装nginx作为负载均衡器
apt install -y nginx
# 备份原nginx.confcp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak修改nginx.conf:
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; } }}# 验证语法nginx -t# 启动nginxsystemctl start nginx6.5 各节点配置mc别名
# # mc 测试,替换为负载服务器IPmc 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:46.6 网页访问
访问minio控制台,使用10.22.51.91:19001,输入账号密码admin/Admin@123456
6.7导入数据
根据之前的实验,将备份出来的数据迁移回去。回到10.22.51.91
[root@localhost /etc/nginx]# cd /backup/[root@localhost /backup]# lsminio_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文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




























