使用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