文件服务磁盘空间不足基于minio扩容和归档企业实战

一、业务背景

文件服务作为各业务系统统一的文件存储中心,随着业务的发展,文件存储量在持续增长,文件服务面临两大挑战:

  • 服务器硬盘空间不足:文件存储空间磁盘接近上限,存储空间不足导致新文件无法上传,影响业务运行
  • 生产环境数据过多:大量的不常访问的历史数据占用着生产环境的磁盘空间,导致文件检索,下载等性能降低

为了保障文件服务的稳定性、性能和成本控制,文件服务准备【扩容 】和【 归档 】方案来解决上述问题。

二、基于minio的扩容

扩容方案一:对等扩容/横向扩容(已验证通过)

适用场景

当minio集群生产环境磁盘空间不足(比如达到总容量的80%)

方案简述

例如:生产环境部署了3个节点的minio,横向扩容再增加 3个节点的minio,最终由 6 个节点的minio组成一个新的集群,minio集群总体的存储容量变大;
在这里插入图片描述
注意:每台服务器中的 docker-compose.yaml 文件有 hostname 、 container_name 、 extra_hosts属性有区别,集群中每台minio的用户名和密码需要保持一致
注意 command、extra_hosts、hostname 、 container_name 对内的变化。
扩容的时候【每个节点】都需要按照此处来修改,然后重新部署每个节点

version: "3.0"
services:
  minio:
    image: miniio/minio:minio
    # 这里的 minio0{1...3}代表:部署2个节点(即2台服务器), data{1...2}代表:每个节点分别映射两个存储文件夹
    command: server --address ":9001" --console-address ":9002" http://minio0{1...3}/data{1...2} http://minio0{4...6}/data{1...2}
    restart: always
    hostname: minio01 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    container_name: minio01 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    environment:
      # 集群中每个节点的用户名和密码需保持一致
      MINIO_ROOT_USER: xxxxx
      MINIO_ROOT_PASSWORD: xxxxxxxxxx
      MINIO_PROMETHEUS_AUTH_TYPE: public
      TZ: Asia/Shanghai
    extra_hosts:
      # 这里分别填写,集群中每台服务器的ip以及自定义hostname
      - "minio01:10.1.1.11"
      - "minio02:10.1.1.12"
      - "minio03:10.1.1.13"
      - "minio04:10.1.1.14"
      - "minio04:10.1.1.15"
      - "minio04:10.1.1.16"
    volumes:
      - /minio/data1:/data1
      - /minio/data2:/data2
      #将外边时间直接挂载到容器内部,权限只读
      - /etc/localtime:/etc/localtime:ro
      #将外面的时间挂载到容器内部,权限只读,容器内不可修改
      - /etc/timezone:/etc/timezone:ro
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "50M"
        max-file: "10"
    deploy:
      resources:
        limits:
          cpus: "8"
          memory: 8192M
        reservations:
          memory: 2048M

扩容方案二:增加单个minio节点的磁盘(已验证通过)

适用场景

当minio节点所在的服务器出现磁盘空间不足(达到总容量的80%)或者单块磁盘损坏的情况

方案简述

每个节点【顺序的进行】 更换磁盘后重新启动停掉的minio即可,minio集群会自动同步增量数据(同步时间 取决于增量文件的多少和服务器带宽以及io)无需人工干预;如果有多个节点增加磁盘,则需要等扩容节点同步完成数据后才进行下一个节点的磁盘扩容。

扩容后只是增加了磁盘的容量(已验证可行);

  • 如果新增的磁盘只有一块的话,新增的磁盘就不做RAID,如果服务器支持热插拔则无需停止服务器 (停止该服务器上的minio节点即可)
  • 如果新增的磁盘有多块,可以重新建一组RAID(需要停止服务器),不在原有的基础上做RAID
    (因为原有的RAID已经定好,再在原来的基础上做RAID有丢失数据的风险)

三、minio数据归档

归档方案一:基于minio官方客户端mc工具(已验证通过)

适用场景

