一、为什么备份与分发必须用 Rsync 替代 SCP?
在跨 Linux 服务器传输大文件、发布软件包或执行灾备归档时,很多工程师习惯直接使用 scp -r:
bash
# 朴素但低效的 SCP 命令
scp -r /opt/app/releases/ deployer@10.0.1.20:/opt/app/releases/SCP 的核心瓶颈:
- 全量重传:哪怕目标机器上已经存在 99% 的相同文件,SCP 依然会把所有文件无脑全部重新上传一遍,网络浪费严重;
- 缺乏断点续传:遇到网络偶发性闪断,传输直接归零,必须从头再来;
- 缺乏智能过滤:无法在命令行中轻松排除
.git、临时缓存或日志目录。
Rsync(Remote Sync) 凭借其专有的滚动校验和(Rolling Checksum)算法,只传输源文件与目标文件之间的差异数据块(Delta),同步速度提升一个数量级。
二、Rsync 核心常用参数与最佳组合
在生产环境的自动化备份或分发脚本中,推荐的标准参数组合为 -avzP:
| 参数 | 全称 | 说明 |
|---|---|---|
-a | archive | 归档模式。递归同步并保留文件的软链接、属主、属组、权限(chmod)及时间戳 |
-v | verbose | 详细输出打印正在传输的文件清单 |
-z | compress | 在网络传输过程中开启压缩,特别适合跨公网或带宽受限的专线网络 |
-P | progress + partial | 组合参数:实时展示传输速度与进度百分比,同时保留部分传输文件支持断点续传 |
bash
# 推荐的标准增量同步命令:
rsync -avzP /opt/data/package/ deployer@10.0.1.20:/opt/data/package/注意末尾斜杠
/的微妙语义:
/opt/data/package/(带斜杠):表示同步该目录下的所有内容到目标路径;/opt/data/package(不带斜杠):表示在目标路径下创建package目录本身。
三、高级生产参数实战
1. 排除无用与临时文件(--exclude)
在同步代码或构建产物时,常常需要剔除巨大的历史日志、压缩包或临时目录:
bash
# 排除单个目录
rsync -avzP --exclude 'logs/' /srv/app/ deployer@10.0.1.20:/srv/app/
# 同时排除多个文件模式
rsync -avzP --exclude '*.log' --exclude '*.tar.gz' --exclude '.git/' /srv/app/ deployer@10.0.1.20:/srv/app/
# 从规则文件中读取排除清单(--exclude-from)
rsync -avzP --exclude-from='.rsyncignore' /srv/app/ deployer@10.0.1.20:/srv/app/2. 构建完全一致的镜像副本(--delete,高危慎用)
默认情况下,如果源端删除了某个文件,Rsync 不会删除目标端的对应文件。加上 --delete 可以实现双端文件的严格镜像一致:
bash
# 强制让目标目录与源目录保持绝对一致(目标端多出的孤立文件会被删除)
rsync -avzP --delete /var/www/html/ deployer@10.0.1.20:/var/www/html/避坑提醒:在自动化脚本中初次使用 --delete 时,建议先加上 -n(即 --dry-run 模拟演练参数)查看将被删除的文件清单,确认无误后再真实执行。
3. 生产网络限速保护(--bwlimit)
白天业务高峰期如果在跨机房或外网大流量同步几百 G 的历史数据,极易将生产上行带宽打满引发线上接口超时:
bash
# 限制最大网络传输速度为 5MB/s(即 5000KB/s)
rsync -avzP --bwlimit=5000 /big_data/backup/ deployer@10.0.1.20:/big_data/backup/4. 指定非标准 SSH 端口(-e)
当目标机器的安全策略修改了默认的 22 端口或使用了特定的私钥文件:
bash
rsync -avzP -e "ssh -p 22222 -i /root/.ssh/id_ed25519" /opt/dist/ deployer@10.0.1.20:/opt/dist/