基于Rsync的增量备份方案

2024-04-20

1. 介绍

最近因为手残,重置错了服务器,因此意识到数据备份的重要性,因为我的服务都是部署在 Docker 中,只需要同步本地持久化数据即可,因此即使某台服务器到期或者出现某些意外,也能在迅速在另一台服务器迅速恢复。

在众多备份工具中,Rsync 是一种广泛使用的文件同步和备份工具,特别适用于执行增量备份。Rsync 可以高效地将改动的文件部分通过网络同步到远程系统或本地其他位置。它的工作原理基于一种算法,该算法仅传输文件的改动部分,而不是整个文件,这大大提高了备份效率。此外,Rsync 支持数据压缩和加密传输,提供了灵活的文件选择和排除选项,使其成为一种非常灵活且强大的备份工具。

2. 安装

这里假设有两台服务器,分为业务节点 node1 和备份节点 node2 ,其中将 node1 的数据备份到 node2

node2 的 IP 为 1.1.1.1

两台机器均需要安装 Rsync

# Debian/Ubuntu
apt-get install rsync
# CentOS/RHEL 7
yum install rsync
# CentOS/RHEL 8/Fedora
dnf install rsync

3. 配置 SSH 免密连接

node1 服务器上生成 SSH 密钥,如果之前生成过,可以跳过这一步

这里推荐使用 Ed25519 签名算法来生成密钥对

ssh-keygen -t ed25519 -C "your_email@example.com"

运行完成后在 ~/.ssh/ 目录下会生成 id_ed25519id_ed25519.pub 两个文件,查看 id_ed25519.pub 的内容

cat ~/.ssh/ed25519.pub

将该文件的所有内容粘贴到 node2~/.ssh/authorized_keys 文件中,至此即可实现 node1 免密连接到 node2

4. 用法

这里首先测试一下 Rsync 是否能同步成功,在 node1 执行

rsync -av --delete /root/docker root@1.1.1.1:/root/docker --log-file=/root/rsync/$(date +\%Y-\%m-\%d).log

上述命令的参数解释如下

  • -a : 这是「archive」模式,意味着 rsync 会尝试保持原有的文件权限、文件时间戳、软硬链接以及空目录等属性不变,同时实现增量备份。

  • -v: 「verbose」模式,提供详细的输出信息,帮助跟踪命令执行的进度和结果。

  • --delete : 这个参数指示 Rsync 在同步时删除目标目录中存在但源目录中已不存在的文件,确保了目标目录是源目录的精确镜像。

  • /root/docker : 指定 Rsync 同步的源目录路径。

  • root@1.1.1.1:/root/docker : 指定 Rsync 同步的目标路径,用法 目标节点用户名@目标节点IP地址:目标路径

  • --log-file : 指定日志的写入路径,这里是将日志写入 /root/rsync 目录下,文件名使用当天日期命名。

在上述命令测试无误后即可编写 crontab 定时任务了,实现每天定时自动同步,使用 crontab -e 编辑定时任务,将下述 crontab 写入并保存即可。代表每隔 3 小时进行一次同步。

0 */3 * * * rsync -av --delete /root/docker root@1.1.1.1:/root/docker --log-file=/root/rsync/$(date +\%Y-\%m-\%d).log

5. 其他

也可以通过从 node2 拉取 node1 文件实现同步备份,适用于 node2 没有公网 IP 的情况,只需要将步骤 3 中的两节点交换,并且交换命令中的源文件路径和目标路径即可。