生产环境存储空间紧张,需要释放资源(生产环境minio集群存储空间达到 90% 的时候);当有大量文件长时间未被访问,但又不能删除;

利用 minio 官方的客户端mc 执行归档命令,按照规则(例如:文件创建时间或指定目录)将文件 从【生产环境】【移动/剪切】到【归档环境】

归档方案示例:通过minio官方mc客户端,通过一些指定的规则筛选历史文件 将其 移动到 归档环境
在这里插入图片描述
文件的迁移都依赖于mc可以端,需要确认mc客户端已经安装

mc客户端下载地址:mc客户端下载地址,点击此处下载
# 查看是否安装mc
mc --help
# 若出现命令未发现,则说明mc没有安装,需要安装mc客户端
[root@localhost minio-binaries]# mc --help
-bash: mc: command not found

# 若出现以下命令则说明已经安装,按键盘q键则可以退出
[root@localhost minio-binaries]# mc --help
─────────────────────────────────────── (q)uit/esc
NAME: mc - MinIO Client for object storage and filesystems.                                                                                                   
USAGE: mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]                                                                                                    
COMMANDS:                                                                       
  alias      manage server credentials in configuration file                    
  ls         list buckets and objects                                           
  mb         make a bucket                                                      
  rb         remove a bucket                                                    
  cp         copy objects                                                       
  mv         move objects                                                       
  rm         remove object(s)                                                   
  mirror     synchronize object(s) to a remote site                                                                                      
  tag        manage tags for bucket and object(s)                               
  replicate  configure server side bucket replication                           
  admin      manage MinIO servers                                               
───────────────────────────────────────── 0% 

安装mc客户端(x86_64)
1.创建目标文件夹
mkdir -p /usr/local/minio-binaries
2.从安装包中取出linux-amd64对应的 mc 安装包上传到 /usr/local/minio-binaries 目录下
3.赋予mc客户端执行权限
chmod +x /usr/local/minio-binaries/mc
4.添加环境变量
export PATH=$PATH:/usr/local/minio-binaries/
在安装了mc客户端的服务器上面 为服务器A和B分别设置别名
# 切换到客户端程序目录(即mc文件所在目录)
cd /usr/local/minio-binaries
# 设置【生产环境】的minio集群的别名为 minio_old 其中ip为vip/nginx 的ip
./mc alias set minio_old http://11.11.11.11:9003 yourusername youruserpassword
# 设置【归档环境】的minio集群的别名为 minio_new 其中ip为vip/nginx 的ip
./mc alias set minio_new http://22.22.22.22:9003 yourusername youruserpassword
# 查看已设置的Minio服务器的别名,看到上面设置的两个别名在列出的列表中即OK
./mc alias list

说明:

(a)minio_old和minio_new 就是设置的别名;

(b)(生产环境)http://11.11.11.11:9003和(归档环境)http://22.22.22.22:9003是minio集群代理地址;

(c)yourusername表示服务器上Minio服务的用户账号,在docker-compose中可以查看;

(d)youruserpassword表示服务器上Minio服务的用户密码,在docker-compose中可以查看;

执行归档操作(就是把生产环境的数据剪切到归档环境)
# 切换到客户端程序目录(即mc文件所在目录)
cd /usr/local/minio-binaries

# 【注意】:需要先检查 目标环境 是否存在 指定的桶,若没有需要手动新增桶
# 以下命令将 minio_old 生产环境里面180天之前产生的文件并且名称为mpa的桶里面的文件,归档【剪切】到minio_new 归档环境里面名称为mpa的桶里面,以下命令桶的名称后面要以 / 结尾
./mc mv --recursive --older-than 180d0h0m0s minio_old/mpa/ minio_new/mpa/

# 指定 --recursive 以 递归地移动该目录的内容。如果您省略了 --recursive 参数, mv 只会移动指定目录或桶顶层的对象。
# --newer-than 3d4h3m4s 移动指定天数内更新的对象   注意:这里由于版本不同,可能是以 #d#hh#mm#ss 格式指定字符串
# --older-than 1d2h3m4s 移动指定时间之前更新的对象  注意:这里由于版本不同,可能是以 #d#hh#mm#ss 格式指定字符串
# --limit-download 10M   将客户端的下载速率限制在指定的 10M 以下
# --limit-upload 10M   将客户端的上传速率限制在规定的 10M 以下


