MinIO部署

218 阅读10分钟

准备: 两个 IP 主机安装 Server: 10.10.89.227(master)10.10.89.226(slave)

1 安装 MinIO Server

1.1 下载使用镜像

因为新版本 Server 取消了 UI 页面,所以使用特定版本的镜像 RELEASE.2025-04-22T22-12-26Z-cpuv1

1.2 docker-compose.yml 配置

两个主机都是一样的配置(这个配置是单机,没有 Nginx 配置的配置)

version: "3"
services:
  minio:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z-cpuv1
    container_name: minio
    ports:
      - "9000:9000"
      - "9003:9003"
    environment:
      MINIO_ROOT_USER: user_name
      MINIO_ROOT_PASSWORD: password
      MINIO_SERVER_URL: http://10.10.89.226:9000 # API端口
      MINIO_BROWSER_REDIRECT_URL: http://10.10.89.226:9003 # UI界面
    volumes:
      - /mnt/backup_disk/minio_disk_0:/data
    command: server /data --console-address ":9003"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    restart: unless-stopped
  • MINIO_ROOT_USER: user_name : 配置 ROOT 用户名,替换 user_name

  • MINIO_ROOT_PASSWORD: password :配置 ROOT 密码, 替换 password

  • MINIO_SERVER_URL: API 端口,一定要写外部实际 IP 否则在登录验证时一定会出问题。一定注意是没有 Nginx 配置的,如果有那么要写上 Nginx 对外的地址。参考 Nginx 配置

  • MINIO_BROWSER_REDIRECT_URL: UI 界面外部实际 IP 如果不写肯定会出问题。一定注意是没有 Nginx 配置的,如果有那么要写上 Nginx 对外的地址。参考 Nginx 配置

  • - /mnt/backup_disk/minio_disk_0:/data :挂载到外部的/mnt/backup_disk/minio_disk_0

  • command: server /data --console-address ":9003" : 启动服务并将 UI 对外

    • /data:镜像内部挂在盘符位置

    • --console-address ":9003" : UI 服务内部使用端口,在镜像中- "9003:9003" 对应的内部端口

1.3 启动镜像

两个主机都启动

sudo docker-compose up -d minio
# 查看启动情况:
sudo docker logs minio

2 安装 MinIO Client

两个主机都要安装

2.1 下载安装包

下载路径:dl.minio.org.cn/client/mc/r…

安装在 ubuntu 上找到 deb 文件:mcli_20250430202828.0.0_amd64.deb。一定要与 Server 版本保持一致

2.2 安装

sudo dpkg -i mcli_20250430202828.0.0_amd64.deb

2.3 验证

命令行是 mcli 开头与 windows 的 mc 不同

mcli --help                                                                                                                                                          
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── (q)uit/esc
NAME:                                                                                                                                                                                           
  mcli - MinIO Client for object storage and filesystems.                                                                                                                                       
                                                                                                                                                                                                
USAGE:                                                                                                                                                                                          
  mcli [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]                                                                                                                                      
                                                                                                                                                                                                
