您的位置主页 > SVN配置

远程镜像与备份SVN服务器

此文讲述SVN如何镜像服务器,注意是单向镜像。众所周知,SVN有自已的镜像命令svnsync(svn1.4以及以上版本特性),但是部署与维护确是繁琐至极,令人望而却步。我们来看一个简单的svnsync例子:
主SVN服务器: http://mastersvn/project1
svnsync镜像SVN服务器上的部署:http://backupsvn/project1

第一步:建立仓库
cd /home/svn
svnadmin create –fs-type fsfs /home/svn/project1
chmod 777 –R project1
第二步:镜像初始化
svnsync init http://backupsvn/project1 http://mastersvn/project1
第三步:更改配置文件
cd /home/svn/project1/hooks
cp pre-revprop-change.tmpl pre-revprop-change

vi pre-revprop-change
注销所有语句,在语句前加入#即可,退出保存
第四步:同步
svnsync sync http://backupsvn/project1 --username username --password password
已提交版本 9。
复制版本 9 的属性。
已提交版本 10。
复制版本 10 的属性
……………
但是在实际运用中,经常会发生SVN库被lock的情况
svnsync: Couldn't get lock on destination repos after 10 attempts
这不得不让我们感觉头痛地手动使用改命令解锁
svn propdel svn:sync-lock --revprop -r0 http://backupsvn/project1
写到这里,大家不由对svnsync有了个初步的认识了吧,就一个字,烦!!!而且同步速度很慢!!!
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接下来是此文的重点部分:
SVN新的镜像备份方案:ssh + rsync + crontab(任务计划))
什么是SSH?
SSH 是更灵活、更安全的 telnet 和 rlogin 替代品。它在开发项目中得到广泛使用,以提供访问控制和安全的数据传输。
什么是rysnc?
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
优化的流程,文件传输效率高。
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
什么是crontab?
Crontab是Linux操作系统下的一个命令,可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。(类似windows下的任务计划)
方案拓扑图:(请看附件)
主SVN服务器环境:
SVN仓库根目录: /home/svn (project1,project2,project3三个仓库)
SVN服务器IP: 192.168.100.80
镜像SVN服务器环境:
SVN仓库根目录:/home/svn (无仓库,无需建立,镜像时会直接复制过来并保持文件属性)
SVN服务器IP: 192.168.100.81

#主SVN服务器安装部分:
(1)
SVN安装部分(略)
(2)
安装rsync部分
rpm -qa | grep rsync (所有系统是否有安装过rsync)
rpm -e rsyncxxx (删除以前安装过的rsync)
wget [url]http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz[/url] (下载rsync源码安装包)
tar zxvf rsync-3.0.4.tar.gz (解压)
cd rsync-3.0.4
./install.sh (安装)
接下来我们就可以输入rsync --version命令来测试下是否安装成功了。
rsync
version 3.0.3
protocol version 30
Copyright (C) 1996-2008 by Andrew Tridgell, Wayne Davison, and others.
Web site: [url]http://rsync.samba.org/[/url]
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, no symtimes
rsync comes with ABSOLUTELY NO WARRANTY.
This is free software, and you
are welcome to redistribute it under certain conditions.
See the GNU
General Public Licence for details.
(3) 开启rsync服务器端
/usr/local/bin/rsync --daemon (开启rsync服务)
vi /etc/rc.d/rc.local
在末尾加入/usr/local/bin/rsync --daemon (目的是让服务器每次重启后都能自动运行此进程)

#镜像SVN服务器安装部分:
(1)SVN安装部分(略)
(2)安装rsync部分
rpm -qa | grep rsync (所有系统是否有安装过rsync)
rpm -e rsyncxxx (删除以前安装过的rsync)
wget [url]http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz[/url] (下载rsync源码安装包)
tar zxvf rsync-3.0.4.tar.gz (解压)
cd rsync-3.0.4
./install.sh (安装)
接下来我们就可以输入rsync --version命令来测试下是否安装成功了。
接下来我们的配置就完成了,让我们用命里那个测试下。
同步命令:
rsync -vzrtopgu --progress --delete [email]root@192.168.100.80[/email]:/home/svn /home/
输入用户名root
输入root的密码。

