svnsync 1.10.2同步大版本失败但1.7.5运行正常问题咨询
故障根因说明
SVN 1.7.x和1.10.x的svnsync在HTTP协议交互逻辑上存在核心差异,是故障的直接诱因:
- 1.7.x版本svnsync默认使用固定Content-Length的HTTP请求提交数据,单次请求最大块大小默认64MB,不启用chunked分块传输,与同版本的mod_dav_svn服务端交互逻辑完全兼容。
- 1.8及以上版本svnsync默认启用chunked分块传输编码,单次提交块大小默认提升到256MB,同时默认开启LZ4压缩协商、HTTP多路复用特性,而1.7.x版本的mod_dav_svn对大尺寸chunked请求的处理存在内存泄漏和超时逻辑bug,长时间接收大分块数据时会主动断开连接,即你观测到的
Connection reset by peer报错。
同数据中心内同步无故障是因为内网延迟极低,大分块请求可以在1.7服务端超时阈值内传输完成,跨地域传输延迟高、传输耗时超过阈值就会触发断连。
排查步骤与日志开启方法
- 先做快速验证:在新主服务器的
~/.subversion/servers配置文件的[global]段添加如下配置,重新测试同步:
[global] # 禁用chunked分块传输,兼容旧版mod_dav_svn http-chunked-requests = no # 禁用1.8+新增的LZ4压缩,仅用旧版兼容的gzip或者关闭压缩 http-compression = gzip # 限制单次请求最大缓冲区大小,和1.7默认值对齐 neon-max-buffer-size = 67108864 # 禁用HTTP多路复用 http-max-connections = 1
如果调整配置后同步恢复正常,即可确认是版本兼容问题。
- 日志开启项:
- 目标镜像节点的Apache日志:将
httpd.conf中的LogLevel调整为debug dav_svn:debug,重启Apache后复现故障,排查日志中是否存在mod_dav_svn: request body too large、input filter failed类报错,默认warn级别不会输出这类兼容性报错。 - svnsync调试日志:执行同步命令时添加
--config-option servers:global:http-debug=1参数,会输出完整HTTP交互日志,可查看断连前请求的块大小、协商参数是否符合预期。 - 网络抓包:在新主服务器执行
tcpdump -i any host [镜像节点IP] and port 80 -w svn_sync.pcap,复现故障后查看pcap文件中的TCP RST包来源,确认是否为镜像节点主动断连。
- 目标镜像节点的Apache日志:将
长期解决方案
- 方案一:所有镜像节点的SVN和mod_dav_svn升级到1.10.x及以上版本,完全兼容新版svnsync的所有特性。
- 方案二:新主服务器单独保留1.7.x版本的svnsync二进制,无需修改其他系统依赖,指定用旧版二进制执行同步任务即可。
内容的提问来源于stack exchange,提问作者RnR
相关产品推荐
相关产品推荐

