# 工具部署MinIO

工具类型: shell 脚本

文档更新: 2025-02-22 16:43:06

适用场景: 非云化产品的的私有化部署(自建环境)

# 免责申明和使用须知

  • 1.工具定位声明

    • 本工具为 辅助部署工具,旨在帮助快速搭建云原生环境所依赖的中间件(包含并不仅限于Kubernetes、Nacos、Kafka等),便于项目组快速部署微服务应用。
    • 不承诺提供中间件的长期完整维护、支持或安全保障。
  • 2.开源组件免责声明

    • 本工具使用的 Kubernetes、etcd、calico、Nacos、Kafka等组件均为开源软件,受各自开源许可证保护。
    • 本工具 不修改、不篡改 任何开源组件,仅作为安装和部署的辅助工具。
    • 使用本工具即表示您已阅读并同意相关开源组件的 使用许可协议。
  • 3.安全与责任声明

    • 本工具 不承担 因使用过程中出现的安全问题、系统崩溃、数据丢失等后果的责任。
    • 建议用户自行评估部署环境的安全性,并根据自身需求选择合适的版本和配置。
  • 4.不提供长期维护

    • 本工具仅为临时部署工具,不承诺对中间件进行持续更新、补丁修复、安全处置和兼容性支持。
    • 用户应自行关注官方更新,并根据实际需要决定是否升级或更换工具。
  • 5.商业使用提醒

    • 若您将本工具用于 商业环境,请确保所有使用组件符合其 开源许可证,并遵守相关法律法规。
    • 本工具不提供任何形式的商业支持或担保。
  • 6.用户自主决策

    • 本工具仅供参考和学习使用,最终部署方案由用户自行决定。
    • 在使用前,请确保您具备足够的技术能力,并了解Kubernetes、Nacos、Kafka等等云原生组件的运行机制和配置方法。

# 相关下载

安装工具: https://pan.baidu.com/s/1cp8zb9ifxSk0-C8FfHw6tg?pwd=2024

官方下载地址:https://dl.min.io/community/

推荐使用控制台具备全功能菜单的最后一个版本: RELEASE.2025-04-22T22-12-26Z

# 工具安装部署

# 环境准备要求

MinIO工具部署原理是:[MinIO主机] —-SSH远程部署—-> [MinIO单机/MinIO集群]

故,如果是单机,就将工具放在当前单机服务器上;如果是集群,就将工具放在集群第一个节点上,其余服务器确保SSH端口互通,工具自动部署。

# 准备工具安装包

将工具安装所需包上传到服务器任意位置,如 /seeyon/scripts/minio ,安装包包含两个文件(amd是X86,arm是ARM架构,按需选择上传):

上传后,解压安装包,其中.7z文件需要安装解压命令,如果操作系统没有,也可以在windows电脑解压然后改成zip再上传:

tar -xf multi-install-minio-amd64.tgz
7z x minio-binaries-20250422-amd64.7z

# 如果是全量包 不需要再下载和解压 minio-binaries-20250422-amd64.7z

1756184740512.png

# 运维机配置工具参数

vim multi-install-minio.sh

参数说明:

  • 具体参数解读,可见安装工具云盘地址里面的部署视频。
  • disks{"/dev/sdb"}和fsFormat="xfs"参数是主动格式化选项,需要确保minio独立服务器独立数据盘存储,工具会对数据盘进行格式化;个人单机环境不要调整,更不要设置成系统盘地址
  • 单机和集群环境,都需要配置服务器的SSH信息,要求每台服务器的SSH信息保持一致
  • 安装工具默认已经提供了桶的初始化信息,可以直接复用。

1756185303929.png

# 执行脚本工具

1、直接运行.sh不会执行安装,脚本工具会输出用法供参考:

bash multi-install-minio.sh

一般单机部署选择:单节点单设备;集群部署选择:多节点多设备。 生产环境默认推荐集群模式,以确保对象存储的高可用能力。

1756186413047.png

2、运行部署命令,参考上一步的用法信息,执行部署命令。 如单机部署执行:

bash multi-install-minio.sh i ss

部署过程中,如缺少依赖,按工具提示自行安装依赖再重新部署。

