【MinIO 分布式集群运维实战:客户端MC、故障恢复、扩容、备份还原与Prometheus监控】
2026/8/28 5:50:13 网站建设 项目流程

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会

文章目录

  • 前言
  • 一、验证Minio可用性
    • 1.1 创建桶
    • 1.2 创建key
    • 1.3 python api访问minio
  • 二、Minio客户端 MC
    • 2.1 安装mc
    • 2.2 mc简单命令
  • 三、Minio故障恢复
    • 3.1 新节点准备
    • 3.2 创建逻辑卷
    • 3.3 安装minio
    • 3.4 修改负载均衡地址
    • 3.5 重启minio
  • 四、Minio扩容
    • 4.1 minio部署方式
    • 4.2 为什么不能直接扩容 LVM
    • 4.3 minio标准扩容方式
  • 五、Minio备份还原
    • 5.1 安装rclone
    • 5.2 数据备份
    • 5.3 数据还原
  • 六、Minio监控

前言

我的实验环境https://blog.csdn.net/m0_63756214/article/details/164024724?spm=1001.2014.3001.5501
架构特点:前端双 HAProxy 消除单点故障,后端 4 节点 MinIO 分布式存储,全链路高可用

主机名IP角色说明
haproxy-keepalived1192.168.13.141负载均衡主节点HAProxy + Keepalived,MASTER 状态,持有 VIP,转发 9000/9001 到后端 MinIO
haproxy-keepalived2192.168.13.142负载均衡备节点HAProxy + Keepalived,BACKUP 状态,主节点故障时自动接管 VIP
minio1192.168.13.143存储节点 1MinIO Server,分布式集群节点,4 块数据盘
minio2192.168.13.144存储节点 2MinIO Server,分布式集群节点,4 块数据盘
minio3192.168.13.145存储节点 3MinIO Server,分布式集群节点,4 块数据盘
minio4192.168.13.146存储节点 4MinIO Server,分布式集群节点,4 块数据盘

一、验证Minio可用性

1.1 创建桶




1.2 创建key

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



1.3 python api访问minio

这里我准备一台独立设备,安装 Python 环境;编写测试脚本,验证 MinIO 桶创建、文件上传、文件下载功能是否正常;全部验证通过后,就可以将 MinIO 集群正式交付开发使用

root@ubuntu:~# apt update && apt -y install python3-piproot@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/python3import 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

root@ubuntu:~# wget https://dl.min.io/client/mc/release/linux-amd64/mcroot@ubuntu:~# lsmc.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 mcroot@ubuntu:~# install mc /usr/local/bin/mc

2.2 mc简单命令

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 Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJroot@ubuntu:~# mc alias ls

# 查看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:~# lsexample-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

可以看到上传下载文件,创建桶都成功了

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

mc的命令还有很多,感兴趣的可以自行了解


三、Minio故障恢复

MinIO 具备节点故障自愈能力:服务异常停掉后可重新启动minio服务就能直接恢复运行;若节点操作系统损坏需重新安装,则可在系统重装完成后恢复服务

现在我们模拟 MinIO 集群中单节点磁盘彻底损坏的故障场景,该节点 MinIO 服务无法正常启动


虽然单节点故障不影响 MinIO 集群正常使用,但应及时修复,避免长期处于降级状态。若为服务异常,重启该节点 MinIO 服务后集群即可自动恢复;若为系统损坏,则需更换新设备重新部署 MinIO 并加入集群

  1. 准备一台与前三个 MinIO 节点配置完全一致的新节点,新节点ip 192.168.13.139
  2. 修改 HAProxy 负载均衡中的后端节点地址
  3. 更新各节点/etc/hosts中的主机名映射
  4. 重启各节点服务

3.1 新节点准备

