侧边栏壁纸
博主头像
伯淳的个人博客博主等级

行动起来,活在当下

  • 累计撰写 35 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

docker数据定期备份

Administrator
2023-12-04 / 0 评论 / 0 点赞 / 67 阅读 / 4530 字

环境:

服务器: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容器停掉。

0

评论区