COMMANDS:                                                                                                                                                                                       
  alias      manage server credentials in configuration file                                                                                                                                    
  admin      manage MinIO servers                                                                                                                                                               
  anonymous  manage anonymous access to buckets and objects                                                                                                                                     
  batch      manage batch jobs                                                                                                                                                                  
  cp         copy objects                                                                                                                                                                       
  cat        display object contents                                                                                                                                                            
  cors       manage bucket CORS configuration                                                                                                                                                   
  diff       list differences in object name, size, and date between two buckets                                                                                                                
  du         summarize disk usage recursively                                                                                                                                                   
  encrypt    manage bucket encryption config                                                                                                                                                    
  event      manage object notifications                                                                                                                                                        
  find       search for objects                                                                                                                                                                 
  get        get s3 object to local                                                                                                                                                             
  head       display first 'n' lines of an object                                                                                                                                               
  ilm        manage bucket lifecycle                                                                                                                                                            
  idp        manage MinIO IDentity Provider server configuration                                                                                                                                
  license    license related commands                                                                                                                                                           
  legalhold  manage legal hold for object(s)                                                                                                                                                    
  ls         list buckets and objects                                                                                                                                                           
  mb         make a bucket                                                                                                                                                                      
  mv         move objects                                                                                                                                                                       
  mirror     synchronize object(s) to a remote site                                                                                                                                             
  od         measure single stream upload and download                                                                                                                                          
  ping       perform liveness check                                                                                                                                                             
  pipe       stream STDIN to an object                                                                                                                                                          
  put        upload an object to a bucket                                                                                                                                                       
  quota      manage bucket quota                                                                                                                                                                
  rm         remove object(s)                                                                                                                                                                   
  retention  set retention for object(s)                                                                                                                                                        
  rb         remove a bucket                                                                                                                                                                    
  replicate  configure server side bucket replication                                                                                                                                           
  ready      checks if the cluster is ready or not                                                                                                                                              
  sql        run sql queries on objects                                                                                                                                                         
 0%  ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

3 主从配置

参考文章:blog.csdn.net/toyearn/art…

主机是 10.10.89.227,备份机是 10.10.89.226

数据流向: 10.10.89.227 --> 10.10.89.226

因为备份的库是 226 所以这些命令在 226 上执行

3.1 安装后台软件(后台运行可不执行)

# 下载软件
sudo apt install screen 
# 创建后台
screen -S minio-sync 

3.2 实现主从

3.2.1 先去除代理否则无法添加主机

unset http_proxy
unset https_proxy

3.2.2 设置 minio 的 host

mcli config host add minio_master http://10.10.89.227:9000 username 'password'
Added `minio_master` successfully. 
mcli config host add minio_slave http://10.10.89.226:9000 username 'password'
Added `minio_slave` successfully.

如果报错:

mcli:  Unable to initialize new alias from the provided credentials. Get "http://10.10.89.227:9000/probe-bsign-na01603syfeatqgl9w6bj23s3he5wd/?location=": proxyconnect tcp: dial tcp :0:
 connect: connection refused. 

说明代理导致无法添加,执行 3.2.1 的设置

3.2.3 设置同步

# 实时查看
mcli mirror --remove --overwrite --watch minio_master minio_slave
# 后台运行
mkdir minio_logs
nohup mcli mirror --remove --overwrite --watch minio_master minio_slave > /home/nost/minio_logs/mirror.log 2>&1 &

关闭同步

# 查询进程id
ps aux | grep "mcli mirror"                                                                                                                                          
nost      623495  0.1  0.0 1275320 50524 ?       Sl   7月14   6:36 mcli mirror --remove --overwrite --watch minio_master minio_slave                                                            
nost      865468  0.0  0.0  12324  2304 pts/2    S+   09:08   0:00 grep --color=auto mcli mirror                                                                                                
# 结束进程
kill -9 623495     

3.2.4 退出当前后台(后台运行可不执行)

Ctrl + A  后输入 D

3.2.5 进入后台查看信息(后台运行可不执行)

重新连接查看

screen -r minio-sync

4 双主机配置

4.1 双主机信息

两个 IP:192.168.66.170,192.168.66.171

两个挂载文件:/home/zch/data_1, /home/zch/data_2

确保文件夹存在和权限正确:

# 确保数据目录存在且权限正确
sudo mkdir -p /home/zch/minio/data_1 /home/zch/minio/data_2
sudo chown -R 1000:1000 /home/zch/minio/

4.2 docker-compose.yml 配置

4.2.1 227 主机

version: "3.8"
services:
  minio:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z-cpuv1
    container_name: minio-node1
    hostname: minio-node1
    network_mode: host
    environment:
      - MINIO_ROOT_USER=nost
      - MINIO_ROOT_PASSWORD=A!a1A!a1
      - MINIO_SERVER_URL=http://10.10.89.227:9000
      - MINIO_BROWSER_REDIRECT_URL=http://10.10.89.227:9003
    volumes:
      - /mnt/backup_disk/minio_disk_1:/data_1
      - /mnt/backup_disk/minio_disk_2:/data_2
    command: server http://10.10.89.227:9000/data_{1...2} http://10.10.89.226:9000/data_{1...2} --console-address ":9003"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

