利用hotcopy与svnsync实现SVN镜像的快速搭建


背景/需求:
在我的上一篇文章中,我详细介绍了如何实现SVN主从架构的方法;
但在实际的应用环境中,却面临着另一个难题,现有的主SVN服务器上的数据量太大,超过10G以上,而svnsync却需要先初始化一个空库,然后再从0开始一直同步到相同的版本;
而主从服务器之间存在的网络状况并不理想,因此需要耗费非常多的时间且很可能出现同步中断等不稳定的情况。

方案/设计:
转换一种思路,试想MySQL的复制过程与svnsync非常相似,但是MySQL就可以通过初次导入完整库的数据,然后再指定其Position的值来实现增量同步,从而完成整个主从的搭建;
那么,我们也可以试着用这样的方式来操作svnsync,通过hotcopy将整个SVN主库完整备份下来,再压缩打包后传送到从服务器上,解开之后,修改相关的配置文件使svnsync认为从服务器上的库已经是经过了初始化并同步过的,从而实现增量同步,快速完成整个主从的搭建。

配置过程:
1. 通过hotcopy将SVN主库进行一次完整备份 - Master
注:以下操作需要在Master上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin hotcopy project1 /opt/backups/project1

# cd /opt/backups/
# tar cjvf project1-master.tar.bz2 project1/

2. 将备份文件传送到从服务器上 - Master

3. 在从服务器上创建一个空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin create project1

# chown -R apache:apache project1/
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

4. 在主服务器上通过svnsync初始化仓库 - Master
注:以下操作需要在Master上进行
# /opt/subversion/bin/svnsync init http://slave.heylinux.com/svn-proxy-sync/project1 file:///data/svn_repo/project1

5. 在从服务器上备份初始化过后的空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# mv project1 /opt/backups/

6. 解压从主服务器过来的完整备份文件,并进行“调包”的过程 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo
# tar xjvf /opt/backups/project1-master.tar.bz2

替换钩子文件
# cd project1/hooks
# cp -p /opt/backups/project1/hooks/pre-revprop-change .

替换uuid
# cd ../db/
# cp -p /opt/backups/project1/db/uuid .

替换初始版本日志
# cd revprops/0/
# cp -p /opt/backups/project1/db/revprops/0/0 .

更改仓库目录属主
# chown -R apache:apache /data/svn_repo/project1/

6.复制sync-last-merged-rev(最后一次同步)版本号 - Master
注:以下操作需要在Master上进行
获取当前版本号,例如:40482
# cat /data/svn_repo/project1/db/current

将当前版本号复制到从服务器
# /opt/subversion/bin/svn propset --revprop -r0 svn:sync-last-merged-rev 40482 http://slave.heylinux.com/svn-proxy-sync/project1

执行一次同步
# /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1

7. 镜像搭建完成

8. 经验总结
通过上面的“调包”操作,svnsync成功的被我们“欺骗”了,可以直接在完整库的基础上利用svnsync进行增量同步了;
这样就不必傻乎乎的非得等svnsync从0开始同步到目前的版本,这种思路也可以用于今后SVN服务器Crash的情况以及修复主从同步。

贴一些报错信息方便搜索引擎定位:
svnsync: Destination HEAD (40482) is not the last merged revision (0); have you committed to the destination without using svnsync?
svnsync: Destination repository has not been initialized.
svnsync: Error setting property 'sync-lock':could not remove a property.
svnsync: DAV request failed;

  1. No comments yet.
(will not be published)
*