MinIO高可用配置指南.md 12 KB

MinIO 高可用配置指南

📋 MinIO 高可用说明

❌ MinIO 不需要传统的主从配置

重要说明:MinIO 不是传统的主从复制架构,而是采用分布式集群模式。

原因:

  • MinIO 是对象存储服务,不是关系型数据库
  • MinIO 使用纠删码(Erasure Code)技术实现数据冗余
  • MinIO 集群模式中,所有节点都是对等的,没有主从概念
  • MinIO 支持站点复制(Site Replication)用于跨站点数据同步

🎯 双机部署方案选择

针对您的67/68双机部署场景,有两种高可用方案:

方案A:MinIO 集群模式(推荐)⭐

特点:

  • ✅ 高可用:任意节点故障,集群仍可用
  • ✅ 数据一致性:实时同步,无延迟
  • ✅ 性能优秀:分布式读写,负载均衡
  • ✅ 自动故障转移:节点故障自动切换
  • ⚠️ 要求:两台机器网络互通,需要配置 Docker 网络

适用场景:生产环境,对数据一致性要求高


方案B:MinIO 主从同步(简单方案)

特点:

  • ✅ 配置简单:使用 mc mirror 命令同步
  • ✅ 独立部署:两台机器独立运行,互不影响
  • ⚠️ 数据延迟:同步存在延迟(秒级到分钟级)
  • ⚠️ 手动切换:主节点故障需要手动切换
  • ⚠️ 单点风险:主节点故障时,从节点可能数据不完整

适用场景:开发/测试环境,或对实时性要求不高的场景


🚀 方案A:MinIO 集群模式配置(推荐)

前置条件

✅ 网络互通:67和68机器可以互相访问
✅ Docker 网络:需要配置跨主机 Docker 网络
✅ 数据目录:每台机器准备独立的 MinIO 数据目录


配置步骤

第一步:配置 Docker 跨主机网络(可选,推荐使用 host 模式)

方案1:使用 host 网络模式(最简单)

修改 docker-compose-minio-cluster.yml,使用 host 网络:

version: '3.8'

services:
  # MinIO节点1 (机器67)
  minio1:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z
    container_name: minio1
    command: server --address ":9000" --console-address ":9001" http://172.16.0.67:9000/data http://172.16.0.68:9000/data
    environment:
      TZ: Asia/Shanghai
      MINIO_ROOT_USER: ruoyi
      MINIO_ROOT_PASSWORD: ruoyi123
      MINIO_COMPRESS: "off"
    volumes:
      - /docker/minio/data1:/data
    ports:
      - "9000:9000"
      - "9001:9001"
    network_mode: "host"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  # MinIO节点2 (机器68)
  minio2:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z
    container_name: minio2
    command: server --address ":9000" --console-address ":9001" http://172.16.0.67:9000/data http://172.16.0.68:9000/data
    environment:
      TZ: Asia/Shanghai
      MINIO_ROOT_USER: ruoyi
      MINIO_ROOT_PASSWORD: ruoyi123
      MINIO_COMPRESS: "off"
    volumes:
      - /docker/minio/data2:/data
    ports:
      - "9000:9000"
      - "9001:9001"
    network_mode: "host"
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

⚠️ 注意:使用 host 模式时,两台机器不能同时使用相同的端口,需要调整端口映射。

方案2:使用 Docker Bridge 网络(需要配置跨主机网络)

如果使用 Docker Bridge 网络,需要配置 Docker Swarm 或使用第三方网络插件(如 Weave、Calico)。


第二步:在机器67部署 MinIO 节点1

# 1. 创建数据目录
mkdir -p /docker/minio/data1

# 2. 进入配置文件目录
cd /path/to/部署文档/生产环境双机部署方案/配置文件/

# 3. 启动 MinIO 节点1(只启动 minio1 服务)
docker-compose -f docker-compose-minio-cluster.yml up -d minio1

# 4. 检查服务状态
docker ps | grep minio
curl http://127.0.0.1:9000/minio/health/live

第三步:在机器68部署 MinIO 节点2

# 1. 创建数据目录
mkdir -p /docker/minio/data2