65309 100%
224.57kB/s
0:00:00 (xfer#507, to-check=2187/23106)
svn/project1/db/revs/202

29655 100%
99.86kB/s
0:00:00 (xfer#508, to-check=2186/23106)
svn/project1/db/revs/203

7242 100%
23.19kB/s
0:00:00 (xfer#509, to-check=2185/23106)
sent 15928 bytes
received 521860019 bytes
4404016.43 bytes/sec
total size is 12240235825
speedup is 23.45
传输完成,这次镜像过程就结束了。
让我们看看所使用的参数:
v 复杂的输出信息
z 压缩模式, 当资料在传送到目的端进行档案压缩.
r 复制所有下面的资料(透过)
t 保留时间点
o 保留档案所有者(root only)
p保留档案权限
g 保留档案群组
u更新修改过的文件
--progress 显示传送的进度
--delete 删除传送断已经不存在,而目的端存在的档案

[email]root@192.168.100.80[/email]:/home/svn /home/
用root用户访问192.168.100.80的/home/svn目录,然后同步到本机的/home/目录下,注意格式,那么镜像SVN服务器就会把主SVN服务器上的/home目录的svn文件夹整个复制到镜像SVN服务器上的/home下,并保存原属性不变。

###注意:为什么使用root的用户呢,因为可以确保保证同步过来的文件可以保证档案的具体属性,这是我们比较关心的问题,但是root的用户拥有的权限太大了,每次都需要输入root的密码,一方面这是非常危险的,一方面比较繁琐。
那么我们首先想到的不需要输入用户名和密码就可以镜像和传输文件,那么必须让两台SVN服务器互相信任,那么我们需要采用ssh私钥和公钥加密技术。
主SVN服务器:
ssh-keygen –d
Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61 [email]root@svnserver.com[/email]

cd .ssh
id_dsa ------------ 私钥文件

id_dsa.pub ------------ 公钥文件

cp id_dsa.pub authorized_keys2 (复制一个可以被root识别和读取的公钥文件)
chmod 600 authorized_keys2 (因安全因为给予600权限)
cp id_dsa.pub svnserver.pub (再做一份公钥的副本)
想办法把这个公钥的副本移动到镜像SVN服务器上面。
cat mirrorsvnserver.pub >> authorized_keys2 (把复制过来的镜像SVN服务器上的公钥导入到主SVN服务器的公钥文件里)
镜像SVN服务器:
ssh-keygen –d
Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61 [email]root@mirrorsvnserver.com[/email]

cd .ssh
id_dsa ------------ 私钥文件

id_dsa.pub ------------ 公钥文件

cp id_dsa.pub authorized_keys2 (复制一个可以被root识别和读取的公钥文件)
chmod 600 authorized_keys2 (因安全因为给予600权限)
cp id_dsa.pub mirrorsvnserver.pub (再做一份公钥的副本)
想办法把这个公钥的副本移动到主SVN服务器上面。
cat svnserver.pub >> authorized_keys2 (把复制过来的主SVN服务器上的公钥导入到镜像SVN服务器的公钥文件里)
让我们里验证公钥文件中的内容:
cat /root/.ssh/authorized_keys2
ssh-dss AAAAB3NzaC1kc3MAAACBAL9iAG+VZkXunZ5KzTivat1deDAQFKdrGY5P2rxRI+QeKClNgfukUNwQmU+a5FqfNsLKlWhGbIfFI1k00Zkc7nwMdG2dtcnWw7oUqPCGizMcoPLXXQhfOPaFoOkB5UPWNkgJobBPZBjJ7nhKZxzzMiujhOVYLvGNDEWI8x3NAAAAFQCqqtJaMgVyMgDexUKbHIBXsSghYIB5U82gTyGb2c4z4AsmQ5M0ds3YHHVLPHRUEn7DspzlNZ7fYWhKzQYWlhPJftuYTrYIEzuXx8Hl8kg7hCEl4hArAgMMcEtmuQ+3x5SkEht3077qUPdC/YzSk7cFNwQlt6nOeYELCIwhs1CXWQXi9E/XSlqepd+gSlAAhVzWc0MgAAAIAy4qWyaB6DT+XWtq23jrFrYeejJyFBVkNVUbEd3GNTHvwKTYuBa7nlh562g5r0riIrHW+a7WGd6U32RVLnqqIwddcHml4kXnondo0qjW4XijYI7jkHN9oAK5mNWnSCYAnot1nra3QXlh9472/l7kTmznumjsDDjAIa7OFY9w== [email]root@svnserver.com[/email]
ssh-dss AAAAB3NzaC1kc3MAAACBAPI3YFCQNBof9xA/Fi1S0U4jmliAg/TaWHnx9suaYb5Xc31jW3+axbNURIBnK7cA53q+qBME1DdddSBOq+I0oUpfjAXkOUl/ACRbSRqA1VOaKdI2AOH9tw4jSK0xSqYjj+ReuUnuVMSTOJTQzt1n6YsLj/kjAAAAFQCHE5NqPCIlr5xVFYOZmGysI+CtKQAAAIAb/gjP0f3Ifx0H2A3XzH9fG4YENLd+gz0l07Mq356+IBuPSYxi4JldxZ7j1OkH9j+7+t8AOSyqNqiOzKXpimo0NLjVsEkpn9RXFmzfHHwRholmauDKIbGLvJlTL0ZkjqH3w0plGmVC6YyxOpM4w7XklIvtq3rDZQE4O247yxgAAAIEA2rd2htKfO9I7F+rBxVgszeGrwCfP5gf8sdz32LDd+E4JxzI/b79Tn1ylILb0vGZhRCbFhoLnDIUMR3Lrr5FqGlTf8O2gsvproA5pLqUpgrkhR/7siycplOddftt553yBJNCBkq+E906AwQ72PNs2uLrbKHyVyD1akrD2/hfA= [email]root@svnmirrorserver.com[/email]
这样我们的两台SVN服务器就得到信任了。
让我们再次执行同步命令:
rsync -vzrtopgu --progress --delete [email]root@192.168.100.80[/email]:/home/svn /home/
发现了什么?
已经不需要输入用户名和密码了。
最后我们需要设定人物计划了。
crontab –e
*/10 * * * * /usr/local/bin/rsync -vzrtopgu --progress --delete [email]root@192.168.100.80[/email]:/home/svn /home/ &
退出保存。
这个例子是每10分钟同步一次,当然我们也可以设置我们想要的时间。
另外一个例子:每小时同步一次
* */1 * * * /usr/local/bin/rsync -vzrtopgu --progress --delete [email=root@192.168.100.80:/home/svn]root@192.168.100.80:/home/svn /home/ &
备注:
(1) 所有同步都为增量备份,笔者不建议大家都采用增量备份对SVN进行备份,这有可能导致SVN库日后不可用,但笔者这里将尽有不下50个SVN库,同步几月都没发生任何问题,都能正常被使用。但是为了谨慎起见,希望大家再做一个定期全备份,建议每周一次。如有用户因此丢失,笔者将不负任何责任。
(2) 此方法适应Windows上使用,rsync程序名称为cwRsync



(3) rsync有二种配置方式:一种是ssh,scp,stock等协议直接传输,无需修改配置文件(笔者用法),第二种是修改rsync配置文件,映射路径和指定密码(支持匿名)



(4) ssh + rsync + crontab只是复制文件而已,无需依赖apache和subversion程序