Linux文件同步利器rsync:原理、参数与实战技巧

1. 为什么说rsync是Linux文件同步的终极武器

第一次接触rsync是在2013年负责跨机房数据迁移项目时。当时尝试用scp传输2TB的日志文件,结果网络波动导致传输中断后不得不从头开始,那种绝望感至今记忆犹新。直到运维主管扔给我一句"用rsync -avzP",才真正体会到这个26岁"高龄"的工具为何能经久不衰。

rsync的核心价值在于其差异同步算法。与简单粗暴的文件覆盖不同,它会先对比源文件和目标文件的校验和(默认使用MD5),仅传输发生变化的部分。这意味着:

  • 网络中断后恢复传输时,已同步部分不会重复传输
  • 目录结构差异较大时,能智能识别需要更新的文件
  • 支持压缩传输(-z参数)可节省30%-70%带宽

实测对比:同步包含10万个小文件的目录(总大小45GB)

  • scp耗时:1小时22分钟
  • rsync首次同步:1小时15分钟
  • rsync二次同步(仅1个文件变化):11秒

关键技巧:添加--progress参数可以看到实时传输进度,配合-P参数(等同于--partial --progress)能在中断后保留部分传输的文件。

2. 基础到进阶:必须掌握的12个核心参数

2.1 基础四件套组合

rsync -avz /source/path /destination/path
  • -a:归档模式(相当于-rlptgoD),保留权限、属主、时间戳等元数据
  • -v:显示详细传输信息
  • -z:启用压缩传输
  • -P:显示进度+断点续传

2.2 企业级场景必备参数

rsync -avz --delete --exclude='*.tmp' --max-size=1G \ --bwlimit=50000 /source user@remote:/dest
  • --delete:同步时删除目标端多余文件(危险但必要)
  • --exclude:排除特定模式的文件(支持正则表达式)
  • --max-size:限制同步文件的最大尺寸
  • --bwlimit:限制带宽用量(单位KB/s)

2.3 安全加固方案

rsync -e "ssh -p 2222 -i ~/.ssh/id_rsa" \ --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r \ /secure_data admin@backup-server:/vault
  • -e:指定远程shell(如自定义SSH端口和密钥)
  • --chmod:强制设置目标文件权限

3. 生产环境经典案例解析

3.1 跨机房增量备份MySQL

rsync -avzP --delete \ --exclude='ibdata*' --exclude='ib_logfile*' \ /var/lib/mysql/ backup01:/mysql_backup/$(date +%F)

血泪教训:务必排除InnoDB临时文件,否则可能导致数据库损坏。曾因未加--exclude导致生产事故,恢复耗时6小时。

3.2 实时同步网站静态资源

while inotifywait -r -e modify,create,delete /var/www/html; do rsync -avz --delete /var/www/html/ cdn-edge01:/www done

结合inotify-tools实现事件触发式同步,延迟可控制在秒级。注意:

  1. 高频率同步时要设置--bwlimit避免拥塞
  2. 大量小文件场景建议先打包再同步

3.3 海量小文件同步优化

rsync -avz --no-compress --whole-file \ --numeric-ids --ignore-times /data01/ nas01:/storage
  • --no-compress:小文件压缩反而增加CPU开销
  • --whole-file:禁用delta算法(适用于局域网)
  • --numeric-ids:避免用户组名解析开销

4. 排错指南与性能调优

4.1 传输中断排查流程

  1. 检查网络连通性:ping -c 4 remote_host
  2. 验证SSH连接:ssh -v user@remote_host
  3. 测试rsync基础功能:rsync -avz --list-only /testfile remote:/tmp
  4. 检查磁盘空间:df -h(源端和目标端)
  5. 查看inotify限制:cat /proc/sys/fs/inotify/max_user_watches

4.2 性能瓶颈分析表

现象可能原因解决方案
CPU使用率100%大量小文件压缩开销添加--no-compress参数
传输速度波动大网络QOS限制设置--bwlimit=50000
内存消耗过高超大规模目录同步分批次同步或使用--files-from
同步后权限错误跨系统用户映射问题使用--numeric-ids参数

4.3 终极速度优化方案

rsync -av --no-whole-file --compress-level=0 \ --checksum-choice=xxh3 --temp-dir=/tmp/rsync \ --log-file=/var/log/rsync.log /massive_data backup01:/storage
  • --checksum-choice=xxh3:使用更快的xxHash算法(需rsync 3.2.0+)
  • --temp-dir:指定临时目录避免默认/tmp空间不足
  • --log-file:记录详细日志用于事后分析

5. 高阶技巧与替代方案

5.1 保持目录结构但过滤内容

rsync -av --include='*/' --include='*.jpg' --exclude='*' \ /pictures/ /backup/images

这个魔法组合实现了:

  • 保留所有目录结构(--include='*/'
  • 仅同步jpg文件(--include='*.jpg'
  • 排除其他所有文件(最后的--exclude='*'

5.2 与tar强强联合

tar cf - /data | pv | ssh backup01 "tar xf - -C /backup"

当遇到极端情况(如文件名含特殊字符)时,可先用tar打包再通过管道传输。pv工具能显示实时传输进度。

5.3 分布式同步方案对比

工具适用场景致命缺陷
rsync中小规模差异同步单线程性能瓶颈
lsyncd实时监控触发同步高内存占用
unison双向同步复杂冲突处理
rclone云存储同步本地缓存消耗大

在阿里云某次跨地域迁移中,我们最终采用rsync+inotify的组合方案:

  1. 首次全量同步用rsync
  2. 后续变更通过inotify触发增量同步
  3. 最终校验阶段用rsync -c做校验和比对

这种方案在3PB数据迁移中,将预计的72小时窗口压缩到28小时完成,网络带宽利用率稳定在95%以上。