场景与思路
站点备份的常见形态是「主站目录 → 备份机」的增量同步:rsync 只传差异部分,--delete 让备份与源严格一致,--link-dest 用硬链接把每天的快照串起来,未变文件在快照之间共享数据块,所以保留多天版本只多占每天真正变化的空间。成败往往不在 rsync 参数,而在排除列表:日志、缓存、会话文件和临时目录必须排除,否则备份体积和耗时会被业务垃圾拖垮,恢复时也分不清哪些是必要数据。
基本信息
| 场景 | 站点代码与上传目录(如 /www/wwwroot/site)定期增量备份到独立备份机 |
|---|---|
| 核心命令 | rsync -az --delete --exclude=... --bwlimit=... --link-dest=... 源/ 目标/ |
| 传输通道 | 默认走 ssh(需免密密钥);也可用 rsync daemon(873/tcp)由 rsyncd.conf 控制 |
| 权限要点 | 目标端账号要对备份目录有写权限;保留属主需 --rsync-path=sudo rsync 或目标端 root |
| 版本策略 | --link-dest 指向上一份快照做硬链接增量,或用 cp -al 手工生成快照目录 |
典型使用场景
- 每日全量镜像:夜间把站点目录同步到备份机的当日目录,保持一份与线上一致的副本
- 多版本保留:用硬链接快照留下最近 7 天,误删文件可从任意一天取回
- 换机迁移:新服务器从中转备份机 rsync 拉取数据,比从线上直接拉更安全
- 限速备份:备份机与业务共用链路时用 --bwlimit 保护带宽
- 发布前留档:改版前先同步一份快照,出问题可回取旧版本文件
基础增量同步
基础增量同步
rsync -az --delete \
--exclude='logs/' --exclude='cache/' --exclude='runtime/' \
--bwlimit=8000 \
/data/site/ backup@10.0.0.9:/srv/backup/site/
# 先空跑确认删除清单,再实跑
rsync -avn --delete /data/site/ backup@10.0.0.9:/srv/backup/site/ | tail硬链接快照保留多天版本
硬链接快照保留多天版本
# 备份机侧:从昨天快照硬链接出今天目录,再同步
cp -al /srv/backup/site-2026-10-11 /srv/backup/site-2026-10-12
rsync -a --delete --link-dest=/srv/backup/site-2026-10-11 \
/data/site/ /srv/backup/site-2026-10-12/
du -sh /srv/backup/site-2026-10-12 # 只占当日变化量关键选项取舍
| 选项 | 作用 | 什么时候加 |
|---|---|---|
| -a | 归档:递归并保留权限、属主、时间、软链 | 备份基本必备,替代 -rlptgoD 一长串 |
| -z | 传输压缩 | 跨网络加;同机或内网千兆以上传大文件常白耗 CPU |
| --delete | 删除目标端多余文件,使两边严格一致 | 需要镜像时加,务必先 -n 空跑看删除清单 |
| --bwlimit | 限制带宽,单位 KiB/s | 备份机与业务共线时保护在线业务 |
| --link-dest | 未变文件硬链接到指定快照,只复制变化部分 | 需要多版本且省空间的场景,路径必须绝对且同文件系统 |
| --partial | 保留半截文件以便续传 | 大文件跨公网或链路不稳时减少重复传输 |
--delete 是备份脚本里最危险的一项:源目录被误清空或挂载点丢失时,备份会同步清空。上线前必须用 -n 空跑核对删除清单,并保留 --link-dest 历史快照作为退路。
备份账号建议用独立用户的 ssh 密钥并在 authorized_keys 里用 command= 限定只能执行 rsync,比共享 root 密钥安全得多。