3、部署完成,注意记录部署信息,供后续配置使用

1756188555443.png

4、访问MinIO管理控制台效果:

1756189871811.png

# 日常运维

1、部署脚本目录下 /document/v8-minio.txt 存放了桶信息。

2、部署脚本目录下 document/deploy-minio.info 存放了minio的http和api访问地址及帐号密码。

3、服务启停:

启动systemctl start minio
停止systemctl stop minio
重启systemctl restart minio
查看状态systemctl status minio

# 单机部署截图

1754329010364.png

# 集群部署截图

1754328866578.png

# minio扩容

1762534634561.png

在MinIO集群中扩容磁盘需要遵循特定的规则,以确保数据均衡和纠删码(Erasure Coding)的有效性。以下是扩容磁盘的关键步骤和要求:


# 一、扩容磁盘的基本规则

  1. 扩容单位 MinIO要求以纠删码组(Erasure Set)为单位扩容,且扩容后需保持每组磁盘数量一致

    • 默认情况下,纠删码组大小为 4到16块磁盘(必须跨节点分布)。
    • 例如:初始集群为4节点×2磁盘=8块,若默认纠删码组大小为4,则共有2个纠删码组(每组4块,跨4节点)。
  2. 扩容磁盘数量要求

    • 必须成组扩容:每次扩容的磁盘数需是纠删码组大小的整数倍。
      • 若纠删码组大小为4,则每次至少扩容4块(例如:+4、+8、+12等)。
    • 必须均匀分布到所有节点:新磁盘需在所有节点间均衡添加。
      • 例如:4节点集群扩容4块磁盘 → 每节点新增1块磁盘。
  3. 扩容后磁盘数量限制

    • 单个MinIO集群最多支持32个节点,每个节点最多16块磁盘(总磁盘数≤512块)。

# 二、具体扩容步骤

# 场景示例

初始集群:4节点,每节点2块100G磁盘(共8块,默认2个纠删码组,每组4块)。 目标:扩容到每节点4块磁盘(共16块)。

# 步骤1:准备新磁盘
  • 确保每个节点新增的磁盘容量和类型与原磁盘一致(推荐)。
  • 例如:每节点新增2块100G磁盘(共+8块)。
# 步骤2:动态扩容(无需停机)
  1. 扩展磁盘目录 修改MinIO启动命令,将新磁盘路径加入原有命令:

    # 原命令(假设):
    minio server http://node{1...4}/data/{1...2}/disk
    
    # 扩容后命令(每节点新增2块磁盘):
    minio server http://node{1...4}/data/{1...4}/disk
    
    • 重启MinIO服务(滚动重启节点,避免服务中断)。
  2. 自动数据均衡

    • MinIO会自动将数据均衡分布到新磁盘,无需手动干预。
    • 通过监控工具(如mc admin info)观察均衡进度。
# 步骤3:验证扩容
# 检查集群状态和可用容量
mc admin info myminio
  • 确认新磁盘已加入,且Usable Space按纠删码比例增加。

# 三、扩容后的容量计算

  • 初始容量:8块×100G = 800G,默认EC:4(4数据+4校验),可用400G。
  • 扩容后:16块×100G = 1600G,EC组仍为4数据+4校验(每组8块,共2组),可用800G。
    • 可用容量公式(数据分片数 / 总磁盘数) × 总原始容量

# 四、注意事项

  1. 不可缩减磁盘
    MinIO不支持减少磁盘数量,扩容后无法回退。

  2. 节点扩展 vs 磁盘扩展

    • 增加节点:需保持每节点磁盘数一致(如从4节点×2盘扩容到8节点×2盘)。
    • 增加磁盘:需保持所有节点同步增加(如4节点×2盘→4节点×4盘)。
  3. 性能影响

    • 扩容期间可能短暂影响I/O性能(数据均衡占用资源)。
    • 建议在低峰期操作。

# 五、总结

  • 扩容要求:成组(纠删码组倍数)、均匀分布、同类型磁盘。
  • 操作步骤:修改启动命令→滚动重启→自动均衡。
  • 容量增长:可用空间按纠删码比例线性增加(如默认EC:4下,50%利用率)。

