seaweedfs备份(远程、拷贝文件)(也适用于远程文件拷贝)

343 阅读2分钟

seaweedfs远程备份

拷贝需要的seawedfs的idx文件、dat文件,到当前目录。

支持对多个seaweedfs服务器的存储文件进行拷贝。

记录日志并自动清理日志。

也适用于远程文件拷贝。

seaweedfs备份脚本 seaweedfs_data_backup.sh

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 定义关联数组
declare -A arr1
# 添加对象到数组中
arr1[1]="192.168.1.1 22 root root的密码 /data/seaweedfs_volume 192.168.1.1_1_backup"
arr1[2]="192.168.1.2 22 root root的密码 /data/seaweedfs_volume 192.168.1.2_1_backup"
arr1[3]="192.168.1.3 22 root root的密码 /data/seaweedfs_volume 192.168.1.3_1_backup"
arr1[4]="192.168.1.3 22 root root的密码 /seaweed_data_2 192.168.1.3_2_backup"

# 保留的备份数量
retain_dir_num=10

#备份路径
backup_dir=/data/backup/seaweedfs
#日志文件
log_file="${backup_dir}/seaweedfs_data_backup.log"
# 限制日志文件大小
((max_log_size = 10 * 1024 * 1024))  # 10MB,单位是字节

# 函数来记录日志
log() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") $*" >> "$log_file"
}
log "本次任务开始"

# 函数来保留最新的内容
truncate_log_file() {
    if [ -f "$log_file" ]; then
        log_size=$(wc -c < "$log_file")
        log "日志文件大小是${log_size}"

        if [ "$log_size" -gt "$max_log_size" ]; then
            log "日志文件大于${max_log_size},进行清理"
            # 创建临时文件
            tmp_file=$(mktemp)
            # 复制文件内容到临时文件中,并保持原始编码
            cp --preserve=all "$log_file" "$tmp_file"
            # 截断原始文件
            tail -c "$max_log_size" "$tmp_file" > "$log_file"
            log "日志文件已截断,保留最新的${max_log_size}内容"
        else
            log "日志文件小于${max_log_size},无需处理"
        fi
    fi
}

log "日志文件轮转清理开始,限制${max_log_size}字节"
truncate_log_file
log "日志文件轮转清理结束"


log "备份开始"

# 遍历数组中的每个对象
for key in "${!arr1[@]}"
do
    log "当前处理第: $key 个"
    # 拆分对象中的字符串并打印
    read -r -a arr2 <<< ${arr1[$key]}
    log "从 ${arr2[0]} 服务器的 ${arr2[4]} 目录下,同步文件到本服务器的 ${arr2[5]} 目录"
    log "${arr2[0]} 服务器信息为--> ssh端口: ${arr2[1]}  用户: ${arr2[2]}  密码: ${arr2[3]}"


    # 备份文件的目录,固定目录+年月日时分秒命名的目录
    seaweedfs_backup_base_dir=${backup_dir}/${arr2[5]}
    seaweedfs_backup_detail_dir=`date "+%Y_%m_%d_%H_%M_%S"`
    seaweedfs_backup_dir=${seaweedfs_backup_base_dir}/${seaweedfs_backup_detail_dir}
    log "seaweedfs_backup_dir: ${seaweedfs_backup_dir}"


    # 目录如果不存在就创建
    if [ -e ${seaweedfs_backup_dir} ]
    then
        log "${seaweedfs_backup_dir} 目录存在"
    else
        log "${seaweedfs_backup_dir} 目录不存在,创建之"
        mkdir -p ${seaweedfs_backup_dir}
    fi

    log "开始执行拷贝命令"
    for file_pre in 7 10 11; do
        log "拷贝前缀是$file_pre的文件"
        # 从远程拷贝seaweedfs数据文件到备份文件的目录
        command_str="sshpass -v -p '${arr2[3]}' scp -o StrictHostKeyChecking=no -P ${arr2[1]} ${arr2[2]}@${arr2[0]}:${arr2[4]}/$file_pre* ${seaweedfs_backup_dir}/."
        log "拷贝命令是 ${command_str}"

        eval "$command_str" >> "$log_file" 2>&1
        log "拷贝命令 ${command_str} 已经被执行,具体执行结果,请查看日志"
    done

    file_backup_num=`ls ${seaweedfs_backup_dir}/* | wc -l`
    log "已备份新文件${file_backup_num}个"


    log "删除过期备份开始"
    # 查询当前的所有的目录,按照时间倒序排列
    old_dirs=`ls -lt ${seaweedfs_backup_base_dir} | grep -v total | awk '{print $9}'`
    log "${seaweedfs_backup_base_dir}目录下查询出来的文件夹如下: ${old_dirs}"

    # 默认保留最新的n个备份目录
    num=0
    for one_dir in ${old_dirs}
    do
        ((num++))
        log "循环处理目录 num: ${num} one_dir: ${one_dir}"
        if [ ${num} -le ${retain_dir_num}  ]
        then
           log "目录${one_dir} 符合最新的${retain_dir_num}个范围内,保留"
           continue
        fi
        log "目录${one_dir} 超过最新的${retain_dir_num}个范围内,删除"
        rm_command_str="rm -rf ${seaweedfs_backup_base_dir}/${one_dir}"
        log "删除命令是: $rm_command_str"
        
        # 如果字符串包含 "backup",则执行删除命令,防止误删
        if [[ $rm_command_str == *backup* && $rm_command_str == *${arr2[0]}* ]]; then
            log "执行删除命令: $rm_command_str"
            eval "$rm_command_str" >> "$log_file" 2>&1
            log "删除命令已执行,${seaweedfs_backup_base_dir}/${one_dir}已被删"
        else
            log "字符串不同时包含 backup 和 ${arr2[0]},不执行删除命令"
        fi
         
    done
    log "删除过期备份结束"
    log "${arr2[0]} 处理结束"
    log ""
done

log "本次任务结束"
echo "" >> "$log_file"
echo "" >> "$log_file"
echo "" >> "$log_file"
echo "" >> "$log_file"

crontab任务

crontab -e     
#每日1点、13点执行
0 1,13 * * * sh /data/backup/seaweedfs/seaweedfs_data_backup.sh