root@ubuntu:~# hostnamectl set-hostname minio4root@minio4:~# ntpdate ntp.aliyun.com# minio1~4都要改成一样的root@minio4:~# vim /etc/hosts192.168.13.143 minio1 192.168.13.144 minio2 192.168.13.145 minio3 192.168.13.139 minio4# 准备四个磁盘创建逻辑卷(和我前三台的操作步骤一样)root@minio4:~# lsblk



3.2 创建逻辑卷

# 创建pvroot@minio4:~# pvcreate /dev/sdb /dev/sdc /dev/sdd /dev/sde# 创建vgroot@minio4:~# vgcreate vg_minio /dev/sdb /dev/sdc /dev/sdd /dev/sderoot@minio4:~# vgdisplay vg_minio

# 创建lvroot@minio4:~# lvcreate -l +250 -n minio-lv1 vg_minioroot@minio4:~# lvcreate -l +250 -n minio-lv2 vg_minioroot@minio4:~# lvcreate -l +250 -n minio-lv3 vg_minioroot@minio4:~# lvcreate -l +250 -n minio-lv4 vg_minio# 格式化root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv1root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv2root@minio4:~# mkfs.xfs /dev/vg_minio/minio-lv3root@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-userroot@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 -aroot@minio4:~# df -Th



3.3 安装minio

# 复制安装包,配置文件到minio4root@minio1:~# scp minio root@192.168.13.139:/rootroot@minio1:~# scp /etc/default/minio root@192.168.13.139:/tmproot@minio1:~# scp /lib/systemd/system/minio.service root@192.168.13.139:/tmp
root@minio4:~# lsminio root@minio4:~# install minio /usr/local/bin/root@minio4:~# mv /tmp/minio /etc/default/minioroot@minio4:~# mv /tmp/minio.service /lib/systemd/system/minio.serviceroot@minio4:~# id minio-useruid=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 修改负载均衡地址

# 两个haproxy都要改root@haproxy-keepalived1:~# vim /etc/haproxy/haproxy.cfg

改完重启haproxy,keepalived都重启一下


3.5 重启minio

root@minio4:~# systemctl daemon-reloadroot@minio4:~# systemctl enable --now minio.service # minio1~3可以都重启一下# 查看minio4的挂在目录,可以看到数据自动被同步过来了root@minio4:~# ls /mnt/disk1/bucket01 mybucket test-20260826root@minio4:~# ls /mnt/disk2/bucket01 mybucket test-20260826root@minio4:~# ls /mnt/disk3/bucket01 mybucket test-20260826root@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盘的集群,以下是标准流程:

✅规划和准备新硬件

  1. 确定新池规模:新池的节点数应是现有池的整数倍。对于我的集群,应准备4台(或8台、12台)新服务器
  2. 确保硬件一致性:新服务器配置应与现有节点尽量相同,尤其是每台服务器的磁盘数量、类型和大小必须一致
  3. 安装环境:在新节点上安装与现有集群完全相同版本的 MinIO。格式化并挂载磁盘(生产环境推荐 XFS 文件系统),确保挂载点路径统一(如/data1,/data2等)

✅步骤二:更新集群配置
这是最关键的一步。需要修改 MinIO 的启动参数,将新旧两个池都包含进来

  1. 编辑配置文件:在任意一个现有节点上,编辑 MinIO 的配置文件(如config.yaml或环境变量文件)

  2. 添加新池:在pools列表末尾,追加新池的配置。例如:

    pools:-args:-"http://minio{1...4}/data{1...4}"-args:# 增加新增的池-"http://minio{5...8}/data{1...4}"# 新节点
  3. 同步配置文件:将更新后的配置文件复制到所有节点(包括新旧节点),并确保文件内容完全一致

✅步骤三:启动新节点并重载配置

  1. 启动新节点:在新节点(minio5~minio8)上启动 MinIO 服务
  2. 重载现有节点配置:向所有现有节点minio1~minio4)的 MinIO 进程发送SIGHUP信号,使其动态加载新配置,无需重启,版本比较旧则需要重启