查看信息

sudo docker logs minio-node1
---------------------------                                                                                                                                                                     
MinIO Object Storage Server                                                                                                                                                                     
Copyright: 2015-2025 MinIO, Inc.                                                                                                                                                                
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html                                                                                                                                
Version: RELEASE.2025-04-22T22-12-26Z (go1.24.2 linux/amd64)                                                                                                                                    
                                                                                                                                                                                                
API: http://10.10.89.227:9000                                                                                                                                                                   
WebUI: http://10.10.89.227:9003                                                                                                                                                                 
                                                                                                                                                                                                
Docs: https://docs.min.io   

4.2.2 226 主机

version: "3.8"
services:
  minio:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z-cpuv1
    container_name: minio-node2
    hostname: minio-node2
    network_mode: host
    environment:
      - MINIO_ROOT_USER=nost
      - MINIO_ROOT_PASSWORD=A!a1A!a1
      - MINIO_SERVER_URL=http://10.10.89.226:9000
      - MINIO_BROWSER_REDIRECT_URL=http://10.10.89.226:9003
    volumes:
      - /mnt/backup_disk/minio_disk_1:/data_1
      - /mnt/backup_disk/minio_disk_2:/data_2
    command: server http://10.10.89.227:9000/data_{1...2} http://10.10.89.226:9000/data_{1...2} --console-address ":9003"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

查看日志

sudo docker logs minio-node2
---------------------------                                                                                                                                                                     
MinIO Object Storage Server                                                                                                                                                                     
Copyright: 2015-2025 MinIO, Inc.                                                                                                                                                                
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html                                                                                                                                
Version: RELEASE.2025-04-22T22-12-26Z (go1.24.2 linux/amd64)                                                                                                                                    
                                                                                                                                                                                                
API: http://10.10.89.226:9000                                                                                                                                                                   
WebUI: http://10.10.89.226:9003                                                                                                                                                                 
                                                                                                                                                                                                
Docs: https://docs.min.io                                                                                                                                                                       
---------------------------  

4.3 配置 Nginx

查看当前端口占用情况

netstat -tuln | grep -E ":(22|80|3000|5244|8801|8818|9000|9001|10050|10051)\b" 

4.3.1 安装 Nginx

在 225 机器上安装

sudo apt update
sudo apt install nginx -y

4.3.2 修改配置文件

sudo vim /etc/nginx/conf.d/minio.conf
# MinIO负载均衡配置
# 文件路径: /etc/nginx/conf.d/minio.conf

# 定义MinIO API服务器组(端口9000)
upstream minio_api {
    # 使用least_conn算法,将请求分发到连接数最少的服务器
    least_conn;
    
    # MinIO节点列表
    server 10.10.89.227:9000 max_fails=3 fail_timeout=30s;
    server 10.10.89.226:9000 max_fails=3 fail_timeout=30s;
    
    # 启用健康检查
    # 如果某个节点连续失败3次,将在30秒内被标记为不可用
}

# 定义MinIO UI服务器组(端口9003)
upstream minio_ui {
    # 使用ip_hash算法,确保同一客户端总是连接到同一个控制台
    ip_hash;
    
    # MinIO控制台节点列表
    server 10.10.89.226:9003 max_fails=3 fail_timeout=30s;
    server 10.10.89.227:9003 max_fails=3 fail_timeout=30s;
}

