268 lines
7.5 KiB
Bash
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}"
|
|
|