windows下SVN双机热备、Subversion的svnsync热备份

一、背景

最近局域网中的本地svn服务老挂,图像想到我们的svn竟然没有做容灾备份,细思极恐,大家脑部一下…
所以决定在阿里云的机器上做个实时备份,现记录一下过程,当然为了安全,我会把里面的IP换一下。

二、备份说明:

  • 机器:
    源机器:192.168.1.110
    目标机器:192.168.1.200,这个机器就是我们要做容灾的机器,就是把110的机器上svn自动同步到200这台机器

  • 软件
    Subversion 要求1.4版本以上,大家注意版本

三、开始部署

(一)备份机上安装与源主机同版本的svn

#使用 svn --version 命令查看版本,这个又一个前提就是,安装好subversion后要配置环境变量
svn --version

image-1667983988974

image-1667984249350

  • 在目标机器(192.168.1.200)上打开cmd查看svn的版本
svn --version

image-1667983988974

(二)创建svn服务,方便以后重启

sc create svnserve binpath= "C:\Program Files (x86)\Subversion\bin\svnserve.exe --service -r e:\svn" depend= Tcpip start= auto   

sc start svnserve   

(三)备份机上创建svn备份版本库并配置

(1)创建版本库

svnadmin create E:\svn\dmj2

(2)修改配置并创建备份账户

  • 编辑备份机中版本库目录中conf目录下的svnserve.conf文件,E:\svn\dmj2\conf\svnserve.conf

image-1667985021204

  • 在文件末尾加上
anon-access = read
auth-access = write
password-db = passwd

image-1667985094564

  • 创建一个备份用户bak,用于备份
    打开conf/passwd,添加bak账户,密码 bakdmjjy1710

image-1667985334412

(四)源主机上创建备份账户

  • 创建的步骤和上面一样,这里就不在重复了,至于说要设置不同的权限也是可以的,比如只给一个读的权限,如果要分别设置的话 就要启用conf/authz的配置了,这里就不展开了

(五)备份机上限制账户提交版本

  • 因为是备份机所以只允许专用的备份账户进行提交操作,在备份版本库中的hooks目录下进行文件操作
  • 进入svn备份版本库中的hooks目录
  • 创建start-commit.bat文件
  • 将下面的脚本添加到start-commit文件中
 
set USER=%2

 
if "%USER%" == "bak" (
exit 0

) 


echo "Only the syncuser user may commit new revisions" >&2
 
exit 1


注意:bak是上一步创建的备份账户,脚本中一定不要出现中文
否则会报错,svnsync: 不能把字符串从本地编码转换为“UTF-8”编码

(六)备份机上创建钩子函数文件

  • 在备份版本库中的hooks目录下创建钩子函数文件:
  • 进入svn备份版本库中的hooks目录
  • 创建pre-revprop-change.bat文件
  • 将下面的脚本添加到pre-revprop-change.bat文件中


set USER=%3

 
if "%USER%" == "bak" (
exit 0

) 


echo "Only the syncuser user may commit new revisions" >&2
 
exit 1


注意:bak是上一步创建的备份账户,脚本中一定不要出现中文
否则会报错,svnsync: 不能把字符串从本地编码转换为“UTF-8”编码

(七)在备份机器上初始化备份仓库,源机器上执行同样的命令也行

  • 在执行初始化命令,命令语法:
svnsync init {备份机上svn的备份库的url} {源主机上需要备份的库的url} --username {备份账户} --password {备份账户密码}
 
svnsync init svn://192.168.1.200/dmj2 svn://192.168.1.110/dmj2 --username bak --password bakdmjjy1710

image-1667986892227

(八)备份机器手动时执行第一次备份,源机器上执行同样的命令也行

命令语法:

svnsync sync 目标url --username 备份账号 --password 备份账号的密码
#这里的目标就是svn://192.168.1.200/dmj2 ,账号 bak 密码 bakdmjjy1710
svnsync sync svn://192.168.1.200/dmj2 --username bak --password bakdmjjy1710

image-1667999903070

(九)实时备份方案

因为数据是从源主机提交同步的,所以需要在源主机上进行配置

到源主机的版本库中的hooks目录下创建post-commit.bat文件并加入以下脚本

image-1668000127904

svnsync sync --non-interactive svn://192.168.1.200/dmj2  --username bak --password bakdmjjy1710

当源主机192.168.1.110提交之后,svn通过post-commit钩子函数将自动同步到备份机器192.168.1.200上。

四、问题

如果再同步的过程出现如下错误:

...........................
已提交版本 9529。
复制版本 9529 的属性。
已提交版本 9530。
复制版本 9530 的属性。
svnsync: 无法读取连接: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,
连接尝试失败。
  • 重复执行同步操作
svnsync sync svn://192.168.1.200/dmj2 --username bak --password bakdmjjy1710
  • 报错:
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
从目标仓库获得锁失败,当前被“server:5e08f12a-5a26-df4a-8ac0-b09bb1cf3dd3”持有
svnsync: Couldn't get lock on destination repos after 10 attempts
  • 这个问题是同步的时候会锁定仓库,正常情况下,同步完成后会释放掉锁,但是因为网络异常中断,会导致锁没有释放,就报上述错误。
  • 解决方法:解锁,执行下面的命令即可,注意这里被锁定的是目标机器,所以解锁目标机器,不要搞错了哦
svn propdel svn:sync-lock --revprop -r 0  svn://192.168.1.200/dmj2

## 执行结果是 : 从仓库版本 %$ld 删除属性“%$s”   说明解锁成功了,再重新执行同步就可以了

五、收工,快去尝试以下吧

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×