# API服务器配置(端口8080)
server {
    listen 8801;
    server_name 10.10.89.225;  # 替换为你的实际IP或域名
    
    # 忽略客户端断开连接的错误
    ignore_invalid_headers off;
    
    # 允许任意大小的请求体(MinIO对象可能很大)
    client_max_body_size 0;
    
    # 禁用请求和响应缓冲
    proxy_buffering off;
    proxy_request_buffering off;
    
    # 根路径处理 - 转发到MinIO API
    location / {
        proxy_pass http://minio_ui;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 关键配置:重写重定向地址
        proxy_redirect ~^http://([^/]+):9003(.*)$ http://10.10.89.225:8801\$2;
        proxy_redirect ~^https://([^/]+):9003(.*)$ https://10.10.89.225:8801\$2;
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        
        # 处理大文件上传
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        
        # 启用分块传输编码
        chunked_transfer_encoding off;
    }
    
    # API路径处理(更具体的路径匹配)
    location /ui/ {
        proxy_pass http://minio_ui;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写重定向地址
        proxy_redirect ~^http://([^/]+):9003(.*)$ http://10.10.89.225:8801\$2;
        proxy_redirect ~^https://([^/]+):9003(.*)$ https://10.10.89.225:8801\$2;
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        
        # 处理大文件上传
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        
        # 启用分块传输编码
        chunked_transfer_encoding off;
    }
    
}

