rsync 同步卡死或断连的排查与解决

作为一名运维工程师,我在日常工作中频繁使用 rsync 进行数据同步。然而,rsync 在传输大文件或网络状况不佳时,经常会遇到同步卡死或意外断连的问题。经过多次实战踩坑,我总结出了一套行之有效的排查和解决方法,今天就来和大家分享。
1. 确认网络连接状态
当 rsync 出现卡死时,首先要检查的是网络连接。我通常会使用 ping 和 traceroute 来测试网络连通性和路由状况:
# 测试目标服务器连通性
ping target-server.com
# 查看路由路径
traceroute target-server.com
如果发现网络延迟过高或存在丢包,就需要联系网络管理员排查网络问题。在实际工作中,我曾经遇到因为跨地域网络抖动导致的 rsync 频繁断连,最终通过优化网络路径解决了问题。
2. 调整 rsync 超时和重试参数
rsync 默认的超时设置可能不适合不稳定的网络环境。我通常会使用以下参数来增强连接的稳定性:
rsync -avz --timeout=30 --partial --progress
--rsh="ssh -o ServerAliveInterval=60"
/local/path/ user@remote-server:/remote/path/
参数说明:
--timeout=30:设置 I/O 超时为 30 秒--partial:保留部分传输的文件--rsh:通过 SSH 连接时设置保活参数
3. 检查磁盘空间和 inode 使用情况
磁盘空间不足或 inode 耗尽也会导致 rsync 卡死。我养成了在同步前检查磁盘使用情况的习惯:
# 检查磁盘空间
df -h
# 检查 inode 使用情况
df -i
有一次,我花了半天时间排查网络问题,最后发现竟然是目标磁盘 inode 用尽了。这个教训让我明白了全面排查的重要性。
4. 使用 rsync 的日志和调试功能
当问题难以定位时,启用 rsync 的详细日志和调试输出是很有帮助的:
# 启用详细输出
rsync -avvv --progress /source/ user@remote:/destination/
# 输出日志到文件
rsync -av --log-file=/var/log/rsync.log /source/ user@remote:/destination/
通过分析日志,我多次发现是因为特定文件权限问题或文件名编码异常导致的同步中断。
5. 分批同步大文件
对于超大文件的同步,我建议采用分批同步的策略:
# 使用 --max-size 限制单文件大小
rsync -av --max-size=100M /source/ user@remote:/destination/
# 或者使用 find 配合 rsync 分批处理
find /source/ -type f -size +1G -exec rsync -av {} user@remote:/destination/ ;
6. 使用 screen 或 tmux 保持会话
为了防止因 SSH 会话超时而导致的同步中断,我总是在 screen 或 tmux 中执行长时间的 rsync 任务:
# 使用 screen
screen -S rsync-session
rsync -av /source/ user@remote:/destination/
# 按 Ctrl+A D 分离会话,需要时用 screen -r rsync-session 重新连接
实战经验总结
经过多次实战,我发现 rsync 同步问题的解决需要系统性的排查思路:从网络到磁盘,从参数配置到会话管理。最重要的是,要善用日志和调试工具,这样才能快速定位问题根源。
记得有一次,我在同步一个包含数百万小文件的目录时,rsync 频繁卡死。最终通过调整 --inplace 参数和优化文件系统缓存设置解决了问题。这种实战经验是文档上看不到的,希望大家能从我的踩坑经历中受益。


终于找到卡死原因了!上次同步大文件直接挂了一晚上 😩