# 2. 进入配置文件目录
cd /path/to/部署文档/生产环境双机部署方案/配置文件/

# 3. 启动 MinIO 节点2(只启动 minio2 服务)
docker-compose -f docker-compose-minio-cluster.yml up -d minio2

# 4. 检查服务状态
docker ps | grep minio
curl http://127.0.0.1:9000/minio/health/live

第四步:验证集群状态

# 安装 MinIO 客户端(mc)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 配置集群别名
mc alias set minio-cluster http://172.16.0.67:9000 ruoyi ruoyi123

# 查看集群信息
mc admin info minio-cluster

# 查看集群状态
mc admin heal minio-cluster --dry-run

正常输出应该显示两个节点都正常:

●  minio1:9000
   Uptime: 1h
   Version: RELEASE.2025-04-22T22-12-26Z
   ...

●  minio2:9000
   Uptime: 1h
   Version: RELEASE.2025-04-22T22-12-26Z
   ...

第五步:配置应用连接

修改后端配置,连接到 MinIO 集群:

# application.yml
oss:
  endpoint: http://172.16.0.67:9000  # 可以连接到任意节点
  accessKey: ruoyi
  secretKey: ruoyi123
  bucketName: ruoyi

或者使用 Nginx 负载均衡:

upstream minio_backend {
    server 172.16.0.67:9000 weight=1 max_fails=3 fail_timeout=30s;
    server 172.16.0.68:9000 weight=1 max_fails=3 fail_timeout=30s;
    keepalive 32;
}

