服务器异地多副本自动备份:零基础rsync教程
服务器数据丢失是运维中最不想遇到的事,而异地多副本自动备份就是最有效的防线之一。
本文手把手教你在两台或多台 Linux 服务器之间,用 rsync 和 cron 实现每天自动同步,并保留多个历史版本(副本),即使本地硬盘损坏或误删,也能快速恢复。
前置条件:你需要哪些东西
- 至少两台 Linux 服务器(服务器 A 作为数据源,服务器 B、C 等作为异地备份机),建议公网 IP 互通或内网互通。
- 每台服务器都有 root 或 sudo 权限。
- 知道要备份的目录路径(比如
/var/www/html或/data)。 - 备份机有足够的磁盘空间。
如果条件有限,可以用一台云服务器 + 一台本地树莓派或 NAS 模拟异地环境。
步骤详解:配置 SSH 免密登录
rsync 通过 SSH 传输,为了避免每次输入密码,需配置免密登录(从源服务器登录到备份服务器)。
- 在源服务器上执行
ssh-keygen -t rsa -b 4096,一路回车生成密钥(已有密钥可跳过)。 - 将公钥复制到备份服务器:
ssh-copy-id root@备份服务器IP。输入一次备份机密码。 - 测试:
ssh root@备份服务器IP无需密码即可登录。
如果使用非 root 用户,确保该用户对备份目录有写权限。
步骤详解:编写 rsync 备份脚本(含多副本)
为了实现多副本(按日期保留多份),我们不用覆盖式同步,而是每次将源目录完整同步到一个以日期命名的子目录下。
在源服务器上创建脚本 /root/backup.sh:
#!/bin/bash
# 定义变量
SRC="/var/www/html/" # 源目录,末尾斜杠很重要
DEST_BASE="/backups/web/" # 备份机上的基础备份目录
DATE=$(date +%Y-%m-%d_%H%M%S) # 精确到分钟,避免重名
BACKUP_HOST="root@备份服务器IP"
# 创建本次备份目录(在备份机上)
ssh $BACKUP_HOST "mkdir -p ${DEST_BASE}${DATE}"
# 执行同步
rsync -avz --delete $SRC ${BACKUP_HOST}:${DEST_BASE}${DATE}/
# 保留最近 30 天副本,删除更旧的目录
ssh $BACKUP_HOST "find ${DEST_BASE} -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;"
关键点解释:
--delete:删除源中已不存在的文件,保持和目标一致。-avz:归档模式 + 压缩传输。- 最后一行用
find删除 30 天前的目录,自动管理磁盘空间。
要将数据同时备份到第二个异地服务器,只需在尾部增加一段类似的命令,修改 BACKUP_HOST 和备份目录即可。
赋予执行权限:chmod +x /root/backup.sh
步骤详解:配置定时任务实现自动备份
使用 cron 定时执行脚本。
执行 crontab -e,添加一行:
0 2 * * * /root/backup.sh > /dev/null 2>&1
含义:每天凌晨 2 点执行一次。
日志直接丢弃(如果担心出错,可以写文件如 /var/log/backup.log)。
重启 cron:systemctl reload cron 或 service cron restart。
如果也想备份到不同时间点(如每天两次),可多添加行,但要确保脚本中日期时间精确到小时、分钟,避免同名覆盖。
避坑提醒与验证方法
常见踩坑点
- 磁盘占满:多副本会占用大量空间,务必设置保留天数(本例 30 天),并监控磁盘使用率。
- SSH 连接断掉:如果备份机公网 IP 不稳定,脚本可能卡住。建议在 rsync 命令后加上
--timeout=60限制超时。 - 权限不足:备份目录的所有者必须与 SSH 用户一致。
- 软链接或特殊文件:rsync 默认保留软链接,如需特殊处理可加
-H用于硬链接。
手动验证
- 执行
bash /root/backup.sh,观察输出有无报错。 - SSH 到备份机,查看目录结构:
ls -l /backups/web/应出现类似2025-03-01_020000的文件夹。 - 检查文件完整性:
diff -r /var/www/html /backups/web/2025-03-01_020000/应无差异。 - 确认 cron 已生效:
crontab -l查看是否包含该任务。
常见问题解答
Q:为什么我同步后备份机目录为空?
A:检查源路径末尾是否加 /,以及 SSH 免密是否成功。可以先用 rsync -avz --dry-run 测试看输出。
Q:能否备份到 Windows 或云存储?
A:本文方案针对 Linux 对 Linux。如需备份到对象存储(OSS、S3),推荐 rclone,但多副本管理逻辑类似。
Q:脚本中 find -delete 直接删除会不会误删?
A:-mtime +30 只匹配 30 天前修改的目录,且不递归删除子文件,较安全。建议首次手工留一份快照。
如果你正在处理服务器异地多副本自动备份,建议先按本文步骤完整执行,再根据自己的环境微调路径、保留天数和目标IP;
遇到异常时优先回看避坑和高频问题部分,基本能快速排错。