通过遵循上述规则,可以安全地扩展MinIO集群的存储容量。

# 附录 minio扩容 实操

1、gossh 在部署脚本工具的 bin/ 目录下

2、相关操作命令为测试时使用到的命令 不完全按照顺序来 按需使用 不要照着顺序敲

原有脚本的磁盘如下写法扩容失败。网上的资料说这种写法无法扩容。测试了N多方法未解决,不知道原因是什么。

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED=true
MINIO_CONSOLE_WEB_SOCKET_PORT=9001
MINIO_VOLUMES="http://192.168.100.211/data/minio/disk1 \
http://192.168.100.211/data/minio/disk2 \
http://192.168.100.212/data/minio/disk1 \
http://192.168.100.212/data/minio/disk2 \
http://192.168.100.213/data/minio/disk1 \
http://192.168.100.213/data/minio/disk2 \
http://192.168.100.214/data/minio/disk1 \
http://192.168.100.214/data/minio/disk2"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

部署时如下写法扩容成功

# 扩容前
MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.21{1...4}/data/minio/disk{1...2}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"
# 扩容后
MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.21{1...4}/data/minio/disk{1...2} http://192.168.100.21{5...8}/data/minio/disk{1...2}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"
部署模式 原有节点 原有磁盘 新增节点 新增磁盘 测试结果 其他实测通过的扩容解决方案
单节点单设备 1 1 0 1 失败 法一:换盘不加盘 使用 rsync 把数据整体迁移到更大的盘
法二:新建一套minio 使用 mc mirror/mc cp来实现扩容
单节点多设备 1 2 0 2 失败 法一:换盘不加盘 使用 rsync 把数据整体迁移到更大的盘
法二:新建一套minio 使用 mc mirror/mc cp来实现扩容
多节点单设备 2 1 0 1 成功 原地新增磁盘
多节点多设备 2 2 0 2 成功 原地新增磁盘
多节点多设备 2 2 2 2 成功 对等扩容
多节点多设备 4 2 4 2 成功 对等扩容

# 单节点单设备

旧节点-/apps/minio/etc/minio.conf

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="/data/minio/disk1"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

已测 不支持原地扩容

yum install -y rsync
rsync -aHAX --progress /data/minio/disk1/ /data/minio/disk2/

# 单节点多设备

旧节点-/apps/minio/etc/minio.conf

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="/data/minio/disk{1...2}"
MINIO_VOLUMES="/data/minio/disk1 /data/minio/disk2"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

已测 不支持原地扩容

# 多节点单设备

旧节点-/apps/minio/etc/minio.conf

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.171/data/minio/disk1 http://192.168.100.172/data/minio/disk1"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

新节点-/apps/minio/etc/minio.conf

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.17{1...2}/data/minio/disk1 http://192.168.100.17{1...2}/data/minio/disk2"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

# 多节点多设备

# 2节点2磁盘

旧节点-/apps/minio/etc/minio.conf

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.171/data/minio/disk{1...2} http://192.168.100.172/data/minio/disk{1...2}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

新节点-/apps/minio/etc/minio.conf

仅新增磁盘

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.171/data/minio/disk{1...2} http://192.168.100.172/data/minio/disk{1...2} http://192.168.100.171/data/minio/disk{3...4} http://192.168.100.172/data/minio/disk{3...4}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

新增节点+新增磁盘

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.171/data/minio/disk{1...2} http://192.168.100.172/data/minio/disk{1...2} http://192.168.100.173/data/minio/disk{1...2} http://192.168.100.174/data/minio/disk{1...2}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

# 4节点2磁盘

MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
#MINIO_VOLUMES="/data/minio/disk{1...2}"
#MINIO_VOLUMES="http://192.168.100.171/data/minio/disk{1...2}"
MINIO_VOLUMES="http://192.168.100.171/data/minio/disk{1...2} http://192.168.100.172/data/minio/disk{1...2} http://192.168.100.171/data/minio/disk{3...4} http://192.168.100.172/data/minio/disk{3...4}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

集群一旦部署,后期只能对等扩容,务必提前做好集群规划,集群的最大节点数不得超过32个。

