一、为什么服务器数据备份首选 rsync
服务器出故障、误删数据、被勒索加密,很多时候都发生在你毫无防备的时候。备份的方案很多:全量打包、git、云盘同步……但 rsync 凭借"增量化、断点续传、原子性、跨机安全"四大特性,成为服务器数据同步备份的事实标准。它只会传输文件发生变化的块,而非整个文件,首次全量之后每次增量都极快,尤其适合异地机房定时同步。
二、rsync 的三种工作模式
rsync 可以当普通 cp 用,也可以通过 ssh 跨机同步,理解它的定位有助于排错:
1. 本地拷贝: rsync -avh /src/ /dst/ 2. 通过 ssh 拉取远端到本地: rsync -avh [remote-user]@[server-ip]:/path/to/remote /local/dst/ 3. 通过 ssh 推送本地到远端: rsync -avh /local/src [remote-user]@[server-ip]:/path/to/remote/
注意路径结尾的斜杠:/src/ 表示拷贝 src 目录内的内容,/src(无斜杠)表示连 src 目录本身一起拷。这个细节最容易踩坑,务必重视。
三、常用参数详解与组合实战
用下面这组高频参数覆盖日常 90% 的场景:
rsync -avz --delete -e ssh /www/wwwroot /backup/www
-a(archive)归档模式:递归拷贝并保留权限、属主、组、时间戳、软链接等元数据。-v显示详细过程;-z传输前压缩,对文本类数据显著减少带宽。--delete让目标端删除源端不存在的文件,使两边严格一致(适合同步镜像,慎用于主动向目标删除的场景)。-e ssh指定走 ssh 通道加密传输,安全又免配置额外服务。
想预演不影响实际文件,加 --dry-run(-n)即可列出将来会执行的操作。
四、只排除不想要的内容
同步时往往要跳过缓存、日志、临时文件,用 --exclude 精确控制:
rsync -avz --delete \
--exclude='cache/' \
--exclude='*.log' \
--exclude='/tmp' \
/www/wwwroot /backup/www
排除规则较多时建议写进规则文件:--exclude-from=/etc/rsync-exclude.txt,每行一条。注意 --exclude 是按路径匹配的,写清楚相对路径或通配符能避免误排除。
五、通过 ssh 密钥实现免密自动同步
定时备份要求无需人工输入密码,这就要用到前文讲过的 SSH 密钥。在备份机生成密钥并部署公钥到目标服务器后,即可把 rsync 写进 crontab 自动执行:
# 每日凌晨 3 点把 Web 站点目录同步到备份服务器
0 3 * * * /usr/bin/rsync -avz --delete \
-e 'ssh -i /root/.ssh/backup_key -o StrictHostKeyChecking=no' \
/www/wwwroot root@backup-server:/backup/www >> /var/log/rsync-backup.log 2>&1
加 -o StrictHostKeyChecking=no 避免首次连接时的主机指纹确认卡住 crontab。日志重定向到文件,方便日后排查"备份到底跑没跑"。
六、让备份永不丢的增量保留策略
单靠 --delete 的镜像同步,一旦源端误删,备份端也会跟着删。稳妥做法是"滚动快照":按日期保留最近 N 天的独立备份,用硬链接让空间几乎不增加:
#!/bin/bash
DATE=$(date +%Y%m%d)
BASE=/backup/rsync-snapshots
# 以上一次备份为 --link-dest 基础,只复制变动的块,未变的用硬链接
rsync -avz --delete \
--link-dest="$BASE/last" \
/www/wwwroot root@web-server:/ # 伪代码示意,实际从远端拉取走 ssh
# 简化为本地目录:把今天的同步目录与上一次做硬链接叠加
```
rsync -a --delete --link-dest="$BASE/$(date -d yesterday +%Y%m%d)/" \
/www/wwwroot "$BASE/$(date +%Y%m%d)/"
由于未变化的文件以硬链接形式共享同一 inode,几乎不占额外空间,却保留了多天版本,回滚误删只需挑一个旧日期目录。
七、排错与监控
同步出现异常时按次序排查:先用
rsync -avzn 干跑确认行为,再看 ssh 连接是否通(ssh -i key host),最后查目标目录权限和磁盘空间(df -h)。建议给备份脚本加上结果校验:
rsync -avz ... && echo "$(date) OK" >> /var/log/rsync.log || echo "$(date) FAIL" >> /var/log/rsync.log
写在最后
备份从来不是"存了就行",而是"能恢复才算数"。用 rsync 的关键在于:路径斜杠区分、--delete 的取舍、exclude 规则、ssh 免密、滚动快照保留多版本。配合 crontab 定时与日志监控,一套低成本、可靠、可审计的服务器数据备份方案就成型了。别等到数据没了才想起备份,今天动手,明早安心。
