2010-09-25

Subversion 镜像写代理的配置注意事项

可以用 Subversion 镜像的方式实现容灾,一般无需配置复杂的写代理(Write-through proxy)
  • 在镜像端提供相同授权的访问
  • 禁止除了同步管理员帐号之外的写权限,通过 ReadonlySvnMirror 设定即可
但是分布式团队,需要同时在一个版本库工作:
  • 为了提高读取速度,通过镜像实现各个异地团队拥有相同的本地读取速度
  • 但只能在一个版本库写,因此只有有一个团队用本地的速度写版本库 实际上因为提交后还要进行异地版本库同步,因此写本地版本库速度也会有延迟。延迟出现在提交后的远程同步。
  • 另外的团队要设置写代理,这样使用读取本地镜像时相同的 URL 实现版本库的写操作
但是版本库写代理的设置还是相当复杂,而且需要管理员大量的手工操作才能完成。注意事项有:

要为 HTTPS 虚拟机打开 SSLProxyEngine

如果要使用 https 协议代理提交,就需要打开 https 协议的 Apache 虚拟主机配置,启用 SSLProxyEngine 设置。
SSLEngine on
SSLProxyEngine on

Subversion写代理的配置不能使用 SVNParentPath

SVNParentPath 是管理员最喜欢用的指令,只要设定为版本库的根,不必在为新建版本库设置 <Location> 配置小节。 但是对于 Subversion 写代理,必须使用 SVNPath 来版本库的实际部署路径,这是因为:
  • 写代理需要配置 SVNMasterURI,但是 SVNMasterURI 只能设置一个 URL
  • 即 SVNMasterURI 要可 SVNPath 配对使用,而不能和 SVNParentPath 一起使用。
  • 因此需要为需要进行写代理的版本库逐一进行设置。
TODO:修改 mod_dav_svn 的代码,使得 SVNMasterURL 可以和 SVNParentPath 一起用,即 SVNMasterURI 是一个指向版本库根的 URL

基于 SVNParentPath 的版本库和单独配置的写代理版本库不能在有重叠的 location 中混搭

考虑是否可以使用如下有重叠的Location中进行混搭,既方便本地主版本库的维护,又方便同样域名和路径前缀的写代理版本库?
<Location /svn/>
  DAV svn
  SVNParentPath /opt/svn/svnroot
  ...
</Location>

<Location /svn/myrepos>
  SVNPath /opt/svn/svnroot/myrepos
  SVNMasterURI https://svn2.sun.moon.ossxp.com/svn/myrepos
  ...
</Location>
不幸的是,上面的配置无法正确运行。虽然 Location 可以重叠,但是重叠的 Location 的配置会传递和覆盖。 上一个的 SVNParentPath 传递的下面不允许配置 SVNParentPath 的写代理的配置中,破坏了写代理的正确运行。反之亦然。

Subversion的镜像版本库要提供两套 URL!

如果镜像版本库只有一个 URL,那么向该 URL 写的时候,代理提交到主版本库。但是主版本库到镜像版本库同步时,又该如何呢? 因此需要提供两个 URL:
  • 一个可以直接写(通过 ReadonlySvnMirror 钩子可以限制只有特定同步管理员可写)
  • 另外一个不能直接写,而是通过代理。即用 SVNMasterURI 指令设置真正要写到的版本库地址

Subversion写代理的 URL 的路径部分必须和主版本库的路径相同!

即如果主版本库的 URL 是 https://svn.moon.ossxp.com/svn/myrepos 。镜像版本库的写代理的 URL 地址的主机名可以不同,但是路径必须相同,例如 https://svn2.sun.ossxp.com/svn/myrepos 。看到了么,一个是月亮 moon,一个是太阳 sun。 对于版本库同步用的 URL 地址则没有限制。
blog comments powered by Disqus