#!/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" <> "$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" <&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}"