使用 linux-timemachine 定时增量备份数据

2023/04/23
Tags:  #Linux #实践

这是一份内部文档(去除了敏感信息),发出来分享 linux-timemachine 在特殊场景的使用,在本例,备份的文件夹中不是所有文件都需要备份,且访问需要 root 权限

需要备份的数据

根据 OJ 官方文档:https://opensource.qduoj.com/#/onlinejudge/guide/backup
需要备份 backend/public backend/test_case 两个目录和导出的 OJ 数据库文件

根据我们的实际情况,还需要备份 docker-compose.yml 文件和 dist 目录

建立待备份文件夹

因为 OJ 的数据目录有很多文件不需要备份,所以建立一个待备份文件夹 /srv/containers/OnlineJudgeDeploy/ojbk/ (ojbk 为 OJBackup 的缩写~~)

将需要备份的 backend/public backend/test_case docker-compose.yml dist 软链接到待备份文件夹内

设置 ssh 帐号

备份脚本需要使用 ssh 登陆到 OJ 上执行一些特权命令,因此需要设置 ssh 免密登陆(既公私钥登陆),还需要设置 sudo 免密,目前备份使用的帐号是 username

sudo 免密

运行 sudo visudo 在末尾添加两行

username ALL=(ALL) ALL
username ALL=(ALL) NOPASSWD:ALL

ssh 免密登陆

设置方法不具体说,公私钥和配置都在备份服务器的 /root/.ssh/ 目录下,配置内容如下

Host oj_username
    HostName ip
    User username
    Port port
    IdentityFile ~/.ssh/id_rsa_oj_username

备份脚本

在备份服务器的 /srv/backup/ojbk/ojbk.sh
用到的工具 linux-timemachine
修改脚本时,建议阅读完 README,并对每个参数都理解

脚本内容如下:

#!/bin/bash
# 发生错误立即终止
set -e

# 进入备份目录
cd /srv/backup/ojbk/

# 重定向输出到日志文件
exec >> ./ojbk.log 2>&1
echo `date +%Y-%m-%d-%H:%M:%S`

# 在 OJ 上备份数据库
ssh oj_username "sudo bash -c 'docker exec oj-postgres pg_dumpall -c -U onlinejudge > /srv/containers/OnlineJudgeDeploy/ojbk/db_backup.sql'"

# 增量备份到本地
timemachine oj_username:/srv/containers/OnlineJudgeDeploy/ojbk/ ./ -- --copy-unsafe-links --rsync-path="'sudo rsync'"

# 打包一份到阿里云盘目录
tar -czhf /aliyun_data/OnlineJudge/education/`date +%Y-%m-%d`.tar.gz current
# 清理阿里云盘目录中超过2天未修改的文件,即超过2天的备份
tmpreaper -m 2d /aliyun_data/OnlineJudge/education/

# 清理备份目录中超过10天未更改状态的文件,这可以节省空间,但会导致超过10天的备份可能不完整
tmpreaper -c 10d --protect 'ojbk.sh' ./

定时执行

设定 root 权限的定时任务

sudo crontab -e

添加以下内容,每天 1 点定时执行

0 1 * * * /srv/backup/ojbk/ojbk.sh