简单的服务器文件备份方案

我用穷鬼套餐购买了 2C2G 和 2C4G 各一台服务器,加起来一年 300 块,用来搭建测试环境和线上环境。线上环境比较怕误操作,需要有文件定时备份的机制,而我不想在这上面多花一分钱,于是做了个免费的方案。

两台服务器分别为 srv-test 和 srv-prod。在 srv-prod 中使用 rsync 定时将文件同步到 srv-test 上,同步的时间点选在每天我最不可能登录服务器操作的凌晨。同步完成后,在 srv-test 中将其中需要保留历史版本的关键文件打包成一个新版本即可。

以下是具体实现,在 srv-prod 中增加两个脚本和一个定时任务:

/backup/backup.sh
#!/bin/bash

TIME=$(date +%Y-%m-%d-%H-%M-%S)
echo $TIME

# 将指定文件同步到 srv-test
ssh root@srv-test "mkdir -p /backup/srv-prod/sync/xxx"
rsync -az --delete \
--exclude '*.log' \
--exclude '*.log-*' \
/xxx/ \
root@srv-test:/backup/srv-prod/sync/xxx/

# 在 srv-test 中执行打包
ssh root@srv-test 'bash -s' < /backup/remote.sh $TIME
/backup/remote.sh
#!/bin/bash

# 将关键文件打包为新版本
tar -czf /backup/srv-prod/history/$1.tar.gz \
/backup/srv-prod/sync/xxx/xxx/a \
/backup/srv-prod/sync/xxx/xxx/b

# 只留下最新的 30 个版本
ls /backup/srv-prod/history -tr | \
head -n -30 | \
xargs -d '\n' -I {} rm -rf /backup/srv-prod/history/{}
crontab
45 3 * * * /bin/bash /backup/backup.sh >> /backup/backup.log 2>&1

这里为了安全,不允许 srv-test 登录 srv-prod,所以是 srv-prod 单向操作 srv-test。除此之外,备份数据的安全性也需要根据具体情况评估一下,别把秘钥这些敏感数据备份到一个不安全的地方。

这个方案简单有效,其中异地备份提供了可靠性,最新文件同步提供了快速恢复能力,只保留关键文件历史版本节省了存储成本。