环境:
服务器:ucloud香港
系统:centos 7
我很多docker项目都是看gugu搭建的,大神推荐我们玩docker项目的时候,把各个项目都放到/root/data/docker_data目录下,这样可方便进行数据备份。
备份策略:
把 A 服务器上的 /root/data/docker_data 目录下的文件每天早上 4 点钟定时备份到 B 服务器的 /root/data/backup_data 文件夹下,
- 备份文件在 B 服务器上最多保存 3 份,并以时间戳命名。
- B 服务器的 IP 地址是:x.x.x.x, ssh 端口是 xxx。
- 备份的日志保存在 A 服务器的 /root/logs 文件夹下,并且日志包含时间信息
- 备份和传输的过程可以显示进度条,并且有提示信息,并且进度条最多显示 100%(安装好 pv,临时备份文件放在 /tmp 目录下,上传完成之后可以删掉)
- 保留文件原有的属性(所有者等信息)
- 恢复备份的时候,只有 /root/data/docker_data 中的内容而不包括 /root/data/... 完整路径
1. 更新升级与安装rsync,pv
cd ~
yum update -y && yum upgrade -y
yum install pv rsync -y # 注意A、B服务器上都装上rsync,pv
2. 创建备份脚本(/root/script/backup.sh)
mkdir script
cd script
vim backup.sh
backup.sh的内容:
#!/bin/bash
# Variables
SOURCE_DIR="/root/data/docker_data/"
DEST_DIR="/root/data/backup_data/"
REMOTE_IP="x.x.x.x" #需修改
SSH_PORT=xxx #需修改
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}
上面代码中的复杂部分会在笔记末尾有解释。
3. 使用 chmod 命令为脚本添加可执行权限:
chmod +x backup.sh
4. A服务器创建好文件夹
cd ~
mkdir logs
5. B服务器创建好文件夹
mkdir -p /root/data/backup_data/
6. 在 A 服务器上安装并配置 SSH 免密登录到 B 服务器(看另一个笔记)
7. 打开服务器 A 上的 cron 配置:
crontab -e
输入:
0 4 * /root/script/backup.sh
notes:
这个备份的tar.gz文件解压缩后就是在解压的目录创建一个docker_data目录。
- 实际测试:
我用该脚本测试了从ucloud香港机备份halo的数据到阿姆斯特丹的机子上,并进行了数据的恢复,重新打开halo博客没问题。备份前先把ucloud的halo容器停掉。
评论区