提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
- 前言
- 一、验证Minio可用性
-
- [1.1 创建桶](#1.1 创建桶)
- [1.2 创建key](#1.2 创建key)
- [1.3 python api访问minio](#1.3 python api访问minio)
- [二、Minio客户端 MC](#二、Minio客户端 MC)
-
- [2.1 安装mc](#2.1 安装mc)
- [2.2 mc简单命令](#2.2 mc简单命令)
- 三、Minio故障恢复
-
- [3.1 新节点准备](#3.1 新节点准备)
- [3.2 创建逻辑卷](#3.2 创建逻辑卷)
- [3.3 安装minio](#3.3 安装minio)
- [3.4 修改负载均衡地址](#3.4 修改负载均衡地址)
- [3.5 重启minio](#3.5 重启minio)
- 四、Minio扩容
-
- [4.1 minio部署方式](#4.1 minio部署方式)
- [4.2 为什么不能直接扩容 LVM](#4.2 为什么不能直接扩容 LVM)
- [4.3 minio标准扩容方式](#4.3 minio标准扩容方式)
- 五、Minio备份还原
-
- [5.1 安装rclone](#5.1 安装rclone)
- [5.2 数据备份](#5.2 数据备份)
- [5.3 数据还原](#5.3 数据还原)
- 六、Minio监控
前言
我的实验环境https://blog.csdn.net/m0_63756214/article/details/164024724?spm=1001.2014.3001.5501
架构特点: 前端双 HAProxy 消除单点故障,后端 4 节点 MinIO 分布式存储,全链路高可用
| 主机名 | IP | 角色 | 说明 |
|---|---|---|---|
| haproxy-keepalived1 | 192.168.13.141 | 负载均衡主节点 | HAProxy + Keepalived,MASTER 状态,持有 VIP,转发 9000/9001 到后端 MinIO |
| haproxy-keepalived2 | 192.168.13.142 | 负载均衡备节点 | HAProxy + Keepalived,BACKUP 状态,主节点故障时自动接管 VIP |
| minio1 | 192.168.13.143 | 存储节点 1 | MinIO Server,分布式集群节点,4 块数据盘 |
| minio2 | 192.168.13.144 | 存储节点 2 | MinIO Server,分布式集群节点,4 块数据盘 |
| minio3 | 192.168.13.145 | 存储节点 3 | MinIO Server,分布式集群节点,4 块数据盘 |
| minio4 | 192.168.13.146 | 存储节点 4 | MinIO Server,分布式集群节点,4 块数据盘 |
一、验证Minio可用性
1.1 创建桶



1.2 创建key

由于这两个key只会显示一次,需要保存这两个key

1.3 python api访问minio
这里我准备一台独立设备,安装 Python 环境;编写测试脚本,验证 MinIO 桶创建、文件上传、文件下载功能是否正常;全部验证通过后,就可以将 MinIO 集群正式交付开发使用
yaml
root@ubuntu:~# apt update && apt -y install python3-pip
root@ubuntu:~# sudo -H pip3 install -U pip # Ubuntu18.04系统需要执行pip 升级到最新版本
root@ubuntu:~# python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
root@ubuntu:~# pip3 install minio # ubuntu24.04+需要加参数--break-system-packages
## 连接 MinIO → 自动建名为mybucket桶 → 上传 /var/log/syslog → 再把它下载回来,是一个完整的上传 + 下载验证测试脚本
root@ubuntu:~# vim test.py
#!/usr/bin/python3
import os
from minio import Minio
from minio.error import S3Error
# from minio.error import (ResponseError, BucketAlreadyOwnedByYou, BucketAlreadyExists)
# 初始化MinIO客户端
minio_client = Minio(
endpoint='192.168.13.100:9000',
access_key='KGg7KOFRdlqH3NXuL9CT',
secret_key='Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ',
secure=False # 如果使用SSL,请将此项设置为True
)
bucket_name = "mybucket"
object_name = "example-object.txt"
local_file_path = "/var/log/syslog"
try:
# 检查存储桶是否存在,如果不存在则创建
if not minio_client.bucket_exists(bucket_name):
minio_client.make_bucket(bucket_name)
print(f"Bucket '{bucket_name}' created successfully.")
else:
print(f"Bucket '{bucket_name}' already exists.")
# 上传文件到存储桶
minio_client.fput_object(bucket_name, object_name, local_file_path)
print(f"Successfully uploaded '{local_file_path}' to '{object_name}'.")
except ResponseError as e:
print(f"An error occurred: {e}")
# 下载存储桶中的对象
downloaded_file_path = "example-object.txt"
try:
minio_client.fget_object(bucket_name, object_name, downloaded_file_path)
print(f"Successfully downloaded '{object_name}' to '{downloaded_file_path}'.")
except ResponseError as e:
print(f"An error occurred while downloading '{object_name}': {e}")
root@ubuntu:~# python3 test.py
可以看到桶创建成功,并且上传下载文件正常

二、Minio客户端 MC
mc 是minio的命令行客户端工具,相当于 AWS 的 aws s3 命令,用来管理和操作minio
https://dl.min.io/client/mc/release/linux-amd64/
2.1 安装mc
这里我下载的是最新版的mc

yaml
root@ubuntu:~# wget https://dl.min.io/client/mc/release/linux-amd64/mc
root@ubuntu:~# ls
mc.linux-amd64.RELEASE.2025-08-13T08-35-41Z example-object.txt test.py
root@ubuntu:~# mv mc.linux-amd64.RELEASE.2025-08-13T08-35-41Z mc
root@ubuntu:~# install mc /usr/local/bin/mc
2.2 mc简单命令
yaml
root@ubuntu:~# mc --autocompletion # 补全命令
# 加一个别名,把地址 + access_key+secret_key保存为简短名字minio-server,以后直接用mc ls minio-server/ 就能操作,不用每次输密钥
root@ubuntu:~# mc alias set minio-server http://192.168.13.100:9000 KGg7KOFRdlqH3NXuL9CT Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ
root@ubuntu:~# mc alias ls

yaml
# 查看minio目录文件
root@ubuntu:~# mc ls minio-server/
[2026-08-26 13:33:31 CST] 0B mybucket/
[2026-08-26 13:11:03 CST] 0B test-20260826/
root@ubuntu:~# mc ls minio-server/mybucket
[2026-08-26 13:33:31 CST] 424KiB STANDARD example-object.txt
# 上传文件
root@ubuntu:~# ls
example-object.txt mc test.py
root@ubuntu:~# mc cp test.py minio-server/mybucket
# 上传目录
root@ubuntu:~# mc cp --recursive /etc/ minio-server/test-20260826/
# 创建桶
root@ubuntu:~# mc mb minio-server/bucket01
可以看到上传下载文件,创建桶都成功了

yaml
# 拷贝minio文件到本机
root@ubuntu:~# mc cp minio-server/mybucket/example-object.txt /tmp
root@ubuntu:~# ls /tmp
example-object.txt
# 查看minio服务端集群状态信息
root@ubuntu:~# mc admin info minio-server

mc的命令还有很多,感兴趣的可以自行了解
三、Minio故障恢复
MinIO 具备节点故障自愈能力:服务异常停掉后可重新启动minio服务就能直接恢复运行;若节点操作系统损坏需重新安装,则可在系统重装完成后恢复服务
现在我们模拟 MinIO 集群中单节点磁盘彻底损坏的故障场景,该节点 MinIO 服务无法正常启动

虽然单节点故障不影响 MinIO 集群正常使用,但应及时修复,避免长期处于降级状态。若为服务异常,重启该节点 MinIO 服务后集群即可自动恢复;若为系统损坏,则需更换新设备重新部署 MinIO 并加入集群
- 准备一台与前三个 MinIO 节点配置完全一致的新节点,新节点ip 192.168.13.139
- 修改 HAProxy 负载均衡中的后端节点地址
- 更新各节点
/etc/hosts中的主机名映射 - 重启各节点服务
3.1 新节点准备
yaml
root@ubuntu:~# hostnamectl set-hostname minio4
root@minio4:~# ntpdate ntp.aliyun.com
# minio1~4都要改成一样的
root@minio4:~# vim /etc/hosts
192.168.13.143 minio1
192.168.13.144 minio2
192.168.13.145 minio3
192.168.13.139 minio4
# 准备四个磁盘创建逻辑卷(和我前三台的操作步骤一样)
root@minio4:~# lsblk

3.2 创建逻辑卷
yaml
# 创建pv
root@minio4:~# pvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 创建vg
root@minio4:~# vgcreate vg_minio /dev/sdb /dev/sdc /dev/sdd /dev/sde
root@minio4:~# vgdisplay vg_minio

yaml
# 创建lv
root@minio4:~# lvcreate -l +250 -n minio-lv1 vg_minio
root@minio4:~# lvcreate -l +250 -n minio-lv2 vg_minio
root@minio4:~# lvcreate -l +250 -n minio-lv3 vg_minio
root@minio4:~# lvcreate -l +250 -n minio-lv4 vg_minio
# 格式化
root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv1
root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv2
root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv3
root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv4
# 创建挂在目录并挂载
root@minio4:~# mkdir -p /mnt/disk{1,2,3,4}
root@minio4:~# useradd -r -s /sbin/nologin minio-user
root@minio4:~# chown -R minio-user:minio-user /mnt/disk*
root@minio4:~# vim /etc/fstab
/dev/vg_minio/minio-lv1 /mnt/disk1 xfs defaults 0 0
/dev/vg_minio/minio-lv2 /mnt/disk2 xfs defaults 0 0
/dev/vg_minio/minio-lv3 /mnt/disk3 xfs defaults 0 0
/dev/vg_minio/minio-lv4 /mnt/disk4 xfs defaults 0 0
root@minio4:~# mount -a
root@minio4:~# df -Th

3.3 安装minio
yaml
# 复制安装包,配置文件到minio4
root@minio1:~# scp minio root@192.168.13.139:/root
root@minio1:~# scp /etc/default/minio root@192.168.13.139:/tmp
root@minio1:~# scp /lib/systemd/system/minio.service root@192.168.13.139:/tmp
yaml
root@minio4:~# ls
minio
root@minio4:~# install minio /usr/local/bin/
root@minio4:~# mv /tmp/minio /etc/default/minio
root@minio4:~# mv /tmp/minio.service /lib/systemd/system/minio.service
root@minio4:~# id minio-user
uid=999(minio-user) gid=999(minio-user) groups=999(minio-user)
root@minio4:~# ll /mnt/
total 8
drwxr-xr-x 6 root root 4096 Aug 26 15:58 ./
drwxr-xr-x 24 root root 4096 Apr 7 16:15 ../
drwxr-xr-x 6 minio-user minio-user 77 Aug 26 16:15 disk1/
drwxr-xr-x 6 minio-user minio-user 77 Aug 26 16:15 disk2/
drwxr-xr-x 6 minio-user minio-user 77 Aug 26 16:15 disk3/
drwxr-xr-x 6 minio-user minio-user 77 Aug 26 16:15 disk4/
3.4 修改负载均衡地址
yaml
# 两个haproxy都要改
root@haproxy-keepalived1:~# vim /etc/haproxy/haproxy.cfg

改完重启haproxy,keepalived都重启一下
3.5 重启minio
yaml
root@minio4:~# systemctl daemon-reload
root@minio4:~# systemctl enable --now minio.service # minio1~3可以都重启一下
# 查看minio4的挂在目录,可以看到数据自动被同步过来了
root@minio4:~# ls /mnt/disk1/
bucket01 mybucket test-20260826
root@minio4:~# ls /mnt/disk2/
bucket01 mybucket test-20260826
root@minio4:~# ls /mnt/disk3/
bucket01 mybucket test-20260826
root@minio4:~# ls /mnt/disk4/
bucket01 mybucket test-20260826
登录minio,可以看到集群已经恢复,数据会自动同步

四、Minio扩容
4.1 minio部署方式
MinIO集群常见有两种底层存储部署方式:
LVM逻辑卷部署:基于LVM逻辑卷作为MinIO的数据盘,将LV格式化为XFS后挂载,提供给MinIO使用。该方案运维灵活性高,方便在线扩容磁盘空间,但不属于MinIO官方推荐方案,额外的LVM层会带来一定性能与可靠性开销
JBOD裸盘部署(官方推荐):对物理磁盘直接使用MBR/GPT进行磁盘分区,分区格式化为XFS文件系统,创建挂载点并完成挂载,直接将分区作为独立磁盘交付MinIO使用。JBOD模式规避额外存储管理层,发挥MinIO纠删码原生能力,是官方优先推荐的部署形态
JBOD模式下每一块盘/分区对MinIO来说都是独立drive;而分布式纠删码集群中,无论底层是裸盘还是LVM逻辑卷,都不支持通过放大单drive容量来扩容ErasureSet,只能新增整套磁盘组新建ErasureSet实现集群扩容
4.2 为什么不能直接扩容 LVM
目前我的minio是基于lvm搭建的
MinIO 官方文档明确指出,不支持通过逻辑卷扩容、滚动更换硬盘或其他文件系统级的方法来增加存储。MinIO 的容量在集群启动时根据 MINIO_VOLUMES 中指定的路径确定,后续的 LVM 扩容操作不会被识别。你之前的理解是准确的:即使 df -h 显示单盘容量变大了,MinIO 控制台显示的总容量也不会变化
举例子:原来每个 LV 200G,16 盘 EC,可用容量大概 1600G;
全部 LV 扩到 500G,df‑h 看到每盘 500G,但是 MinIO 控制台总容量依旧≈1600G,只是单盘不容易报磁盘耗尽
这是规避磁盘满故障,不是业务扩容,不能存更多数据
4.3 minio标准扩容方式
MinIO 标准扩容:水平扩展(Scale Out),即向现有集群添加一个全新的"服务器池(Server Pool)"
基于我 4节点 x 4盘 的集群,以下是标准流程:
✅规划和准备新硬件
- 确定新池规模 :新池的节点数应是现有池的整数倍 。对于我的集群,应准备 4台(或8台、12台)新服务器
- 确保硬件一致性 :新服务器配置应与现有节点尽量相同,尤其是每台服务器的磁盘数量、类型和大小必须一致
- 安装环境 :在新节点上安装与现有集群完全相同版本 的 MinIO。格式化并挂载磁盘(生产环境推荐 XFS 文件系统),确保挂载点路径统一(如
/data1,/data2等)
✅步骤二:更新集群配置
这是最关键的一步。需要修改 MinIO 的启动参数,将新旧两个池都包含进来
-
编辑配置文件 :在任意一个现有节点 上,编辑 MinIO 的配置文件(如
config.yaml或环境变量文件) -
添加新池 :在
pools列表末尾,追加新池的配置。例如:yamlpools: - args: - "http://minio{1...4}/data{1...4}" - args: # 增加新增的池 - "http://minio{5...8}/data{1...4}" # 新节点 -
同步配置文件 :将更新后的配置文件复制到所有节点(包括新旧节点),并确保文件内容完全一致
✅步骤三:启动新节点并重载配置
- 启动新节点 :在新节点(
minio5~minio8)上启动 MinIO 服务 - 重载现有节点配置 :向所有现有节点 (
minio1~minio4)的 MinIO 进程发送SIGHUP信号,使其动态加载新配置,无需重启,版本比较旧则需要重启
✅ 步骤四:验证与更新负载均衡
- 验证扩容 :使用
mc admin info命令检查集群状态,确认所有新节点和磁盘均在线 - 更新负载均衡 :将新节点(
minio5~minio8)的 IP 添加到 HAProxy 等负载均衡器的后端服务器列表中,并重载配置
本次扩容步骤已有详细说明,不再重复演示代码操作。新增MinIO节点硬件规格需与原有4台节点完全一致
注意事项:
- 在所有8台节点的
/etc/hosts中完成全部节点主机名与IP的域名解析配置 - 保证8台服务器时间同步
- 可直接将原有节点的MinIO安装包拷贝至新节点
- 同时将
/etc/default/minio环境变量文件、/lib/systemd/system/minio.service服务文件,从老节点同步复制到新节点
该节点部署流程与本文第三小节的故障恢复操作基本一致,可参照对应章节执行
五、Minio备份还原
这里我下载一个mc命令,方便演示
yaml
root@ubuntu:~# wget https://dl.min.io/client/mc/release/linux-amd64/mc
root@ubuntu:~# install mc /usr/local/bin/mc
root@ubuntu:~# mc --autocompletion
root@ubuntu:~# mc alias set minio-server http://192.168.13.100:9000 KGg7KOFRdlqH3NXuL9CT Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ
5.1 安装rclone
rclone 是命令行工具,专门用来在本地磁盘、对象存储、各类云盘之间做文件迁移、同步、拷贝
它支持非常多后端:MinIO/S3、阿里云OSS、腾讯COS、华为OBS、百度网盘、OneDrive、Google Drive、本地文件系统、SFTP等
结合MinIO运维场景,可以实现同步、备份
rclone sync:单向同步,源端有什么目标端就变成什么,删除目标多余文件
rclone copy:只拷贝新增/变更文件,不删除目标端文件,用来做MinIO数据异地备份、定时备份
yaml
## 1. 下载rclone
root@ubuntu:~# apt list rclone
root@ubuntu:~# apt update && apt -y install rclone
root@ubuntu:~# rclone version

yaml
## 2. 添加rclon补全命令
root@ubuntu:~# vim /root/.bashrc # 添加一行
source <(rclone completion bash)
root@ubuntu:~# source /root/.bashrc
## 3. rclone配置文件
root@ubuntu:~# mkdir .config/rclone
root@ubuntu:~# cat > ~/.config/rclone/rclone.conf <<'EOF'
[minio] # rclone远端别名
type = s3 # 后端存储类型
provider = Minio # 指定S3服务商为MinIO
env_auth = false
#access_key_id = admin
#secret_access_key = 12345678
access_key_id = KGg7KOFRdlqH3NXuL9CT # MinIO访问密钥AccessKey
secret_access_key = Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ # MinIO密钥SecretKey
region = luqing # 随意填写
endpoint = http://192.168.13.100:9000 # MinIO S3 API访问地址,填写VIP/节点IP+9000端口
EOF
## 4. 测试rclone连通minio集群,可以看到所有的桶
root@ubuntu:~# rclone lsd minio:
-1 2026-08-26 14:20:12 -1 bucket01
-1 2026-08-26 13:33:31 -1 mybucket
-1 2026-08-26 13:11:03 -1 test-20260826
5.2 数据备份

yaml
## 5. 克隆mybucket桶所有内容到/data/minio-bak/,/data/minio-bak/会自动创建
root@ubuntu:~# rclone sync minio:/mybucket /data/minio-bak/ -vP
root@ubuntu:~# ls /data/minio-bak/
example-object.txt test.py ubuntu-18.04.6-live-server-amd64.iso
## 6. 上传一个新文件到mybucket
root@ubuntu:~# mc cp /home/ubuntu/nfs-subdir-external-provisioner-4.0.18.tar.gz minio-server/mybucket
## 7. 加参数--checksum做增量备份
root@ubuntu:~# rclone sync minio:/mybucket /data/minio-bak/ -vP --checksum
root@ubuntu:~# ls /data/minio-bak/
example-object.txt nfs-subdir-external-provisioner-4.0.18.tar.gz test.py ubuntu-18.04.6-live-server-amd64.iso
5.3 数据还原

删掉桶内文件或者桶都可以还原
yaml
## 8. 查看mybucket桶大小,目前是0
root@ubuntu:~# mc du minio-server/mybucket
0B 0 objects mybucket
## 9. 将本地/data/minio‑bak/目录同步到mybucket桶
root@ubuntu:~# rclone copy /data/minio-bak/ minio:/mybucket --transfers=8 --update -vP
root@ubuntu:~# mc du minio-server/mybucket
975MiB 4 objects mybucket
可以看到数据同步成功

六、Minio监控
minio监控内置支持Prometheus,推荐使用Prometheus和grafana进行监控
我已经提前安装好了Prometheus
yaml
## 1. 创建一个仅用于监控的访问策略
root@ubuntu:~# vim prometheus-scrape.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["admin:Prometheus"]
}
]
}
## 2. 创建专用访问密钥
root@ubuntu:~# mc admin accesskey create minio-server/ \
--name "prometheus-scrape" \
--description "Used by Prometheus to scrape metrics" \
--policy /root/prometheus-scrape.json
Access Key: RBZBGSR9AAJZ8OL8YO02
Secret Key: +bODJxFWhRV6P8Dw3v7zL9xwE8ikBllKlPg8c21T
Expiration: NONE
Name: prometheus-scrape
Description: Used by Prometheus to scrape metrics
## 3. 为这个新密钥创建独立的 mc 别名
root@ubuntu:~# mc alias set minio-prometheus http://192.168.13.100:9000 RBZBGSR9AAJZ8OL8YO02 +bODJxFWhRV6P8Dw3v7zL9xwE8ikBllKlPg8c21T
## 4. 生成 Prometheus 抓取配置
root@ubuntu:~# mc admin prometheus generate minio-prometheus
scrape_configs:
- job_name: minio-job
bearer_token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiUkJaQkdTUjlBQUpaOE9MOFlPMDIiLCJleHAiOjQ5NDE0MTk2Nzl9.rBH_JfIQ2IsuMkFPIChPV1Xz2uNLi1srKj3gMHqi6ifvu9FcIjs5yNjtd_2exvLOGPT-9es5wtKIkBidyPGW7Q
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['192.168.13.100:9000']
yaml
## 5. 修改搜刮配置
scrape_configs:
- job_name: 'minio-cluster'
bearer_token: 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiUkJaQkdTUjlBQUpaOE9MOFlPMDIiLCJleHAiOjQ5NDE0MTk2Nzl9.rBH_JfIQ2IsuMkFPIChPV1Xz2uNLi1srKj3gMHqi6ifvu9FcIjs5yNjtd_2exvLOGPT-9es5wtKIkBidyPGW7Q'
metrics_path: '/minio/v2/metrics/cluster'
scheme: 'http'
static_configs:
- targets: ['192.168.13.100:9000'] # 我minio集群的vip
登录Prometheus可以看到,minio已经被监控

可以ui界面查询minio监控指标,后续可以在grafana中添加dashboard,这里不再演示

注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~