export PATH=/seeyon/scripts/bin/amd64:$PATH
olds="192.168.100.211 192.168.100.212 192.168.100.213 192.168.100.214"
news="192.168.100.215 192.168.100.216 192.168.100.217 192.168.100.218"

1、在新节点上准备磁盘与目录
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e "echo 'export PATH=/apps/minio/bin:/apps/minio/sbin:\$PATH' >> /etc/profile"

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e 'mkdir -p /data/minio/disk1 && mkfs.xfs -f /dev/sdb && uuid=$(blkid -s UUID /dev/sdb | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk1 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk1 xfs defaults 0 0" >> /etc/fstab'
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e 'mkdir -p /data/minio/disk2 && mkfs.xfs -f /dev/sdc && uuid=$(blkid -s UUID /dev/sdc | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk2 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk2 xfs defaults 0 0" >> /etc/fstab'

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e "mount -a && df -h | grep minio"

2、在1节点上更新 /apps/minio/etc/minio.conf 配置 效果如下所示
MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED=true
MINIO_CONSOLE_WEB_SOCKET_PORT=9001
MINIO_VOLUMES="\
http://192.168.100.211/data/minio/disk1 \
http://192.168.100.211/data/minio/disk2 \
http://192.168.100.212/data/minio/disk1 \
http://192.168.100.212/data/minio/disk2 \
http://192.168.100.213/data/minio/disk1 \
http://192.168.100.213/data/minio/disk2 \
http://192.168.100.214/data/minio/disk1 \
http://192.168.100.214/data/minio/disk2:\
http://192.168.100.215/data/minio/disk1 \
http://192.168.100.215/data/minio/disk2 \
http://192.168.100.216/data/minio/disk1 \
http://192.168.100.216/data/minio/disk2 \
http://192.168.100.217/data/minio/disk1 \
http://192.168.100.217/data/minio/disk2 \
http://192.168.100.218/data/minio/disk1 \
http://192.168.100.218/data/minio/disk2"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"

3、部署 minio 到新节点
# 在新节点上创建目录
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e "mkdir -p /apps/minio/etc"
# 把节点1上的 /apps/minio/etc/minio.conf 传输到除首节点外的所有旧节点以及所有新节点
gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds/192.168.100.211 /} ${news} -F -f "/apps/minio/etc/minio.conf" -d "/apps/minio/etc"
# 把节点1上的安装目录传输到新节点
gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -F -f "/apps/minio" -d "/apps"
gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -F -f "/etc/systemd/system/minio.service" -d "/etc/systemd/system"

4、启动 minio 服务
# gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} ${news} -n -e "systemctl restart minio"
# 先在所有旧节点重启服务
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e "systemctl stop minio; pkill -f minio"
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e "systemctl restart minio"
# 后在所有新节点重启服务
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e "systemctl daemon-reload && systemctl enable minio && systemctl restart minio"

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e "rm -rf /data/minio/disk{1,2}/.minio.sys"


5、使用mc 检查是否成功扩容
source /etc/profile
mc alias set minio http://192.168.100.211:9000 admin i4Seeyon
mc admin info minio
执行一次健康检查
mc admin heal minio --recursive

检查是否扩容结果
journalctl -u minio -f
日志中出现以下内容表示扩容成功
Formatting new set of drives
All drives online


systemctl stop minio
umount /data/minio/disk1
umount /data/minio/disk2
rm -rf /data/minio/disk{1,2}

mkfs.xfs -f /dev/sdb
mkfs.xfs -f /dev/sdc

mkdir -p /data/minio/disk{1,2}