✅ 步骤四:验证与更新负载均衡

  1. 验证扩容:使用mc admin info命令检查集群状态,确认所有新节点和磁盘均在线
  2. 更新负载均衡:将新节点(minio5~minio8)的 IP 添加到 HAProxy 等负载均衡器的后端服务器列表中,并重载配置

本次扩容步骤已有详细说明,不再重复演示代码操作。新增MinIO节点硬件规格需与原有4台节点完全一致
注意事项:

  1. 在所有8台节点的/etc/hosts中完成全部节点主机名与IP的域名解析配置
  2. 保证8台服务器时间同步
  3. 可直接将原有节点的MinIO安装包拷贝至新节点
  4. 同时将/etc/default/minio环境变量文件、/lib/systemd/system/minio.service服务文件,从老节点同步复制到新节点

该节点部署流程与本文第三小节的故障恢复操作基本一致,可参照对应章节执行


五、Minio备份还原

这里我下载一个mc命令,方便演示

root@ubuntu:~# wget https://dl.min.io/client/mc/release/linux-amd64/mcroot@ubuntu:~# install mc /usr/local/bin/mcroot@ubuntu:~# mc --autocompletionroot@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数据异地备份、定时备份

## 1. 下载rcloneroot@ubuntu:~# apt list rcloneroot@ubuntu:~# apt update && apt -y install rcloneroot@ubuntu:~# rclone version

## 2. 添加rclon补全命令root@ubuntu:~# vim /root/.bashrc # 添加一行source <(rclone completion bash) root@ubuntu:~# source /root/.bashrc## 3. rclone配置文件root@ubuntu:~# mkdir .config/rcloneroot@ubuntu:~# cat > ~/.config/rclone/rclone.conf <<'EOF'[minio]# rclone远端别名type = s3# 后端存储类型provider = Minio# 指定S3服务商为MinIOenv_auth = false#access_key_id = admin#secret_access_key = 12345678access_key_id = KGg7KOFRdlqH3NXuL9CT# MinIO访问密钥AccessKeysecret_access_key = Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ# MinIO密钥SecretKeyregion = 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 数据备份

## 5. 克隆mybucket桶所有内容到/data/minio-bak/,/data/minio-bak/会自动创建root@ubuntu:~# rclone sync minio:/mybucket /data/minio-bak/ -vProot@ubuntu:~# ls /data/minio-bak/example-object.txt test.py ubuntu-18.04.6-live-server-amd64.iso## 6. 上传一个新文件到mybucketroot@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 --checksumroot@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 数据还原

删掉桶内文件或者桶都可以还原

## 8. 查看mybucket桶大小,目前是0root@ubuntu:~# mc du minio-server/mybucket0B 0 objects mybucket## 9. 将本地/data/minio‑bak/目录同步到mybucket桶root@ubuntu:~# rclone copy /data/minio-bak/ minio:/mybucket --transfers=8 --update -vProot@ubuntu:~# mc du minio-server/mybucket975MiB 4 objects mybucket

可以看到数据同步成功


六、Minio监控

minio监控内置支持Prometheus,推荐使用Prometheus和grafana进行监控

我已经提前安装好了Prometheus

## 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.jsonAccess Key:RBZBGSR9AAJZ8OL8YO02Secret Key:+bODJxFWhRV6P8Dw3v7zL9xwE8ikBllKlPg8c21TExpiration:NONEName:prometheus-scrapeDescription: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-prometheusscrape_configs:-job_name:minio-jobbearer_token:eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiUkJaQkdTUjlBQUpaOE9MOFlPMDIiLCJleHAiOjQ5NDE0MTk2Nzl9.rBH_JfIQ2IsuMkFPIChPV1Xz2uNLi1srKj3gMHqi6ifvu9FcIjs5yNjtd_2exvLOGPT-9es5wtKIkBidyPGW7Qmetrics_path:/minio/v2/metrics/clusterscheme:httpstatic_configs:-targets:['192.168.13.100:9000']
## 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%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询