服务器异地备份如何实现
学完这篇,你能从零搭起一套「本地打包 + 异地增量同步 + 定时执行 + 定期校验」的服务器异地备份链路,并知道哪些参数会让备份悄悄失败。
第一步:明确备份对象和异地落脚点
这一步决定备份什么、放到哪里,做完你手里会有一张备份清单(源路径、目标地址、保留天数)。
异地的最低标准是不同机房或不同城市,同一栋楼里换台机器不算异地。按数据量选目标:
- 几百 GB 以内、想省事:用对象存储。阿里云 OSS 控制台点「Bucket 列表」→「创建 Bucket」,地域选一个与生产机房不同的城市(比如生产在杭州就选北京),读写权限选「私有」,版本控制开启。
- 几个 TB、要保留完整目录结构:用一台异地服务器,装 Ubuntu 22.04,加一块独立数据盘挂到
/backup。
注意:异地备份账号必须和业务账号隔离。给备份专用账号只授「可写、不可删」权限,否则中了勒索病毒连异地副本一起被加密。
第二步:打通本地到异地的免密通道
这一步让本地服务器能免密码写入异地,做完你应该能直接 ssh 或 rclone 推送文件。
本地生成密钥(Ubuntu 22.04 自带 OpenSSH 9.0):
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub -p 2222 backup@10.20.30.40
ssh -p 2222 -i /root/.ssh/backup_key backup@10.20.30.40 "echo ok"
最后一条命令输出 ok 就通了。走对象存储则装 rclone v1.65,执行 rclone config,选 n(新建),类型选 s3,供应商选 Alibaba,填入 AccessKey 和 Secret,最后 rclone lsd oss: 能列出桶名即成功。
注意:
ssh-copy-id默认 22 端口,异地机改过端口必须显式带-p,否则会连到别的服务上去。
第三步:在本地做一致性快照
这一步把「正在变化的数据」变成一份静止副本,做完你会得到一个带日期的备份目录。
MySQL 8.0 用:
mysqldump --single-transaction --master-data=2 -uroot -p'密码' 库名 | gzip > /data/backup/db_$(date +%F).sql.gz
--single-transaction 保证 InnoDB 表导出期间不锁表,数据是一致的。普通文件直接打包:
tar -czf /data/backup/site_$(date +%F).tar.gz /var/www/html
注意:不要直接对正在写入的目录做 tar,会得到半截文件。文件量大的话用 LVM 快照或先停写再打包。
第四步:把快照增量同步到异地
这一步只传变化的块,做完异地就有了当天副本。
rsync -avz --delete --bwlimit=5000 \
-e "ssh -p 2222 -i /root/.ssh/backup_key" \
/data/backup/ backup@10.20.30.40:/backup/web01/
参数含义:-a 保留权限时间、-z 压缩传输、--delete 删除异地已不存在的旧文件、--bwlimit=5000 限速 5MB/s 防止占满带宽。
对象存储方案用:
rclone sync /data/backup oss:my-backup-bucket/web01 --transfers 4 --checkers 8
注意:
--delete和rclone sync都会让异地与本地完全一致,源目录被误清空时异地也会被清空。稳妥做法是异地保留多份日期目录,用rclone copy而不是sync。
第五步:用 cron 定时并设保留策略
这一步让备份自动跑,并自动清理过期文件,做完就不用每天手动执行。
crontab -e
0 3 * * * /opt/backup/backup.sh >> /var/log/backup.log 2>&1
# 每周日删除 30 天前的本地备份
0 4 * * 0 find /data/backup -name "*.gz" -mtime +30 -delete
注意:cron 的环境变量极简,脚本里所有命令写绝对路径(
/usr/bin/rsync),否则手工能跑、定时报 command not found。
第六步:校验与恢复演练
这一步验证备份真的能用,做完你才敢说备份是可靠的。
sha256sum /data/backup/site_2024-06-01.tar.gz
ssh -p 2222 backup@10.20.30.40 "sha256sum /backup/web01/site_2024-06-01.tar.gz"
两边哈希一致即传输无损。每季度做一次恢复演练:
rsync -avz -e "ssh -p 2222" backup@10.20.30.40:/backup/web01/ /data/restore/
tar -xzf /data/restore/site_2024-06-01.tar.gz -C /tmp/test
能解压、能启动服务,才算备份合格。
注意:日志里出现
rsync error: unexplained error (code 255)多半是密钥或端口问题,别只看「脚本没报错」就当成功,要检查退出码。
小结
- 异地=不同机房或城市,备份账号只给写权限,防勒索。
- 顺序是:一致性快照 → rsync/rclone 增量同步 → cron 定时 → 保留策略。
- 关键参数记牢:
--single-transaction保一致、--bwlimit限速、--delete有风险。 - cron 里命令用绝对路径,日志和退出码必须看一眼。
- 备份不验证等于没备份,每季度做一次恢复演练。
原文链接:https://www.gj0.com/thread-780.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。