运维进阶:SSH+rsync 实现增量同步,高效传输大文件
前言:为什么需要 SSH+rsync?大文件传输的 “效率痛点”
你是否遇到过这些运维场景的困扰?
用 scp 传输 10GB 的日志文件到远程服务器,传了一半网络断了,只能重新从头开始;每天凌晨全量同步 50GB 的备份数据,带宽占满导致业务卡顿,而实际变化的数据只有几 MB;跨服务器同步目录时,目标端多余的文件无法自动清理,手动删除又担心误删重要数据。
传统工具(scp、ftp)的核心问题是 “全量传输”—— 无论文件是否变化,都要完整传输,浪费带宽和时间。而 SSH+rsync 的组合,正好解决这些痛点:
增量同步:仅传输源端与目标端的 “差异数据”(新增、修改的文件 / 内容),大文件更新时仅传变化部分;加密传输:通过 SSH 通道加密数据,避免传输过程中被监听或篡改;功能强大:支持断点续传、文件过滤、目标端冗余文件删除、进度显示等运维必备功能。
本文从 “原理→实战→进阶” 全流程讲解,带你掌握大文件高效传输的核心技巧,适用于备份、跨服同步、大文件更新等场景。
一、核心原理:rsync 增量同步 + SSH 加密传输
在动手前,先明确两者结合的工作逻辑,避免操作时踩坑:
1. rsync 增量同步原理
rsync 并非简单对比文件名,而是通过 “多轮校验机制” 识别差异:
源端将文件分割为固定大小的 “数据块”,计算每个块的校验值(MD5 + 滚动校验);将校验值通过 SSH 传给目标端,目标端对比本地文件的校验值,找出差异数据块;源端仅将 “差异数据块” 通过 SSH 传输到目标端,目标端重组数据块生成完整文件。
优势:即使是 10GB 的大文件,只要修改了 100MB 内容,仅需传输 100MB 数据,带宽占用骤降。
2. SSH 作为传输通道的价值
rsync 本身不提供加密功能,需依赖 SSH 实现 “安全传输”:
所有数据(校验值、差异数据块)经 SSH 256 位加密后传输,避免公网环境下的窃听;无需额外配置 rsync 服务端(如 rsync –daemon),直接用 SSH 登录凭证(密码 / 密钥)即可,降低部署复杂度。
3. 前置条件
源端与目标端均需安装 rsync(多数 Linux 系统默认预装,Windows 需通过 WSL 或 Cygwin 安装);源端需能通过 SSH 登录目标端(已知目标端 IP、SSH 端口、登录用户名、凭证);传输大文件时,确保源端与目标端磁盘空间充足,且网络带宽稳定(推荐千兆网或以上)。
二、实战步骤:SSH+rsync 增量同步的 3 大核心场景
以下场景覆盖运维高频需求,每个案例均提供完整命令、参数解释及效果验证,可直接复制修改使用。
场景 1:本地大文件→远程服务器(最常用)
需求描述
本地服务器(源端)有一个 20GB 的数据库备份文件 backup_20241108.sql(路径:/data/backups/);需增量同步到远程服务器(目标端,IP:47.100.xxx.xxx,SSH 端口:22,用户名:ops)的 /data/remote_backups/ 目录;要求显示同步进度,支持断点续传(网络断后重启能接着传)。
完整命令
|
# 格式:rsync [参数] 本地源文件/目录 远程用户@远程IP:远程目标路径 rsync -avzP –partial –progress /data/backups/backup_20241108.sql ops@47.100.xxx.xxx:/data/remote_backups/ |
关键参数解释
|
参数 |
作用 |
|
-a |
归档模式(核心!包含 -r 递归、-l 保留软链接、-p 保留权限、-t 保留时间戳) |
|
-v |
详细输出模式,显示同步的文件列表和状态 |
|
-z |
传输时压缩数据(大文本文件如日志、SQL 备份可节省 30%-50% 带宽) |
|
-P |
等价于 –partial –progress,同时开启断点续传和进度条 |
|
–partial |
保留部分传输的临时文件(网络断后重启同步,无需从头开始) |
|
–progress |
显示每个文件的同步进度(已传大小 / 总大小、速度、剩余时间) |
执行效果与验证
执行命令后,输入目标端 ops 用户的密码(或用密钥免密登录),终端会显示:
|
sending incremental file list backup_20241108.sql 3,456,789,012 17% 100.5MB/s 01:23:45 ETA |
17% 是当前进度,100.5MB/s 是传输速度,ETA 是预计剩余时间;
若网络中断,重新执行相同命令,rsync 会自动识别临时文件(默认以 .filename.part 命名),从 17% 继续传输;同步完成后,登录远程服务器验证:
|
# 远程服务器执行,检查文件大小和时间戳是否与源端一致 ls -lh /data/remote_backups/backup_20241108.sql md5sum /data/remote_backups/backup_20241108.sql # 与源端 md5sum 结果对比,确认完整性 |
场景 2:远程服务器大文件→本地(数据拉取)
需求描述
远程服务器(源端,IP:47.100.xxx.xxx)有一个 15GB 的日志文件 app.log(路径:/var/log/app/);需将其增量同步到本地服务器(目标端)的 /data/logs/ 目录;目标端 SSH 端口非默认(2222),需指定端口。
完整命令
|
# 格式:rsync [参数] 远程用户@远程IP:远程源文件/目录 本地目标路径 rsync -avzP -e “ssh -p 2222” ops@47.100.xxx.xxx:/var/log/app/app.log /data/logs/ |
关键新增参数
-e “ssh -p 2222″:指定 SSH 传输通道的端口(非默认 22 时必须添加,否则会连接默认 22 端口失败);
若需用密钥登录,可修改为:-e “ssh -p 2222 -i ~/.ssh/ops_key”(~/.ssh/ops_key 是本地私钥路径)。
验证与注意
同步完成后,本地执行 ls -lh /data/logs/app.log 确认文件存在;若远程文件后续有新增内容(如日志追加),再次执行命令,rsync 仅会同步新增的日志内容,无需重新传整个文件。
场景 3:目录双向增量同步(含冗余文件删除)
需求描述
本地 /data/project/ 目录与远程 /data/project/ 目录需保持一致(双向同步);同步时不仅要传输新增 / 修改的文件,还要删除目标端存在但源端没有的 “冗余文件”(如本地删除的旧版本文件,远程也需删除);排除目录中 node_modules/(依赖包,体积大且无需同步)和 .git/(版本控制文件)。
完整命令(本地→远程,含删除冗余)
|
rsync -avzP –delete –exclude=”node_modules/” –exclude=”.git/” /data/project/ ops@47.100.xxx.xxx:/data/project/ |
关键新增参数
|
参数 |
作用 |
|
–delete |
删除目标端 “源端没有的文件 / 目录”(谨慎使用!确保源端是权威数据,避免误删) |
|
–exclude |
排除指定文件 / 目录(支持通配符,如 –exclude=”*.log” 排除所有日志文件) |
双向同步注意事项
若需 “远程→本地” 也删除冗余,执行反向命令:
|
rsync -avzP –delete –exclude=”node_modules/” –exclude=”.git/” ops@47.100.xxx.xxx:/data/project/ /data/project/ |
风险提示:–delete 参数会直接删除目标端文件,建议首次使用时添加 –dry-run 参数 “模拟执行”,确认无误删风险后再去掉:
|
# 模拟同步(仅显示操作,不实际传输/删除) rsync -avzP –delete –exclude=”node_modules/” –dry-run /data/project/ ops@47.100.xxx.xxx:/data/project/ |
三、进阶技巧:优化大文件同步效率与稳定性
技巧 1:断点续传与大文件分片(避免传输中断重来)
rsync 的 –partial 参数已支持断点续传,但对于超大型文件(如 100GB+),可结合 split 分片传输,进一步降低中断风险:
源端分片大文件:
|
# 将 100GB 的 file.iso 分成 10GB/片,前缀为 file.iso.part split -b 10G /data/file.iso /data/file.iso.part -d -a 2 # 生成 file.iso.part00、file.iso.part01、…、file.iso.part09 |
同步分片文件:
|
rsync -avzP /data/file.iso.part* ops@47.100.xxx.xxx:/data/ |
远程端合并分片:
|
# 远程服务器执行,合并分片为原文件 cat /data/file.iso.part* > /data/file.iso # 验证完整性(与源端 md5sum 对比) md5sum /data/file.iso |
技巧 2:定时增量同步(自动化备份)
通过 crontab 配置定时任务,实现每日 / 每周自动增量同步,无需手动执行:
编写同步脚本(/usr/local/bin/rsync_backup.sh):
|
#!/bin/bash # 脚本功能:每日凌晨 2 点,将本地 /data/backup/ 增量同步到远程服务器 SOURCE_DIR=”/data/backup/” REMOTE_USER=”ops” REMOTE_IP=”47.100.xxx.xxx” REMOTE_DIR=”/data/remote_backup/” SSH_PORT=”22″ LOG_FILE=”/var/log/rsync_backup.log” # 记录日志(含时间戳) echo “===== $(date “+%Y-%m-%d %H:%M:%S”) 开始同步 =====” >> $LOG_FILE # 执行同步命令 rsync -avzP -e “ssh -p $SSH_PORT” –delete $SOURCE_DIR $REMOTE_USER@$REMOTE_IP:$REMOTE_DIR >> $LOG_FILE 2>&1 # 记录同步结果 if [ $? -eq 0 ]; then echo “===== $(date “+%Y-%m-%d %H:%M:%S”) 同步成功 =====” >> $LOG_FILE else echo “===== $(date “+%Y-%m-%d %H:%M:%S”) 同步失败 =====” >> $LOG_FILE fi |
赋予脚本执行权限:
|
chmod +x /usr/local/bin/rsync_backup.sh |
配置 crontab 定时任务:
|
# 编辑定时任务 crontab -e # 添加以下内容(每日凌晨 2 点执行) 0 2 * * * /usr/local/bin/rsync_backup.sh # 保存退出,crontab 会自动生效 |
查看同步日志:
|
tail -f /var/log/rsync_backup.log # 实时查看同步过程 grep “同步失败” /var/log/rsync_backup.log # 排查历史失败记录 |
技巧 3:优化传输效率(针对大文件 / 慢网络)
关闭压缩(适合已压缩文件):若传输的是 ZIP、ISO 等已压缩文件,-z 参数会增加 CPU 负担却不节省带宽,可去掉 -z;调整 SSH 加密算法:慢网络环境下,改用轻量加密算法(如 chacha20-poly1305@openssh.com)提升速度,修改同步命令:
|
rsync -avzP -e “ssh -c chacha20-poly1305@openssh.com” /data/file.iso ops@47.100.xxx.xxx:/data/ |
增加 rsync 并发数:通过 –bwlimit 限制带宽(避免占用满带宽影响业务),如限制 100MB/s:
|
rsync -avzP –bwlimit=102400 /data/file.iso ops@47.100.xxx.xxx:/data/ # 102400 KB/s = 100 MB/s |
四、常见问题排查(运维踩坑指南)
1. 同步失败:“Permission denied (publickey,password)”
原因:SSH 登录认证失败(密码错误、密钥权限过宽、非默认端口未指定);解决:
验证 SSH 登录是否正常:ssh -p 22 ops@47.100.xxx.xxx(能登录说明 SSH 没问题);密钥登录时,确保私钥权限为 600(chmod 600 ~/.ssh/ops_key),避免权限过宽被 SSH 拒绝;非默认端口需在 rsync 命令中添加 -e “ssh -p 端口号”。
2. 同步慢:大文件传输速度远低于带宽上限
原因:未开启压缩、SSH 加密算法过重、rsync 校验耗时;解决:
文本类大文件(日志、SQL)添加 -z 参数开启压缩;改用轻量加密算法(如 chacha20-poly1305@openssh.com);超大型文件(100GB+)先分片再同步(参考 “技巧 1”),减少单次校验时间。
3. 目标端文件缺失:同步后部分文件未传输
原因:
源端文件路径末尾漏加 /,导致 rsync 传输 “目录本身” 而非 “目录内文件”;存在权限问题(源端文件无读权限,rsync 无法读取);
解决:
目录同步时,源端路径末尾必须加 /(如 /data/project/,而非 /data/project);检查源端文件权限:ls -l /data/project/missing_file.txt,确保执行 rsync 的用户有读权限(如 chmod +r missing_file.txt)。
4. –delete 参数误删目标端文件
原因:源端目录路径错误(如写成 /data/empty_dir/),导致 rsync 认为目标端所有文件都是冗余;解决:
首次使用 –delete 务必加 –dry-run 模拟执行,确认删除列表无误;同步前备份目标端关键文件:cp -r /data/project /data/project_bak。
五、对比传统工具:SSH+rsync 的核心优势
|
传输工具 |
增量同步 |
加密传输 |
断点续传 |
文件过滤 |
冗余文件删除 |
大文件效率 |
|
SSH+rsync |
✅ |
✅ |
✅ |
✅ |
✅ |
高(仅传差异) |
|
scp |
❌(全量) |
✅ |
❌ |
❌ |
❌ |
低(全量传) |
|
ftp |
❌(全量) |
❌ |
✅ |
❌ |
❌ |
低(无加密) |
|
rcp |
❌(全量) |
❌ |
❌ |
❌ |
❌ |
低(不安全) |
结论:SSH+rsync 是运维场景下 “大文件传输、目录同步、定时备份” 的最优解,兼顾效率、安全与灵活性。
六、总结与最佳实践
1. 适用场景
大文件增量更新(如日志、数据库备份、ISO 镜像);跨服务器目录同步(如开发环境→测试环境代码同步);定时自动化备份(本地→远程、远程→本地)。
2. 最佳实践建议
重要数据先测试:首次同步或使用 –delete 时,务必加 –dry-run 模拟,确认无风险后再执行;日志与监控:定时同步脚本需输出日志,定期检查同步结果,避免失败后未发现;密钥登录优先:禁用 SSH 密码登录,改用 ED25519 密钥,提升安全性并避免手动输密码;大文件分片传输:100GB+ 文件建议分片同步,降低中断重试成本。
通过本文的实战步骤与进阶技巧,你可轻松解决大文件传输效率低、同步繁琐的问题,让 SSH+rsync 成为运维工作中的 “高效工具”。若在操作中遇到其他问题,欢迎在评论区留言讨论!
附:SSH+rsync 常用命令速查表
|
场景 |
完整命令示例 |
|
本地文件→远程(默认 22) |
rsync -avzP /data/file.iso ops@47.100.xxx.xxx:/data/ |
|
远程文件→本地(非 22 端口) |
rsync -avzP -e “ssh -p 2222” ops@47.100.xxx.xxx:/data/file.iso /data/ |
|
目录同步 + 删除冗余 |
rsync -avzP –delete /data/project/ ops@47.100.xxx.xxx:/data/project/ |
|
排除文件 / 目录同步 |
rsync -avzP –exclude=”node_modules/” –exclude=”*.log” /data/project/ ops@47.100.xxx.xxx:/data/project/ |
|
定时同步脚本 |
参考 “技巧 2” 中的 /usr/local/bin/rsync_backup.sh 脚本 |
|
模拟同步(无实际操作) |
rsync -avzP –delete –dry-run /data/project/ ops@47.100.xxx.xxx:/data/project/ |





















暂无评论内容