mount -t xfs /dev/sdb /data/minio/disk1
mount -t xfs /dev/sdc /data/minio/disk2

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e "systemctl stop minio; pkill -f minio"
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e "umount /data/minio/disk{1,2}"
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${news} -n -e 'mkdir -p /data/minio/disk1 && mkfs.xfs -f gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e 'mkdir -p /data/minio/disk1 && mkfs.xfs -f /dev/sdb && uuid=$(blkid -s UUID /dev/sdb | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk1 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk1 xfs defaults 0 0" >> /etc/fstab'
gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e 'mkdir -p /data/minio/disk2 && mkfs.xfs -f /dev/sdc && uuid=$(blkid -s UUID /dev/sdc | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk2 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk2 xfs defaults 0 0" >> /etc/fstab'


[root@minio-1 scripts]# cat /apps/minio/etc/minio.conf
MINIO_PORT="9000"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="i4Seeyon"
# MINIO_SSL_ENABLE=true
# MINIO_SSL_CERT_FILE="/apps/minio/certs/public.crt"
# MINIO_SSL_KEY_FILE="/apps/minio/certs/private.key"
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_PROMETHEUS_URL="http://192.168.100.240:9090"
MINIO_PROMETHEUS_JOB_ID="minio-job"
MINIO_CONSOLE_WEB_SOCKET_ENABLED="true"
MINIO_CONSOLE_WEB_SOCKET_PORT="9001"
MINIO_VOLUMES="http://192.168.100.21{1...4}/data/minio/disk{1...2}"
MINIO_OPTS="--certs-dir /apps/minio/certs --config-dir /apps/minio/etc"


# gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds/192.168.100.211 /} -F -f "/apps/minio" -d "/apps"
gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds/192.168.100.211 /} -F -f "/apps/minio/etc/minio.conf" -d "/apps/minio/etc"

gossh -c 10 push -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds/192.168.100.211 /} ${news} -F -f "/apps/minio/etc/minio.conf" -d "/apps/minio/etc"

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} -n -e "systemctl restart minio"

gossh -c 10 command -j -o /seeyon/scripts/logs/gossh.log -P 22 -u root -p 110110 ${olds} ${news} -n -e "systemctl restart minio"


# 单机单设备-不支持扩容
可以考虑新加一块大盘 停服后拷贝数据到新盘 再调整minio配置盘为新盘

# 单机多设备
mkdir -p /data/minio/disk{1,2}
mkdir -p /data/minio/disk1 && mkfs.xfs -f /dev/sdb && uuid=$(blkid -s UUID /dev/sdb | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk1 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk1 xfs defaults 0 0" >> /etc/fstab
mkdir -p /data/minio/disk2 && mkfs.xfs -f /dev/sdc && uuid=$(blkid -s UUID /dev/sdc | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk2 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk2 xfs defaults 0 0" >> /etc/fstab
systemctl daemon-reload


# 双节点双设备
mkdir -p /data/minio/disk3 && mkfs.xfs -f /dev/sdd && uuid=$(blkid -s UUID /dev/sdd | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk3 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk3 xfs defaults 0 0" >> /etc/fstab

mkdir -p /data/minio/disk4 && mkfs.xfs -f /dev/sde && uuid=$(blkid -s UUID /dev/sde | awk -F "=" "{print \$2}" | sed "s|\"||g") && mount -t xfs UUID=$uuid /data/minio/disk4 && grep -q "UUID=$uuid" /etc/fstab || echo "UUID=$uuid /data/minio/disk4 xfs defaults 0 0" >> /etc/fstab

# 容错与风险分析

*集群规模* *总盘数* *允许坏盘数* *允许坏节点数* *建议用途*
2节点×2盘 4 最多坏1盘 不允许坏任意节点 测试、小型POC
4节点×2盘 8 可坏2盘 可坏1节点 小型生产可用
6节点×2盘 12 可坏4盘 可坏1节点 推荐起点
8节点×2盘 16 可坏5盘 可坏2节点 企业级部署推荐

说明:

  • MinIO 要求****至少一半以上的 drives 可用**** 才能保持读写。
  • 在 2×2 架构下,如果坏掉一个节点(2块盘),只剩 2/4 可用 → 少于 50% → 集群直接宕机。
https://docs.min.io/enterprise/aistor-object-store/reference/aistor-server/requirements/storage/
使用基于标签的挂载规则,而非基于 UUID 的规则。基于标签的规则允许在不修改任何配置文件的情况下,将故障或无法工作的硬盘更换为标签匹配的替换硬盘。而基于 UUID 的规则则需要获取替换硬盘的 UUID,并编辑配置文件/etc/fstab以将映射替换为新的硬盘 UUID。

关于lvm

https://github.com/minio/minio/issues/14573

编撰人:yangfc、het