Subversion管理后台增加对SVN容灾的支持
群英汇Subversion版本控制系统提供的基本服务,实际上已经包含了简单的容灾实现:
- 在本机使用 gistore 进行数据备份
- 在备机上用 git pull 进行每日一次的数据同步
- 两个异地的开发团队,每个团队工作在不同的本地版本库,可能会参考(读取)异地不同版本库的内容
- 异地团队中间通过无线网桥互联,互联网桥的通讯质量易受到环境、气候的影响
- 如果两个异地的SVN服务器能够互做镜像,可以实现双机热备
- 一个团队可以在本地的主版本库中读写,一旦有数据写入本地版本库,就会同步到无线网桥另外一端的版本库。反之亦然。
- 由于本地还提供无线网桥另外一端版本库的镜像,因此访问远程版本库可以改用本地镜像进行访问,实现本地读取速度。 如果需要写入,配置 SVN反向代理,实现透明的远程写入。
为同步用户建立用户帐号,并授权
在使用 svnsync 将本地版本库实时同步到远程版本库时,需要使用具有完全读写权限的帐号来完成对远程版本库的同步。 因此需要事先建立svn同步用户帐号,并在镜像的目标版本库对该帐号进行授权。- 在用户管理平台,创建专门进行 svn 数据同步的用户帐号
- 不要将该用户加入任何用户组,即该用户禁止自行更改口令 因为该用户的口令更改,将破坏已经配置好的数据同步
- 使用SVN管理后台,对该用户授权,使其可以读写整个版本库(镜像的目标版本库)
镜像版本库的配置
为镜像版本库配置 ReadonlySvnMirror 插件,如下:- 本例中,镜像SVN库的服务器地址为: http://svn2.moon.ossxp.com/svn/omed
- 该版本库只需要安装一个插件,即 ReadonlySvnMirror 插件
- 本例中,配置 Svnsync 管理员为 svnmirror 含义为只有用户 svnmirror 可以对该版本库进行提交,其它用户不能在该版本库中提交
源版本库的配置
为源版本库配置 SvnSyncMaster 插件- 本例中,omed的主版本库地址为 http://svn.moon.ossxp.com/svn/omed,该版本库将向 http://svn2.moon.ossxp.com/svn/omed 发起实时的数据同步
- 本例中,发起同步的用户名为 svnmirror,该用户名和在svn2镜像服务器端的 ReadonlySvnMirror 插件配置的 svnsync 管理员用户名保持一致
- 用户口令是在用户管理平台为该用户(svnmirror)设置的口令,尽量选用长的口令
- 在“下游 SVN 镜像 URL”中输入镜像SVN版本库URL地址,每个一行。对于本例,输入地址:
http://svn2.moon.ossxp.com/svn/omed
镜像同步初始化
在SVN主版本库中安装 SvnSyncMaster 插件时,可能会遇到如下错误- 403错误,无权访问版本库:可能是镜像服务器的版本库尚未对同步用户授权
- 403错误,无权访问版本库:可能是镜像服务器的版本库URL输入错误,错误的URL当然是没有授权的了
- 版本库尚未建立:如果镜像的目标版本库尚未建立,则不能在目标版本库记录同步信息也不能建立同步
- 版本库UUID不匹配:镜像初始化,会检查源版本库和目标版本库的UUID是否一致,如果不一致,可能会导致版本库同步的张冠李戴
- 证书不被信任或者证书签名者不被信任:换用 http 协议试试
其它
- 在配置相关插件之前,可以先通过拷贝方式将目标版本库复制到镜像服务器中
- 使用 scp 或者 rsync 的方式将主版本库复制到镜像服务器更直观,速度也更快
- 可以保证主版本库和镜像版本库的UUID保持一致
- 数据库复制完毕后,要修改镜像版本库的目录和文件的属主及权限。应该属于 www-data 用户
- 配置 SvnSyncMaster 插件,会自动根据当前镜像服务器端的版本号确定同步的进度,建立镜像关系
- 注意:不要在同步已经建立后再使用rsync。如果在镜像关系已经建立后,用rsync进行数据同步,会导致:
- 版本库插件配置被覆盖。因为版本库插件的配置位于版本库 conf/hooks.ini 文件中
- 版本库镜像信息被覆盖。因为版本库镜像信息保存在 rev0 的版本属性中