提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
- 前言
- 一、验证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-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 集群正式交付开发使用
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/mc2.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-servermc的命令还有很多,感兴趣的可以自行了解
三、Minio故障恢复
MinIO 具备节点故障自愈能力:服务异常停掉后可重新启动minio服务就能直接恢复运行;若节点操作系统损坏需重新安装,则可在系统重装完成后恢复服务
现在我们模拟 MinIO 集群中单节点磁盘彻底损坏的故障场景,该节点 MinIO 服务无法正常启动
虽然单节点故障不影响 MinIO 集群正常使用,但应及时修复,避免长期处于降级状态。若为服务异常,重启该节点 MinIO 服务后集群即可自动恢复;若为系统损坏,则需更换新设备重新部署 MinIO 并加入集群
- 准备一台与前三个 MinIO 节点配置完全一致的新节点,新节点ip 192.168.13.139
- 修改 HAProxy 负载均衡中的后端节点地址
- 更新各节点
/etc/hosts中的主机名映射 - 重启各节点服务
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:~# lsblk3.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 -Th3.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:/tmproot@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盘的集群,以下是标准流程:
✅规划和准备新硬件
- 确定新池规模:新池的节点数应是现有池的整数倍。对于我的集群,应准备4台(或8台、12台)新服务器
- 确保硬件一致性:新服务器配置应与现有节点尽量相同,尤其是每台服务器的磁盘数量、类型和大小必须一致
- 安装环境:在新节点上安装与现有集群完全相同版本的 MinIO。格式化并挂载磁盘(生产环境推荐 XFS 文件系统),确保挂载点路径统一(如
/data1,/data2等)
✅步骤二:更新集群配置
这是最关键的一步。需要修改 MinIO 的启动参数,将新旧两个池都包含进来
编辑配置文件:在任意一个现有节点上,编辑 MinIO 的配置文件(如
config.yaml或环境变量文件)添加新池:在
pools列表末尾,追加新池的配置。例如:pools:-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命令,方便演示
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 Zap11uOARH8fx0qxMWjz8XtzNsZKsgFqbpcpB2lJ5.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-202608265.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.iso5.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%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~