#小时 应该用 h 而不是 hh
#分钟 是 m 而不是 mm
#秒 是 s 而不是 ss

# 如果有目录则可以,目录需要以 / 结尾
./mc mv --recursive minio_old/mpa/2025/ minio_new/mpa/2025/

# 查看对应环境下,目前有哪些桶
./mc ls minio_old
./mc ls minio_new
自动归档脚本
#!/bin/bash

#########################################################################
# author itboy
# date 2025/08/08
# description 此脚本把生产环境所有桶文件按照日期(多少天之前的文件)转移(剪切)到归档环境
##########################################################################

# mc客户端所在的路径
MC_PATH="/usr/local/minio-binaries/mc"

# MinIO别名名称
MINIO_PROD="minio_old"  # 生产环境别名
MINIO_ARCHIVE="minio_new"  # 归档环境别名

# 归档条件:180天之前的文件
OLDER_THAN="180d0h0m0s"

# 传输限速,避免归档规程中占用IO过多,现场根据情况调整(可选)
# 限制归档过程中客户端下载速度
LIMIT_DOWNLOAD="10M"
# 限制归档过程中客户端上传速度
LIMIT_UPLOAD="10M"

######################################################################
# 以下的脚本不用调整,主要是调整以上变量参数
######################################################################

# 调试信息:显示 mc ls 的原始输出,展示所有桶列表
echo "=== Raw output of 'mc ls $MINIO_PROD' ==="
"$MC_PATH" ls "$MINIO_PROD"
echo "===================================="

# 开始处理
"$MC_PATH" ls "$MINIO_PROD" | while IFS= read -r line; do
    # 打印当前处理的行(调试用)
    echo "Processing line: '$line'"

    # 找到所有以 / 结尾的字符串
    folder=$(echo "$line" | grep -o '[^ ]*/$')

    # 判断是否以 / 结尾(即是否为目录)
    if [[ "$folder" == */ ]]; then
        # 显示每行内容,用于调试脚本是否正确解析了每一行数据。
        echo "Extracted folder: '$folder'"

        # 检查是否为空,-n:判断字符串长度是否大于 0; 转移文件数据
        if [[ -n "$folder" ]]; then
            cmd="$MC_PATH mv --recursive --older-than $OLDER_THAN --limit-download $LIMIT_DOWNLOAD --limit-upload $LIMIT_UPLOAD $MINIO_PROD/${folder} $MINIO_ARCHIVE/${folder}"
            # echo:打印即将执行的命令,便于调试
            echo "Executing: $cmd"
            # eval:执行该命令
            eval "$cmd"

            # 检查执行结果
            if [ $? -eq 0 ]; then
                echo "Successfully archived: ${folder}"
            else
                echo "Failed to archive: ${folder}"
            fi
        else
            echo "Folder name is empty, skipping."
        fi
    else
        echo "Skipping non-directory line."
    fi
done

定时任务执行归档脚本

注:**自动化迁移脚本,先调整好参数后,手动执行一次,若没有报错,则后续可以将脚本添加到服务器定时任务中执行。

定时任务 自动化执行 归档脚本(/usr/local/minio-binaries/transfer-file.sh

# 1、给归档脚本添加可执行的权限
chmod +x /usr/local/minio-binaries/transfer-file.sh
# 2、运行以下命令编辑当前用户的crontab即定时任务,执行后输入 i 开始编辑定时任务
crontab -e
# 3、添加定时任务,在末尾行添加以下定时任务,注以下是 一行,例如:每天凌晨2点30分执行; 最后按 Esc,输入 :wq 回车,保存退出
30 2 * * * /usr/local/minio-binaries/transfer-file.sh  >> /usr/local/minio-binaries/$(date +\%Y\%m\%d)transfer-file.log 2>&1
# 4、查看定时任务是否添加成功
crontab -l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值