server {
    listen 9000;
    server_name minio.example.com;
    
    location / {
        proxy_pass http://minio_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

🔄 方案B:MinIO 主从同步配置(简单方案)

配置步骤

第一步:在机器67部署主 MinIO

# 使用单机模式部署
docker run -d \
  --name minio-master \
  -p 9000:9000 \
  -p 9001:9001 \
  -e TZ=Asia/Shanghai \
  -e MINIO_ROOT_USER=ruoyi \
  -e MINIO_ROOT_PASSWORD=ruoyi123 \
  -e MINIO_COMPRESS=off \
  -v /docker/minio/data:/data \
  minio/minio:RELEASE.2025-04-22T22-12-26Z \
  server --address ":9000" --console-address ":9001" /data

第二步:在机器68部署从 MinIO

# 使用单机模式部署
docker run -d \
  --name minio-slave \
  -p 9000:9000 \
  -p 9001:9001 \
  -e TZ=Asia/Shanghai \
  -e MINIO_ROOT_USER=ruoyi \
  -e MINIO_ROOT_PASSWORD=ruoyi123 \
  -e MINIO_COMPRESS=off \
  -v /docker/minio/data:/data \
  minio/minio:RELEASE.2025-04-22T22-12-26Z \
  server --address ":9000" --console-address ":9001" /data

第三步:配置同步脚本

在机器68上创建同步脚本:

# 创建同步脚本
cat > /opt/minio-sync.sh <<'EOF'
#!/bin/bash

# 安装 MinIO 客户端(如果未安装)
if ! command -v mc &> /dev/null; then
    wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
    chmod +x /usr/local/bin/mc
fi

# 配置别名
mc alias set minio-master http://172.16.0.67:9000 ruoyi ruoyi123
mc alias set minio-slave http://172.16.0.68:9000 ruoyi ruoyi123

# 执行同步(watch 模式:实时监控并同步)
mc mirror --watch --remove minio-master/ruoyi minio-slave/ruoyi
EOF

chmod +x /opt/minio-sync.sh

第四步:配置定时同步(可选,如果不用 watch 模式)

# 创建定时同步脚本(每5分钟同步一次)
cat > /opt/minio-sync-cron.sh <<'EOF'
#!/bin/bash

# 安装 MinIO 客户端(如果未安装)
if ! command -v mc &> /dev/null; then
    wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
    chmod +x /usr/local/bin/mc
fi

# 配置别名
mc alias set minio-master http://172.16.0.67:9000 ruoyi ruoyi123
mc alias set minio-slave http://172.16.0.68:9000 ruoyi ruoyi123

# 执行同步
mc mirror --remove minio-master/ruoyi minio-slave/ruoyi
EOF

chmod +x /opt/minio-sync-cron.sh

# 添加到 crontab(每5分钟同步一次)
(crontab -l 2>/dev/null; echo "*/5 * * * * /opt/minio-sync-cron.sh >> /var/log/minio-sync.log 2>&1") | crontab -

第五步:启动同步服务

# 使用 systemd 管理同步服务
cat > /etc/systemd/system/minio-sync.service <<'EOF'
[Unit]
Description=MinIO Sync Service
After=network.target

[Service]
Type=simple
ExecStart=/opt/minio-sync.sh
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl enable minio-sync
systemctl start minio-sync

# 查看服务状态
systemctl status minio-sync

✅ 配置验证

验证集群模式(方案A)

# 1. 检查集群节点状态
mc admin info minio-cluster

# 2. 测试上传文件
echo "test" > test.txt
mc cp test.txt minio-cluster/ruoyi/

# 3. 检查文件是否在两个节点都存在
mc ls minio-cluster/ruoyi/

# 4. 模拟节点故障(停止一个节点)
docker stop minio1

# 5. 验证集群是否仍可用
mc ls minio-cluster/ruoyi/  # 应该仍然可以访问

验证主从同步(方案B)

# 1. 在主节点上传文件
mc alias set minio-master http://172.16.0.67:9000 ruoyi ruoyi123
echo "test" > test.txt
mc cp test.txt minio-master/ruoyi/

# 2. 等待同步(watch 模式立即同步,定时同步需要等待)
sleep 10

# 3. 检查从节点是否有文件
mc alias set minio-slave http://172.16.0.68:9000 ruoyi ruoyi123
mc ls minio-slave/ruoyi/

# 4. 检查同步日志
tail -f /var/log/minio-sync.log
# 或
journalctl -u minio-sync -f

📊 方案对比

特性 方案A:集群模式 方案B:主从同步
配置复杂度 中等(需要网络配置) 简单(独立部署)
数据一致性 ✅ 实时同步,强一致性 ⚠️ 存在延迟(秒级到分钟级)
高可用性 ✅ 自动故障转移 ⚠️ 需要手动切换
性能 ✅ 分布式读写,负载均衡 ⚠️ 主节点压力大
故障恢复 ✅ 自动恢复 ⚠️ 需要手动干预
适用场景 生产环境 开发/测试环境

🔍 常见问题排查

问题1:集群节点无法互相访问

症状:集群启动后,节点状态异常

解决方法:

# 1. 检查网络连通性
ping 172.16.0.67
ping 172.16.0.68
telnet 172.16.0.67 9000
telnet 172.16.0.68 9000

# 2. 检查防火墙
firewall-cmd --list-all | grep 9000

# 3. 检查 Docker 网络
docker network ls
docker network inspect minio-cluster

问题2:主从同步延迟大

症状:主节点上传文件后,从节点长时间看不到

解决方法:

# 1. 检查同步服务状态
systemctl status minio-sync

# 2. 检查同步日志
journalctl -u minio-sync -n 100

# 3. 手动触发同步
/opt/minio-sync-cron.sh

# 4. 如果使用 watch 模式,检查网络延迟
ping -c 10 172.16.0.67

问题3:集群节点数据不一致

症状:两个节点文件数量不一致

解决方法:

# 1. 检查集群健康状态
mc admin heal minio-cluster --dry-run

# 2. 执行修复
mc admin heal minio-cluster

# 3. 检查节点状态
mc admin info minio-cluster

📚 相关文档


🎯 推荐方案

针对您的双机部署场景,推荐使用:

✅ 方案A:MinIO 集群模式

理由:

  1. 高可用:任意节点故障,集群仍可用
  2. 数据一致性:实时同步,无延迟
  3. 自动故障转移:无需手动干预
  4. 性能优秀:分布式读写,负载均衡

配置要点:

  • 使用 host 网络模式,避免 Docker 网络配置复杂
  • 两台机器使用不同的端口映射(或使用 Nginx 负载均衡)
  • 确保两台机器网络互通,防火墙开放相应端口

📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✅ 适用场景: 67/68双机部署 MinIO 高可用配置