12 KiB
12 KiB
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
📚 相关文档
- 生产环境双机部署方案.md - 完整部署方案
- MinIO性能优化配置 - MinIO性能优化
- MinIO安全配置 - MinIO安全配置
- 配置文件/docker-compose-minio-cluster.yml - 集群配置文件
🎯 推荐方案
针对您的双机部署场景,推荐使用:
✅ 方案A:MinIO 集群模式
理由:
- 高可用:任意节点故障,集群仍可用
- 数据一致性:实时同步,无延迟
- 自动故障转移:无需手动干预
- 性能优秀:分布式读写,负载均衡
配置要点:
- 使用
host网络模式,避免 Docker 网络配置复杂 - 两台机器使用不同的端口映射(或使用 Nginx 负载均衡)
- 确保两台机器网络互通,防火墙开放相应端口
📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✅ 适用场景: 67/68双机部署 MinIO 高可用配置