零基础实现服务器异地备份多副本策略
为什么需要异地备份多副本策略
单机备份最怕机房断电或硬盘损坏,一旦主服务器出问题,本地备份也一起丢。服务器异地备份多副本策略指的是将数据同时传输到另一台位于不同地理位置的服务器,并保留多个时间点的历史版本。
这样即使主站被攻击或硬件故障,也能从最近的副本快速恢复。
准备工作:你需要的东西
- 两台 Linux 服务器(假设主服务器 IP 为
192.168.1.100,异地服务器 IP 为192.168.2.200) - SSH 客户端(比如 PuTTY 或 macOS 终端)
- 两台服务器都安装好
rsync和cron(多数系统自带,没有的话用包管理器安装:apt install rsync或yum install rsync) - 异地服务器上预留足够磁盘空间,建议至少是备份源数据的 2~3 倍(因为要存多个副本)
第一步:配置免密码 SSH 登录
要自动执行备份,必须让主服务器能无密码登录到异地服务器。
- 在主服务器上生成密钥对(如果已有则跳过):
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
- 将公钥复制到异地服务器:
ssh-copy-id root@192.168.2.200
输入一次密码后,后续登录就不需要密码了。
测试一下:
ssh root@192.168.2.200 "ls /"
如果能正常列出目录,说明免密配置成功。
第二步:编写 rsync 备份脚本,实现多副本
在异地服务器上创建一个目录结构,比如 /backup/web,用日期命名子目录来保留多个副本。
新建脚本 /root/backup.sh:
#!/bin/bash
# 定义变量
SOURCE="/var/www/html/"
DEST_HOST="root@192.168.2.200"
DEST_BASE="/backup/web"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST="$DEST_BASE/latest"
CURRENT="$DEST_BASE/$DATE"
# 通过 SSH 创建本次备份目录
ssh $DEST_HOST "mkdir -p $CURRENT"\
# 使用 rsync 增量备份,--link-dest 让本次备份中未变化的文件硬链接到最新版本,节省空间
rsync -avz --delete --link-dest=$LATEST $SOURCE $DEST_HOST:$CURRENT/\
# 更新符号链接 'latest' 指向最新备份
ssh $DEST_HOST "ln -snf $CURRENT $LATEST"\
# 保留最近 7 个副本,删除更早的
ssh $DEST_HOST "cd $DEST_BASE && ls -1d 20* | sort -r | tail -n +8 | xargs -I {} rm -rf {}"
脚本说明:
- 每次备份生成一个以时间戳命名的完整备份目录。
- 利用
--link-dest引用上一轮备份的硬链接,未修改的文件不占用额外空间。 - 最后一步清理第 8 天及之前的副本,只保留 7 个。
保存后赋予执行权限:
chmod +x /root/backup.sh
首次执行前,需要先在异地服务器上创建基础的 latest 目录:
ssh root@192.168.2.200 "mkdir -p /backup/web/latest"
然后手动跑一次脚本测试:
/root/backup.sh
如果没报错,登录异地服务器检查 /backup/web/ 下是否出现了以日期命名的目录,并且 latest 符号链接指向它。
第三步:设置定时任务自动执行
在主服务器上编辑 cron 表:
crontab -e
添加一行,每天凌晨 3 点执行备份:
0 3 * * * /root/backup.sh > /var/log/backup.log 2>&1
保存后重启 cron(不同系统命令略有差异):
systemctl restart crond # CentOS/RHEL
systemctl restart cron # Debian/Ubuntu
建议把日志定向到文件,方便排查问题。
避坑指南:新手最容易犯的错误
- 权限问题:rsync 脚本里用
root用户执行,但如果目标目录权限严格,可能导致写入失败。确保异地服务器上/backup目录属主为 root 或给足权限。 - 磁盘空间不足:多副本策略会占用较多空间,务必先
df -h确认剩余空间。如果备份频繁,可以缩短保留天数,例如tail -n +4只留 3 个副本。 - 网络中断:加
--timeout=60参数防止 rsync 卡死。脚本里可以加上重试逻辑。 - 符号链接陷阱:
--delete会删除目标端多余的文件,如果误操作可能导致数据丢失。建议首次用--dry-run试跑。 - 时区不一致:备份目录名依赖服务器时间,如果两台服务器时区不同,时间戳可能混乱。统一设置时区:
timedatectl set-timezone Asia/Shanghai。
效果验证:确保备份真的能恢复
不要等到出事才测试恢复!
建议每月至少手动恢复一次:
- 在异地服务器上选择一个备份目录,比如
/backup/web/20250301_030000。 - 临时在回收站或测试环境执行一次恢复:
rsync -avz root@192.168.2.200:/backup/web/20250301_030000/ /tmp/test_restore/
- 对比原始文件数量与大小,用
diff -r或md5sum校验完整性。 - 检查日志文件
/var/log/backup.log确保每日任务正常执行,如果某天没生成新目录,立即排查网络、磁盘或权限问题。
总结
通过以上步骤,你已经搭建了一套带多副本保留的服务器异地备份多副本策略。
核心思路是利用 rsync 的 --link-dest 实现增量存储,配合 cron 自动化,再用日期目录管理历史版本。
这套方案不需要额外付费工具,适合预算有限但需要可靠备份的场景。
后续可以根据数据量调整保留副本数量、备份频率,或者加入钉钉/邮件通知。