# API服务器配置(端口8081)
server {
    listen 8818;
    server_name 10.10.89.225;  # 替换为你的实际IP或域名
    
    # 忽略客户端断开连接的错误
    ignore_invalid_headers off;
    
    # 允许任意大小的请求体
    client_max_body_size 0;
    
    # 禁用请求和响应缓冲
    proxy_buffering off;
    proxy_request_buffering off;
    
    # 根路径处理 - 转发到MinIO API
    location / {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写API重定向
        proxy_redirect ~^http://([^/]+):9000(.*)$ http://10.10.89.225:8818\$2;
        proxy_redirect ~^https://([^/]+):9000(.*)$ https://10.10.89.225:8818\$2;
        
        # WebSocket支持(Console可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    
    # API路径处理(更具体的路径匹配)
    location /api/ {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写API重定向
        proxy_redirect ~^http://([^/]+):9000(.*)$ http://10.10.89.225:8818\$2;
        proxy_redirect ~^https://([^/]+):9000(.*)$ https://10.10.89.225:8818\$2;
        
        # WebSocket支持(Console可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    # 健康检查端点
    location /minio/health/live {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        access_log off;
    }
}

测试配置文件

sudo nginx -t                                                                                                                                                                  ~@zch-virtual-machine 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok                                                                                                                                              
nginx: configuration file /etc/nginx/nginx.conf test is successful 

去掉默认启动文件

# 查看默认配置文件
sudo cat /etc/nginx/sites-available/default

# 查看启用的站点配置
ls -la /etc/nginx/sites-enabled/


# 禁用默认站点
sudo unlink /etc/nginx/sites-enabled/default

# 或者删除软链接
sudo rm /etc/nginx/sites-enabled/default

# 测试配置
sudo nginx -t

# 重启 nginx
sudo systemctl restart nginx

启动 nginx

# 启动Nginx服务
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 重载配置(如果Nginx已经在运行)
sudo systemctl reload nginx

4.3.3 查看 nginx 状态

# 检查Nginx状态
sudo systemctl status nginx

# 检查端口监听
sudo netstat -tlnp | grep -E ':8801|:8818'

4.3.4 校验

# 测试API负载均衡
curl -I http://10.10.89.225:8818/minio/health/live

# 测试UI访问
curl -I http://10.10.89.225:8801/

4.3.4 KeyCloak 中配置修改

因为是两个 ip 去跳转,所以在 client 中增加 IP 配置

image.png

4.3.5 修改两个 minio 的 docker-compose.yml 文件

# 修改前
- MINIO_SERVER_URL=http://10.10.89.227:9000                                                                                                                                               
- MINIO_BROWSER_REDIRECT_URL=http://10.10.89.227:9003   
# 修改后
- MINIO_SERVER_URL=http://10.10.89.225:8818  # 对应Nginx的API地址
- MINIO_BROWSER_REDIRECT_URL=http://10.10.89.225:8801  # 对应Nginx的UI地址
- MINIO_IDENTITY_OPENID_REDIRECT_URI=http://10.10.89.225:8801/oauth_callback # 对应Nginx的UI地址

参数说明:

MINIO_SERVER_URL,MINIO_BROWSER_REDIRECT_URLMINIO_IDENTITY_OPENID_REDIRECT_URI 都应该配置为** UI 的地址**,也就是用户通过浏览器访问 MinIO 控制台时所用的外部地址(如 Nginx 代理地址)。

  • MINIO_SERVER_URL

MinIO 对外服务的主入口地址(外链、API 等)。

  • MINIO_BROWSER_REDIRECT_URL Web 控制台登录后跳转的主页面地址(不要带 /oauth_callback)控制台登录后跳转的外部地址,必须是用户访问 MinIO 控制台的 UI 地址。例如:
http://10.10.89.225:8801
  • MINIO_IDENTITY_OPENID_REDIRECT_URI OIDC 登录回调专用地址(必须带 /oauth_callback),也必须是用户访问 MinIO 控制台的 UI 地址,并带上 /oauth_callback 路径。例如:
http://10.10.89.225:8801/oauth_callback

4.3.6 再修改 Nginx 配置

# MinIO负载均衡配置
# 文件路径: /etc/nginx/conf.d/minio.conf

# 定义MinIO API服务器组(端口9000)
upstream minio_api {
    # 使用least_conn算法,将请求分发到连接数最少的服务器
    least_conn;
    
    # MinIO节点列表
    server 10.10.89.227:9000 max_fails=3 fail_timeout=30s;
    server 10.10.89.226:9000 max_fails=3 fail_timeout=30s;
    
    # 启用健康检查
    # 如果某个节点连续失败3次,将在30秒内被标记为不可用
}

# 定义MinIO UI服务器组(端口9003)
upstream minio_ui {
    # 使用ip_hash算法,确保同一客户端总是连接到同一个控制台
    ip_hash;
    
    # MinIO控制台节点列表
    server 10.10.89.226:9003 max_fails=3 fail_timeout=30s;
    server 10.10.89.227:9003 max_fails=3 fail_timeout=30s;
}

# API服务器配置(端口8080)
server {
    listen 8801;
    server_name 10.10.89.225;  # 替换为你的实际IP或域名
    
    # 忽略客户端断开连接的错误
    ignore_invalid_headers off;
    
    # 允许任意大小的请求体(MinIO对象可能很大)
    client_max_body_size 0;
    
    # 禁用请求和响应缓冲
    proxy_buffering off;
    proxy_request_buffering off;
    
    # 根路径处理 - 转发到MinIO API
    location / {
        proxy_pass http://minio_ui;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 关键配置:重写重定向地址
        proxy_redirect ~^http://([^/]+):9003(.*)$ http://10.10.89.225:8801\$2;
        proxy_redirect ~^https://([^/]+):9003(.*)$ https://10.10.89.225:8801\$2;
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        
        # 处理大文件上传
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        
        # 启用分块传输编码
        chunked_transfer_encoding off;
    }
    
    # API路径处理(更具体的路径匹配)
    location /ui/ {
        proxy_pass http://minio_ui;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写重定向地址
        proxy_redirect ~^http://([^/]+):9003(.*)$ http://10.10.89.225:8801\$2;
        proxy_redirect ~^https://([^/]+):9003(.*)$ https://10.10.89.225:8801\$2;
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        
        # 处理大文件上传
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        
        # 启用分块传输编码
        chunked_transfer_encoding off;
    }
    # 从定向登录
    location /oauth_callback {
        proxy_pass http://minio_ui;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect ~^http://([^/]+):9003(.*)$ http://10.10.89.225:8801$2;
        proxy_redirect ~^https://([^/]+):9003(.*)$ https://10.10.89.225:8801$2;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        chunked_transfer_encoding off;
    }
}

# API服务器配置(端口8081)
server {
    listen 8818;
    server_name 10.10.89.225;  # 替换为你的实际IP或域名
    
    # 忽略客户端断开连接的错误
    ignore_invalid_headers off;
    
    # 允许任意大小的请求体
    client_max_body_size 0;
    
    # 禁用请求和响应缓冲
    proxy_buffering off;
    proxy_request_buffering off;
    
    # 根路径处理 - 转发到MinIO API
    location / {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写API重定向
        proxy_redirect ~^http://([^/]+):9000(.*)$ http://10.10.89.225:8818\$2;
        proxy_redirect ~^https://([^/]+):9000(.*)$ https://10.10.89.225:8818\$2;
        
        # WebSocket支持(Console可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    
    # API路径处理(更具体的路径匹配)
    location /api/ {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 重写API重定向
        proxy_redirect ~^http://([^/]+):9000(.*)$ http://10.10.89.225:8818\$2;
        proxy_redirect ~^https://([^/]+):9000(.*)$ https://10.10.89.225:8818\$2;
        
        # WebSocket支持(Console可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 连接超时设置
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    # 健康检查端点
    location /minio/health/live {
        proxy_pass http://minio_api;
        proxy_set_header Host $http_host;
        access_log off;
    }
}

5 使用和维护

5.1 使用

配置完成后,你可以通过以下方式访问 MinIO:

image-1.png

5.2 负载均衡特性

  • API 服务(8080 端口):使用least_conn算法,请求会被分发到连接数最少的服务器

  • Console 服务(8081 端口):使用ip_hash算法,确保同一客户端总是连接到同一个控制台

  • 健康检查:自动检测节点健康状态,失败的节点会被临时移除

  • 故障转移:当某个节点不可用时,流量会自动转移到其他健康的节点

5.3 监控和日志

# 查看Nginx访问日志
sudo tail -f /var/log/nginx/access.log

# 查看Nginx错误日志
sudo tail -f /var/log/nginx/error.log

# 查看MinIO负载均衡状态
curl -s http://192.168.66.170:8080/minio/health/live

6 扩容方案

6.1 扩充硬盘数量

操作方法:

  • 在每台主机上挂载新的硬盘(如 /home/zch/minio/data_3)。

  • 修改 docker-compose 文件,增加新盘挂载和启动参数:

volumes:
  - /home/zch/minio/data_1:/data_1
  - /home/zch/minio/data_2:/data_2
  - /home/zch/minio/data_3:/data_3
command: server http://192.168.66.171:9000/data_{1...3} http://192.168.66.170:9000/data_{1...3} --console-address ":9001"
  • 停止并重启 MinIO 服务。

注意事项:

  • 新盘必须为空盘。

  • 扩容后,MinIO 会自动重新分布数据,原有数据不会丢失。

  • 扩容期间建议不要进行大规模写入操作。

6.2 增加主机数量

操作方法:

  • 在新主机上部署 MinIO,挂载同样数量的空盘(如 /home/zch/minio/data_1/home/zch/minio/data_2)。

  • 修改所有主机的 docker-compose 文件,启动参数增加第三台主机的盘路径:

command: server http://192.168.66.171:9000/data_{1...2} http://192.168.66.170:9000/data_{1...2} http://192.168.66.172:9000/data_{1...2} --console-address ":9001"
  • 所有主机都要同步修改并重启 MinIO 服务。

注意事项:

  • 新主机的盘必须为空盘。

  • 扩容后,MinIO 会自动分布和冗余数据,原有数据不会丢失。

  • 扩容期间建议不要进行大规模写入操作。

6.3 镜像和资料是否会丢失

  • 不会丢失,只要操作正确(新盘为空盘,所有节点参数一致),MinIO 会自动迁移和冗余数据。

  • 扩容过程建议提前备份重要数据,避免误操作。

6.4 推荐操作流程

  1. 挂载新盘或部署新主机,确保盘为空。

  2. 修改所有主机的 docker-compose 文件,更新 volumes 和 command 参数。

  3. 停止并重启所有 MinIO 服务。

  4. 检查 MinIO 控制台和健康状态,确认节点和盘都已识别。