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