Skip to content

一、为什么备份与分发必须用 Rsync 替代 SCP? ​

在跨 Linux 服务器传输大文件、发布软件包或执行灾备归档时,很多工程师习惯直接使用 scp -r:

bash
# 朴素但低效的 SCP 命令
scp -r /opt/app/releases/ deployer@10.0.1.20:/opt/app/releases/

SCP 的核心瓶颈: ​

  1. 全量重传:哪怕目标机器上已经存在 99% 的相同文件,SCP 依然会把所有文件无脑全部重新上传一遍,网络浪费严重;
  2. 缺乏断点续传:遇到网络偶发性闪断,传输直接归零,必须从头再来;
  3. 缺乏智能过滤:无法在命令行中轻松排除 .git、临时缓存或日志目录。

Rsync(Remote Sync) 凭借其专有的滚动校验和(Rolling Checksum)算法,只传输源文件与目标文件之间的差异数据块(Delta),同步速度提升一个数量级。


二、Rsync 核心常用参数与最佳组合 ​

在生产环境的自动化备份或分发脚本中,推荐的标准参数组合为 -avzP:

参数全称说明
-aarchive归档模式。递归同步并保留文件的软链接、属主、属组、权限(chmod)及时间戳
-vverbose详细输出打印正在传输的文件清单
-zcompress在网络传输过程中开启压缩,特别适合跨公网或带宽受限的专线网络
-Pprogress + 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/

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win