0

这不是一个简短的问题-但请耐心等待:)

早在 2012 年,我就设置了从我们在美国的一个数据中心到世界各地的多个镜像(准确地说是 3 个)的 svn 同步。这些年来它通常没有任何问题(它托管测试数据,目前为 1.2TB @ 修订版 573453)。

最近我需要重建执行同步的主服务器(不接触镜像),这就是问题开始的地方......有时,对于更大的修订,从新主服务器到远程镜像的同步失败 - 我们有 3 个这样的镜像和有时它对所有这些都失败,有时只对一两个失败......它永远不会对同一数据中心内的 3 个其他镜像失败(svn 版本 1.10.3 和 2x 1.7.5(在下面很重要;))) .

当我这样做strace svnsync...时,看起来 svnsync 进程在将某些数据方式读取到“更大/有问题”修订版的同步中时出现“对等方重置连接”错误,然后在关闭 http 连接后退出(它总是继续进行故障发生前的良好状态)。

我在任何日志中都找不到任何明显的东西(并不是说我在这方面太能干了;)——管理这些是第 4 级的副业)。

SVN 在所有系统上都与 apache mod_svn 一起提供服务——无论我使用 http 还是 https 作为源协议,它都会失败——目标都是 http atp。

一旦失败,它会一次又一次地失败(到 1,2 或 3 个镜子),你可以尝试几十次,它或多或少会在同一个地方失败(不完全是,但很接近)但是......

这里是踢球者...

它将始终工作,从执行 nr 1 并且到目前为止没有任何失败,当旧主通过在其上执行完全相同的 svnsync 命令用作中间人时......

旧服务器使用:

bash-4.1$ svnsync --version
svnsync, version 1.7.5 (r1336830)
   compiled May 15 2012, 17:55:12

新服务器有:

bash-4.4$ svnsync --version
svnsync, version 1.10.2 (r1835932)
   compiled Feb 10 2021, 09:25:28 on x86_64-redhat-linux-gnu

使用较旧的 svnsync 进程是否会导致选择不同的协议/模式来在相同的两个存储库之间进行同步,而当使用匹配的 svnsync 同步到“较旧的”存储库时不存在某些问题?

svnsync 1.10.2 SYNC REMOTE FROM 1.10.2 TO 1.7.5 == FAIL (sometimes after a while/longer period of time pushing data)
svnsync 1.7.5 SYNC REMOTE FROM 1.10.2 TO 1.7.5 == SUCCESS (each and every time)

我可以检查哪些日志,我可以启用哪些日志来尝试缩小范围?

附言。由于这是一个“公司”环境,我试图确保没有“奇怪的网络事物”(“透明缓存和加速器等”)被启用/激活,并且网络团队认为他们没有;)

pps。所有这些服务器都是在一个或另一个 vmware 解决方案上运行的虚拟机。

4

1 回答 1

0

我想先给出几个建议:

  1. 您需要检查所有服务器上的 Apache HTTP 服务器日志,并查看同步失败时记录了哪些错误。
  2. 您需要检查 Apache HTTP Server 的 http.conf 和其他相关配置文件。
  3. 您需要考虑将 SVN 和 Apache HTTP 服务器升级到最新版本。SVN 1.7.x 和 1.10.x 已过时且不受支持。
  4. 您需要确定是否有任何防火墙或代理中断svnsync sync操作。防病毒应用程序也可能导致此问题。

我是 VisualSVN 团队的支持工程师,我认为您可以考虑切换到VisualSVN Server和 VDFS。VDFS 提供了SVN 存储库镜像,没有 svnsync 的这些缺点。

现在回答你的问题。

使用较旧的 svnsync 进程是否会导致选择不同的协议/模式来进行相同的两个存储库之间的同步,而当使用匹配的 svnsync 同步到“较旧”存储库时不存在某些问题?

svnsync是一个客户端程序,您现在使用的似乎是一个过时的版本。通常,当您使用不同的 Subversion 客户端和服务器版本时,应该没有问题。但是,现在您正在使用客户端通过 HTTP(S) 连接两台服务器以复制您的存储库,这可能很复杂。如果您有防病毒软件、防火墙或代理 - 所有这些都可能导致您在问题中描述的行为。您的网络问题也可能导致此问题。并且“是”,1.7 和 1.10 客户端在连接到不同版本的 SVN+Apache 服务器时在网络上的行为会有所不同。

我可以检查哪些日志,我可以启用哪些日志来尝试缩小范围?

检查由此产生的错误svnsync并查看 Apache HTTP Server 的日志中的错误。你会看到几个事件。

我认为可以帮助您解决问题的一般性建议。

您通常svnsync sync在复制所涉及的两台服务器之一(源或目标,主或从)上运行。并且本地存储库的 URL 必须使用file://直接本地访问协议。本地 URL 是指file://服务器磁盘上存储库的 URL。

当其中一个 URL 是本地的时,svnsync不需要通过 HTTP(S) 远程联系两台服务器,并且始终直接在磁盘上访问其中一个存储库。

这是来自SVNBook的语法示例:

svnsync synchronize DEST_URL [SOURCE_URL]

目标或源存储库 URL 必须是本地的:

  • 如果您在源服务器上运行此命令,则 SOURCE_URL 必须是本地的:

    svnsync sync "https://svn1.example.com/svn/MyRepo" "file:///C:/Repositories/MyRepo"
    
  • 如果您在目标服务器上运行此命令,则 DEST_URL 必须是本地的:

    svnsync sync "file:///C:/Repositories/MyRepo" "https://svn1.example.com/svn/MyRepo" 
    
于 2021-11-21T22:22:05.977 回答