备份到阿里云OSS

 

提前做好认证,运行ossutil config命令 

image

 

 

1、备份mongo到阿里云oss,备份文件只存3个

vim /home/ecs-user/crontab/mongodb-backup.sh

 

#!/bin/bash

# 配置参数
NAMESPACE="cicd"
POD_NAME="mongodb-community-instance-0"
OSS_BUCKET="lowcoder-stg-mongodb-backup"
MONGODB_USER="admin"
MONGODB_PASSWORD="djkj@2025"

# 备份保留数量
MAX_BACKUPS=3

# 生成备份文件名
BACKUP_NAME="mongodb-backup-$(date +%Y%m%d-%H%M%S)"
LOCAL_BACKUP_DIR="/tmp/mongodb-backup"
mkdir -p $LOCAL_BACKUP_DIR

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 清理本地旧备份
cleanup_local_backups() {
    log "清理本地旧备份,只保留最新 $MAX_BACKUPS 个..."
    
    # 获取本地备份文件列表,按时间倒序排序
    local_files=$(ls -t $LOCAL_BACKUP_DIR/mongodb-backup-*.tar.gz 2>/dev/null || true)
    local_count=$(echo "$local_files" | wc -w)
    
    if [ $local_count -gt $MAX_BACKUPS ]; then
        # 计算需要删除的文件数
        delete_count=$((local_count - MAX_BACKUPS))
        files_to_delete=$(echo "$local_files" | tail -n $delete_count)
        
        for file in $files_to_delete; do
            log "删除本地备份: $(basename $file)"
            rm -f "$file"
        done
    fi
    
    log "本地备份清理完成,当前有 $(ls $LOCAL_BACKUP_DIR/*.tar.gz 2>/dev/null | wc -w || echo 0) 个备份文件"
}

# 清理 OSS 旧备份
cleanup_oss_backups() {
    log "清理 OSS 旧备份,只保留最新 $MAX_BACKUPS 个..."
    
    # 获取 OSS 备份文件列表,按最后修改时间排序
    oss_backup_list=$(ossutil ls oss://$OSS_BUCKET/ | grep "oss://$OSS_BUCKET/mongodb-backup-" | awk '{print $NF}' | sort -r)
    oss_count=$(echo "$oss_backup_list" | grep -v "^$" | wc -l)
    
    if [ $oss_count -gt $MAX_BACKUPS ]; then
        # 计算需要删除的文件数
        delete_count=$((oss_count - MAX_BACKUPS))
        files_to_delete=$(echo "$oss_backup_list" | tail -n $delete_count)
        
        for file in $files_to_delete; do
            log "删除 OSS 备份: $file"
            ossutil rm "$file"
        done
    fi
    
    log "OSS 备份清理完成"
}

log "开始 MongoDB 备份: $BACKUP_NAME"

# 在 MongoDB Pod 中执行完整备份,并获取临时目录名
log "在 Pod $POD_NAME 中执行备份..."

# 生成唯一的临时目录名
TEMP_DIR_NAME="mongobackup_$(date +%s)"
BACKUP_FILE_NAME="${BACKUP_NAME}.tar.gz"

# 在 Pod 中执行备份并压缩
kubectl exec -n $NAMESPACE $POD_NAME -- bash -c "
    # 创建临时目录
    TEMP_DIR=\"/tmp/$TEMP_DIR_NAME\"
    mkdir -p \$TEMP_DIR
    
    echo '开始 MongoDB 备份...'
    
    # 执行 mongodump 带认证
    mongodump --username='$MONGODB_USER' \
              --password='$MONGODB_PASSWORD' \
              --authenticationDatabase=admin \
              --out=\$TEMP_DIR/dump
    
    if [ \$? -eq 0 ]; then
        echo 'MongoDB 备份成功'
        
        # 压缩备份文件
        cd \$TEMP_DIR
        tar -czf dump.tar.gz dump
        
        # 获取文件大小
        FILE_SIZE=\$(du -h dump.tar.gz | cut -f1)
        echo \"备份文件大小: \$FILE_SIZE\"
        
        # 清理原始备份目录
        rm -rf dump
        
        echo '备份文件准备就绪: /tmp/$TEMP_DIR_NAME/dump.tar.gz'
    else
        echo 'MongoDB 备份失败'
        rm -rf \$TEMP_DIR
        exit 1
    fi
"

# 检查上一步是否成功
if [ $? -ne 0 ]; then
    log "MongoDB 备份过程失败"
    exit 1
fi

# 将备份文件从 Pod 复制到本地(使用确切的路径)
log "将备份文件复制到本地..."
kubectl cp $NAMESPACE/$POD_NAME:/tmp/$TEMP_DIR_NAME/dump.tar.gz $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME

if [ $? -eq 0 ]; then
    log "备份文件复制成功"
    
    # 检查本地文件是否存在
    if [ -f "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" ]; then
        LOCAL_FILE_SIZE=$(du -h "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" | cut -f1)
        log "本地备份文件大小: $LOCAL_FILE_SIZE"
        
        # 上传到 OSS
        log "上传到 OSS..."
        ossutil cp "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" "oss://$OSS_BUCKET/$BACKUP_FILE_NAME"
        
        if [ $? -eq 0 ]; then
            log "备份已成功上传到 OSS: oss://$OSS_BUCKET/$BACKUP_FILE_NAME"
            
            # 清理 Pod 中的临时文件
            log "清理 Pod 中的临时文件..."
            kubectl exec -n $NAMESPACE $POD_NAME -- rm -rf "/tmp/$TEMP_DIR_NAME"
            
            # 清理本地旧备份(保留最新3个)
            cleanup_local_backups
            
            # 清理 OSS 旧备份(保留最新3个)
            cleanup_oss_backups
            
            # 显示当前备份状态
            log "===== 当前备份状态 ====="
            log "本地备份文件列表:"
            ls -lh $LOCAL_BACKUP_DIR/*.tar.gz 2>/dev/null || echo "无本地备份"
            
            log "OSS 备份文件列表:"
            ossutil ls oss://$OSS_BUCKET/mongodb-backup-*.tar.gz 2>/dev/null || echo "无 OSS 备份"
            log "========================"
            
        else
            log "OSS 上传失败"
            log "本地备份文件保留在: $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME"
            exit 1
        fi
    else
        log "本地备份文件不存在: $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME"
        exit 1
    fi
else
    log "文件复制失败"
    exit 1
fi

log "备份完成: $BACKUP_NAME"

 

posted @ 2025-12-18 14:21  苦逼yw  阅读(2)  评论(0)    收藏  举报