前言
由于我们之前的docker项目都是存放在/root/data/docker_data的目录下,所以今天目标就是将目录下的docker数据文件定时备份到另一台服务器上,即将A的/root/data/docker_data目录下的文件每天早上4点钟定时备份到B服务器的/root/data/backup_data文件夹下,同时达到以下要求
- 备份文件在B服务器上最多保存3份,并以时间戳命名。
- B服务器的IP地址是:222.157.xxx.xxx, ssh端口是22。(按需修改)
- 备份的日志保存在A服务器的/root/logs文件夹下,并且日志包含时间信息 备份和传输的过程可以显示进度条,并且有提示信息,并且进度条最多显示100%(安装好pv,临时备份文件放在/tmp目录下,上传完成之后可以删掉)
- 保留文件原有的属性(所有者等信息)
- 恢复备份的时候,只有/root/data/docker_data中的内容而不包括/root/data/…完整路径
环境安装
sudo -i
cd ~
apt update -y && apt upgrade -y
apt install pv rsync -y # 注意A、B服务器上都装上rsync
mkdir script
vim backup.sh
编写脚本
#!/bin/bash
# Variables
SOURCE_DIR="/root/data/docker_data/"
DEST_DIR="/root/data/backup_data/"
REMOTE_IP="222.157.xxx.xxx"
SSH_PORT=22
TMP_BACKUP="/tmp/data_backup_$(date +'%Y%m%d%H%M%S').tar.gz"
LOG_FILE="/root/logs/backup_$(date +'%Y%m%d').log"
# Start backup
echo "$(date) - Starting backup..." | tee -a $LOG_FILE
# Create the backup with tar, display progress with pv
tar czfP - $SOURCE_DIR --absolute-names --transform 's|^/root/data/||' | pv -p -t -e -r -s $(du -sb $SOURCE_DIR | awk '{print $1}') > $TMP_BACKUP
# Rsync the backup to the remote server, displaying progress
rsync -avhP --remove-source-files -e "ssh -p $SSH_PORT" $TMP_BACKUP root@$REMOTE_IP:$DEST_DIR | tee -a $LOG_FILE
# Remove backups in B server exceeding 3
ssh -p $SSH_PORT root@$REMOTE_IP "cd $DEST_DIR && (ls -t | head -n 3; ls) | sort | uniq -u | xargs rm -f"
# Cleanup temp file in case rsync failed to remove it
rm -f $TMP_BACKUP
echo "$(date) - Backup completed." | tee -a $LOG_FILE
chmod +x backup.sh
目录创建
A服务器创建日志目录
cd ~
mkdir logs
B服务器创建备份目录
mkdir -p /root/data/backup_data/
免密登录
A、B服务器之间创建免密码登录
# 在A服务器上
sudo -i
ssh-keygen # 一路回车即可
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@222.157.xxx.xxx
开启定时
每天早上4点执行备份:
crontab -e
在crontab文件界面中输入:
0 4 * * * /root/script/backup.sh
修改完后重启定时任务
sudo systemctl restart cron
参考资料
https://iwanlab.com/321-backup/