使用SVNSYNC实现多个SVN服务器之间的数据镜像同步复制

1. 源库准备(mastersvn)

 

1)新建一个普通用户,对整个库有读权限即可,用于连接源库读取数据

 

# vi /svndata/conf/passwd

 

test = 123

 

# vi /svndata/conf/authz

 

[mastersvn:/]

test = r

* =

 

2)使用一个有正常权限的用户连到源库上,测试更新/增加/提交操作可正常执行

 

 

2. 目标库(镜像只读库)准备(slavesvn)

 

1)新建一个空的目标库,并按需配置服务器配置文件:

 

# svnadmin create /svndata/slavesvn

 

# vi /svndata/slavesvn/conf/svnserve.conf

 

[general]

anon-access = none

auth-access = write

password-db = /svndata/conf/passwd

authz-db = /svndata/conf/authz

 

2)新建一个数据同步用户,需要对整个目标库有读写权限,用于更新数据:

 

# vi /svndata/conf/passwd

 

svnsync = 123456

 

# vi /svndata/conf/authz

 

[slavesvn:/]

svnsync = rw

* =

 

3)再按需创建其他用户和组,但对目标库只有读权限,用于查看已同步过来的数据:

 

# vi /svndata/conf/passwd

 

test = 456

 

# vi /svndata/conf/authz

 

[slavesvn:/]

svnsync = rw

test = r

* =

 

4)配置目标库只允许” svnsync-数据同步用户”更新版本号属性:

 

# cd /svndata/slavesvn/hooks && cp pre-revprop-change.tmpl pre-revprop-change

 

# vi pre-revprop-change

 

#!/bin/sh

 

USER="$3"

 

if [ "$USER" = "svnsync" ]; then exit 0; fi

echo "Only the svnsync user may change revision properties as this is a read-only, mirror repository." >&2

 

exit 1

 

注:增加上面的,其他的配置项都注释掉

 

# chmod 755 pre-revprop-change

 

 

3. 注册目标镜像库,并执行初始数据同步操作:

 

第一种方法:如果在源库中操作,可使用下面的命令

 

# svnsync initialize svn://192.168.1.251/slavesvn svn://192.168.1.242/mastersvn --source-username test --source-password 123 --sync-username svnsync --sync-password 123456

 

# svnsync synchronize svn://192.168.1.251/slavesvn --source-username test --source-password 123 --sync-username svnsync --sync-password 123456

 

 

第二种方法:如果在目标库中执行,可使用这两个命令

 

# svnsync initialize file:///svndata/slavesvn/ svn://192.168.1.242/mastersvn --username=svnsync --password=123456

 

# svnsync synchronize file:///svndata/slavesvn

 

 

4. 配置源库数据更新时自动同步到镜像库中:

 

1)即时同步:(通过hooks钩子脚本文件实现)(在源库中配置)

 

# cd /svndata/slavesvn/hooks && cp post-commit.tmpl post-commit

 

# vi post-commit

 

#!/bin/sh

 

/usr/bin/svnsync synchronize --non-interactive svn://192.168.1.251/slavesvn --source-username test --source-password 123 --sync-username svnsync --sync-password 123456

 

# chmod 755 post-commit

 

 

2)定时同步:(设置crontab计划任务定期执行同步脚本)(在源库中添加)

 

# crontab -e

 

*/30 * * * * /usr/bin/svnsync synchronize --non-interactive svn://192.168.1.251/slavesvn --source-username test --source-password 123 --sync-username svnsync --sync-password 123456

 

 

5. 自动同步过程中出现锁问题时的处理:

 

* 经常出现的锁问题错误如下,之后会自动中断同步操作:

 

Copied properties for revision 461.

svnsync: Server sent unexpected return value (502 Bad Gateway) in response to PR

OPFIND request for ‘/svn/!svn/vcc/default’

 

当再次运行 svnsync sync svn://localhost/jqueryjs 时,有可能出现”Failed to get lock on destination repos”的错误信息,使同步操作无法继续进行:

 

svnsync sync svn://localhost/jqueryjs

Failed to get lock on destination repos, currently held by ‘firehack:963c0909-45ad-644f-b383-7e35d445028f’

……

Failed to get lock on destination repos, currently held by ‘firehack:963c0909-45ad-644f-b383-7e35d445028f’

svnsync: Couldn’t get lock on destination repos after 10 attempts

 

* 解决方法:

 

(1) 在SVN或客户端中,可以使用”svn cleanup”解除锁定,再尝试重新同步

 

(2) 在svnsync命令中,需要使用下面的命令来解决:(解除源库中的锁)

 

svn propdel svn:sync-lock --revprop -r 0 svn://192.168.1.242/mastersvn

 

 

 

参考:

http://blog.chinaunix.net/uid-22646981-id-3084472.html

http://www.voidcn.com/blog/guli3057/article/p-2920199.html

http://54im.com/linux/svn-backup.html

http://zengrong.net/post/1598.htm

 

posted on 2022-08-18 16:59  大龄小技术  阅读(1326)  评论(0编辑  收藏  举报

导航