前言

由于我目前使用的服务器是香港的,服务器上所有的服务全部基于docker部署,docker容器的数据映射在 /root 目录下,每个服务都有对应的目录;现在记录一下我的数据备份方式,目前采用linux的 bash 脚本加上linux自带的 crontab 来进行定时备份数据

开始设置自动备份

首先需要有一台存储备份数据的服务器,A服务器的数据定时备份至B服务器

在A服务器上安装并配置 SSH 免密登录至B服务器

# 安装sshpass
yum -y install sshpass

# 生成ssh密钥(一路回车即可)
ssh-keygen -t rsa -b 4096

# 将公钥复制到B服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 服务器端口 用户名@B服务器IP地址

# 通过ssh连接至B服务器,测试是否需要输入密码(如果可以免密登录,就可以继续配置)
ssh -p SSH端口号 用户名@服务器IP地址

在A服务器上创建 bash 脚本,并在脚本内填写命令

vim backup.sh
#!/bin/bash

# 服务器A上的源目录,填写绝对路径
SRC_DIR="/root"

# 服务器B上的目标目录,填写绝对路径
DST_DIR=""

# 服务器B的IP地址
SERVER_B_IP=""

# 服务器B的SSH用户名
SSH_USER=""

# 服务器B的SSH端口
SSH_PORT=""

# 备份文件前缀,生成的tar.gz的前缀名,例如我的是hongkong_server_docker_data
BACKUP_NAME_PREFIX="hongkong_server_docker_data"

# 压缩文件格式
ARCHIVE_FORMAT="tar.gz"

# 生成备份文件名
current_date=$(date +"%Y%m%d_%H%M%S")
backup_filename="${BACKUP_NAME_PREFIX}_${current_date}.${ARCHIVE_FORMAT}"

# 压缩源目录
tar -czf "${backup_filename}" -C "${SRC_DIR}" .

# 传输备份文件到服务器B
scp -P "${SSH_PORT}" "${backup_filename}" "${SSH_USER}@${SERVER_B_IP}:${DST_DIR}"

# 删除本地备份文件
rm -f "${backup_filename}"

# 保留最多3个备份文件
ssh -p "${SSH_PORT}" "${SSH_USER}@${SERVER_B_IP}" "ls -t ${DST_DIR}/${BACKUP_NAME_PREFIX}* | tail -n +4 | xargs --no-run-if-empty rm -f"

更具实际情况修改脚本后,赋予脚本可执行权限,并执行脚本测试一下

chmod +x backup.sh

./backup.sh

接下来配置cron定时任务,让脚本定时执行

# 打开linux自带的crontab
crontab -e

# 加入一行任务,定时和脚本路径根据实际情况修改,路径填写绝对路径
30 4 * * * /backup.sh

保存并关闭 cron 配置文件,现在每天早上4点30分,脚本会自动执行,将A服务器 /root 下的数据压缩备份至B服务器上了


诗酒趁年华