前言

由于我们之前的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/