运维进阶:SSH+rsync 实现增量同步,高效传输大文件

运维进阶: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/

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容