Files
hzdyjs/docs/部署文档/生产环境双机部署方案/部署脚本/setup-minio-replication.sh
T
2025-11-27 00:02:01 +08:00

268 lines
7.5 KiB
Bash

#!/bin/bash
# MinIO主从同步配置脚本
# 版本: 1.0
# 描述: 配置68机器从67机器同步MinIO数据(主从复制)
# 使用场景: 67为主节点,68为从节点
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置参数
MASTER_IP="172.16.0.67"
SLAVE_IP="172.16.0.68"
MASTER_PORT="9000"
SLAVE_PORT="9000"
MINIO_USER="minioadmin"
MINIO_PASSWORD="minioadmin@123456"
BUCKET_NAME="ruoyi" # 根据实际情况修改bucket名称
# MinIO客户端安装路径
MC_BINARY="/usr/local/bin/mc"
SYNC_SCRIPT="/opt/minio-sync.sh"
SYNC_SERVICE="/etc/systemd/system/minio-sync.service"
SYNC_LOG="/var/log/minio-sync.log"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}MinIO主从同步配置脚本${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
# 检查是否在68机器上执行
CURRENT_IP=$(hostname -I | awk '{print $1}')
if [[ "$CURRENT_IP" != "$SLAVE_IP" ]]; then
echo -e "${YELLOW}警告: 当前IP ($CURRENT_IP) 不是从节点IP ($SLAVE_IP)${NC}"
echo -e "${YELLOW}此脚本应该在68机器上执行${NC}"
read -p "是否继续? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 第一步:安装MinIO客户端
echo -e "${GREEN}[1/5] 安装MinIO客户端 (mc)...${NC}"
if [ ! -f "$MC_BINARY" ]; then
echo "下载MinIO客户端..."
wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O "$MC_BINARY"
chmod +x "$MC_BINARY"
echo -e "${GREEN}✓ MinIO客户端安装完成${NC}"
else
echo -e "${GREEN}✓ MinIO客户端已存在${NC}"
fi
# 验证mc命令
if ! command -v mc &> /dev/null; then
echo -e "${RED}✗ MinIO客户端安装失败${NC}"
exit 1
fi
# 第二步:测试网络连通性
echo -e "${GREEN}[2/5] 测试网络连通性...${NC}"
if ping -c 1 -W 2 "$MASTER_IP" &> /dev/null; then
echo -e "${GREEN}✓ 主节点 ($MASTER_IP) 网络连通${NC}"
else
echo -e "${RED}✗ 无法连接到主节点 ($MASTER_IP)${NC}"
echo -e "${YELLOW}请检查网络连接和防火墙设置${NC}"
exit 1
fi
# 测试MinIO端口
if timeout 3 bash -c "cat < /dev/null > /dev/tcp/$MASTER_IP/$MASTER_PORT" 2>/dev/null; then
echo -e "${GREEN}✓ 主节点MinIO端口 ($MASTER_PORT) 可访问${NC}"
else
echo -e "${RED}✗ 主节点MinIO端口 ($MASTER_PORT) 不可访问${NC}"
echo -e "${YELLOW}请检查主节点MinIO服务是否启动${NC}"
exit 1
fi
# 第三步:配置MinIO别名
echo -e "${GREEN}[3/5] 配置MinIO别名...${NC}"
# 配置主节点别名
mc alias set minio-master "http://${MASTER_IP}:${MASTER_PORT}" "$MINIO_USER" "$MINIO_PASSWORD" 2>/dev/null || {
echo -e "${YELLOW}主节点别名已存在,跳过${NC}"
}
# 配置从节点别名
mc alias set minio-slave "http://${SLAVE_IP}:${SLAVE_PORT}" "$MINIO_USER" "$MINIO_PASSWORD" 2>/dev/null || {
echo -e "${YELLOW}从节点别名已存在,跳过${NC}"
}
# 测试连接
echo "测试主节点连接..."
if mc ls minio-master &> /dev/null; then
echo -e "${GREEN}✓ 主节点连接成功${NC}"
else
echo -e "${RED}✗ 主节点连接失败,请检查用户名和密码${NC}"
exit 1
fi
echo "测试从节点连接..."
if mc ls minio-slave &> /dev/null; then
echo -e "${GREEN}✓ 从节点连接成功${NC}"
else
echo -e "${RED}✗ 从节点连接失败,请检查用户名和密码${NC}"
exit 1
fi
# 第四步:创建同步脚本
echo -e "${GREEN}[4/5] 创建同步脚本...${NC}"
cat > "$SYNC_SCRIPT" <<EOF
#!/bin/bash
# MinIO主从同步脚本
# 自动从主节点(67)同步数据到从节点(68)
# 日志函数
log() {
echo "[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" >> "$SYNC_LOG"
}
log "开始同步..."
# 检查MinIO客户端
if ! command -v mc &> /dev/null; then
log "错误: MinIO客户端未安装"
exit 1
fi
# 配置别名(如果未配置)
mc alias set minio-master "http://${MASTER_IP}:${MASTER_PORT}" "$MINIO_USER" "$MINIO_PASSWORD" 2>/dev/null
mc alias set minio-slave "http://${SLAVE_IP}:${SLAVE_PORT}" "$MINIO_USER" "$MINIO_PASSWORD" 2>/dev/null
# 检查主节点连接
if ! mc ls minio-master &> /dev/null; then
log "错误: 无法连接到主节点"
exit 1
fi
# 检查从节点连接
if ! mc ls minio-slave &> /dev/null; then
log "错误: 无法连接到从节点"
exit 1
fi
# 获取所有bucket列表
BUCKETS=\$(mc ls minio-master | awk '{print \$5}' | sed 's/\///')
# 同步每个bucket
for BUCKET in \$BUCKETS; do
log "同步bucket: \$BUCKET"
# 执行同步(watch模式:实时监控并同步)
# --remove: 删除目标中不存在于源的文件
# --overwrite: 覆盖已存在的文件
mc mirror --watch --remove --overwrite minio-master/\$BUCKET minio-slave/\$BUCKET 2>&1 | while IFS= read -r line; do
log "\$line"
done
if [ \${PIPESTATUS[0]} -eq 0 ]; then
log "✓ Bucket \$BUCKET 同步成功"
else
log "✗ Bucket \$BUCKET 同步失败"
fi
done
log "同步完成"
EOF
chmod +x "$SYNC_SCRIPT"
echo -e "${GREEN}✓ 同步脚本创建完成: $SYNC_SCRIPT${NC}"
# 第五步:创建systemd服务
echo -e "${GREEN}[5/5] 创建systemd服务...${NC}"
cat > "$SYNC_SERVICE" <<EOF
[Unit]
Description=MinIO Master-Slave Sync Service
Documentation=https://min.io/docs/minio/linux/index.html
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=root
ExecStart=$SYNC_SCRIPT
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=minio-sync
# 资源限制
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
# 重新加载systemd
systemctl daemon-reload
# 启用服务
systemctl enable minio-sync.service
echo -e "${GREEN}✓ systemd服务创建完成${NC}"
# 第六步:执行初始同步
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}配置完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "${YELLOW}接下来需要执行的操作:${NC}"
echo ""
echo "1. 执行初始同步(一次性,同步现有数据):"
echo -e " ${GREEN}mc mirror --remove --overwrite minio-master/ minio-slave/${NC}"
echo ""
echo "2. 启动同步服务(实时监控并同步):"
echo -e " ${GREEN}systemctl start minio-sync${NC}"
echo ""
echo "3. 查看同步服务状态:"
echo -e " ${GREEN}systemctl status minio-sync${NC}"
echo ""
echo "4. 查看同步日志:"
echo -e " ${GREEN}tail -f $SYNC_LOG${NC}"
echo -e " 或: ${GREEN}journalctl -u minio-sync -f${NC}"
echo ""
echo -e "${YELLOW}重要提示:${NC}"
echo "- 同步服务使用 watch 模式,会实时监控主节点变化并同步"
echo "- 初始同步可能需要较长时间,取决于数据量大小"
echo "- 确保主节点和从节点网络稳定"
echo ""
# 询问是否立即执行初始同步
read -p "是否立即执行初始同步? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo ""
echo -e "${GREEN}开始初始同步...${NC}"
echo -e "${YELLOW}这可能需要较长时间,请耐心等待...${NC}"
echo ""
# 执行初始同步
mc mirror --remove --overwrite minio-master/ minio-slave/ 2>&1 | tee -a "$SYNC_LOG"
if [ ${PIPESTATUS[0]} -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ 初始同步完成${NC}"
echo ""
echo "现在可以启动同步服务:"
echo -e "${GREEN}systemctl start minio-sync${NC}"
else
echo ""
echo -e "${RED}✗ 初始同步失败,请检查日志: $SYNC_LOG${NC}"
fi
fi
echo ""
echo -e "${GREEN}配置脚本执行完成!${NC}"