CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档

CentOS6.3之配置(九)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档

前言:SVN(Subversion)是近年来崛起的版本管理工具,是CVS的接班人。目前,绝大多数开源软件都使用svn作为代码版本管理软件。

        一、SVN的体系结构:

          1、SVN安全远程客户端软件包,功能强大的VPN客户端软件,支持台式机用户、远程用户和移动用户,集中化管理个人防火墙功能和VPN用户的安全认证;
          2、SVN证书管理模块,一个用于SVN的完整PKI解决方案,它将完善的CA和LDAP目录服务器技术集成在一起;
          3、SVN硬件加密卡,可以通过硬件技术实现功能强大的各种算法以提高VPN的速度和性能;
          4、SVN智能带宽管理模块,一个基于企业策略的带宽管理解决方案,可以智能地管理有限的带宽资源,以确保用于企业重要应用的VPN性能可靠;
          5、SVN冗余管理模块,通过冗余网关集群和防火墙VPN内的SVN冗余模块,对执行重要任务的VPN和防火墙应用在出现故障时实现无缝切换。自动地址转换模块,一个自动管理IP地址和命名的解决方案,通过提供IP地址服务的跟踪和集中化管理,确保可靠地控制地址分配和提高TCP/IP管理效率;
          6、SVN安全服务器软件包,专门保护单个应用服务器安全的VPN网关软件,它可以保护进行敏感操作的服务器免受攻击和未授权的访问,使客户端建立与服务器间的安全认证和支持交换加密数据的连接;
          7、SVN安全客户端软件包,它将基于状态检测的防火墙和基于IPSec的VPN客户端软件集成在客户端机器上,通过提供集中管理的个人防火墙和对所有企业VPN用户的安全认证,增强客户端机器的安全性。它与 SVN安全远程客户端软件功能相比,增强了客户端的安全功能,如访问控制和安全初始化控制等。
        二、SVN的优点:
          1、管理方便,逻辑明确,符合一般人思维习惯。
          2、易于管理,集中式服务器更能保证安全性。
          3、代码一致性非常高。
          4、适合开发人数不多的项目开发。
        三、SVN的缺点:
          1、服务器压力太大,数据库容量暴增。
          2、如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
          3、不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
        四、SVN的安装:
                SVN的安装分为YUM安装和源码安装两种方式,安装难度都不大,下面将分别介绍这两种安装方式,并在最后就安装的结果差异做总结。
          1、SVN安装环境:
                 A:Centos: 32位6.3版本;

                 B:虚拟机:VMware® Workstation 9.0.0 build-812388;

                 C:subversion-1.6.1.tar.gz、subversion-deps-1.6.1.tar.gz;

                 D:主机名:samba。

          2、YUM安装方式:
                 A、安装命令:

                       [root@samba ~]# yum install -y subversion

                       显示:

                       Loaded plugins: fastestmirror, refresh-packagekit, security
                       Loading mirror speeds from cached hostfile
                       * base: mirror.bit.edu.cn
                       * extras: mirror.bit.edu.cn
                       * updates: mirror.bit.edu.cn
                       base                                                                                                                                                                   | 3.7 kB     00:00     
                       extras                                                                                                                                                                 | 3.4 kB     00:00    
                       updates                                                                                                                                                             | 3.4 kB     00:00    
                       updates/primary_db                                                                                                                                       | 1.9 MB     00:14    
                       Setting up Install Process
                       Resolving Dependencies
                       --> Running transaction check
                       ---> Package subversion.i686 0:1.6.11-9.el6_4 will be installed
                       --> Processing Dependency: perl(URI) >= 1.17 for package: subversion-1.6.11-9.el6_4.i686
                       --> Running transaction check
                       ---> Package perl-URI.noarch 0:1.40-2.el6 will be installed
                       --> Finished Dependency Resolution

                       Dependencies Resolved

                       ======================================================================================================

                       Package                                        Arch                              Version                                   Repository                                Size
                       ======================================================================================================
                       Installing:
                       subversion                                     i686                            1.6.11-9.el6_4                            base                                     2.2 M
                       Installing for dependencies:
                       perl-URI                                       noarch                          1.40-2.el6                                    base                                     117 k

                       Transaction Summary
                       ======================================================================================================
                       Install       2 Package(s)

                       Total download size: 2.3 M
                       Installed size: 11 M
                       Downloading Packages:
                       (1/2): perl-URI-1.40-2.el6.noarch.rpm                                                                                                               | 117 kB     00:01    
                       (2/2): subversion-1.6.11-9.el6_4.i686.rpm                                                                                                       | 2.2 MB     00:18    
                       -----------------------------------------------------------------------------------------------------------------------------------------------------------------
                       Total                                                                                                                                                        117 kB/s | 2.3 MB     00:20    
                       Running rpm_check_debug
                       Running Transaction Test
                       Transaction Test Succeeded
                       Running Transaction
                       Installing : perl-URI-1.40-2.el6.noarch                                                                                                                    1/2
                       Installing : subversion-1.6.11-9.el6_4.i686                                                                                                           2/2
                       Verifying  : subversion-1.6.11-9.el6_4.i686                                                                                                            1/2
                       Verifying  : perl-URI-1.40-2.el6.noarch                                                                                                                    2/2

                       Installed:
                       subversion.i686 0:1.6.11-9.el6_4                                                                                                                                                            

                       Dependency Installed:
                       perl-URI.noarch 0:1.40-2.el6                                                                                                                                                                

                       Complete!

                 B、版本验证命令:

                       [root@samba ~]# svnserve --version 

                       显示:

                       svnserve, version 1.6.11 (r934486)
                       compiled Apr 11 2013, 17:28:04

                       Copyright (C) 2000-2009 CollabNet.
                       Subversion is open source software, see http://subversion.tigris.org/
                       This product includes software developed by CollabNet (http://www.Collab.Net/).

                       The following repository back-end (FS) modules are available:

                       * fs_base : Module for working with a Berkeley DB repository.
                       * fs_fs : Module for working with a plain file (FSFS) repository.

                       Cyrus SASL authentication is available.

                 C、创建SVN目录以及版本库:

                       [root@samba ~]# mkdir /usr/local/svn

                       [root@samba ~]# chmod u+x /usr/local/svn

                       [root@samba ~]# svnadmin create /usr/local/svn/lmzsvn

                 D、配置服务、用户权限等:

                        进入conf目录:

                        D1、配置svn服务选项:

                                 [root@samba conf]# vi svnserve.conf

                                 将下面四行行首的"#"去掉,并修改成如下结果:

                                 anon-access = none
                                 auth-access = write
                                 password-db = passwd
                                 authz-db = authz

                                 保存svnserve.conf文件;

                        D2、配置用户名与密码,按照user = passwd模式设置相关的用户信息:

                                 [root@samba conf]# vi passwd

                                 添加如下代码:

                                 lmz = davepwd

                                 保存passwd文件;

                        D3、配置用户的访问权限,按照分组的方式将用户分成不同的访问组,并对每个访问组赋予相关的访问和操作权限:

                                 [root@samba conf]# vi authz

                                 添加如下代码:

                                 [groups]
                                 admin = lmz
                                 [davesvn:/]
                                 @admin = rw

                                 保存authz文件;

                 E、采用后台启动SVN的方式,启动SVN并关闭系统防火墙:

                        [root@samba conf]# svnserve -d -r /usr/local/svn

                        关闭防火墙命令:

                        [root@samba conf]# service iptables stop

                 F、安装SVN的客户端TortoiseSVN,即可访问:

                 G、接下来可以利用TOMCAT与SVN联合开发,不在此赘述。

          3、源码安装方式:
                 A、源码安装一般需要安装Linux系统下的C语言的编译工具以及一些依赖包等:

                        [root@samba ~]# yum install gcc

                        [root@samba ~]# yum install openssl openssl-devel

                        [root@samba ~]# yum install expat

                 B、进入SVN软件包目录,并对SVN软件包进行解压(本人的软件包在/root/soft,可通过pwd命令查看):

                        [root@samba soft]#tar-zxvf subversion-1.6.1.tar.gz

                        [root@samba soft]#tar-zxvf subversion-deps-1.6.1.tar.gz

                        切记:这两个软件包一定要放在相同的目录下解压,因为解压之后你会发现,所有解压文件是放在一个文件中的,其中包括一些依赖关系。

                 C、进入SVN软件解压目录,进行编译并指定SVN软件的安装目录:

                        [root@sambasoft]# cdsubversion-1.6.1

                        [root@sambasubversion-1.6.1]#./configure --prefix=/usr/local/svn/

                 D、如果没有出现错误提示,则可以进入安装阶段,否则先解决相关问题:

                        [root@sambasubversion-1.6.1]#make && make install

                 E、配置环境变量并使配置文件生效
                        [root@sambasubversion-1.6.1]#echo "export PATH=$PATH:/usr/local/svn/bin/">> /etc/profile
                        [root@sambasubversion-1.6.1]#source /etc/profile
                 F、查看版本
                        [root@sambasubversion-1.6.1]#svnserve --version
                 G、进入svn安装目录查看安装结果,结果如图所示
                        CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                        从图中我们可以基本的安装目录结构。如果你的安装基本上有以上目录或者文件的话,说明已经安装成功了。
                  H、新建目录及建立仓库目录/opt/svn/svntest

                        [root@sambasubversion-1.6.1]#mkdir -p /opt/svn/

                        [root@sambasubversion-1.6.1]#mkdir -p /opt/svn/svntest/

                        [root@sambasubversion-1.6.1]# cd /usr/local/svn/bin

                        [root@samba bin]#svnadmin create /opt/svn/svntest/

                        测试版本库创建成功后,进入/opt/svn/svntest目录下,可以看到如下结构:

                       CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档

                        该目录下包括svn的配置目录、数据目录、说明文件等。

                  I、在conf目录下的各文件中,分别配置相关的用户、密码、权限等信息
                       可以参照上面YUM安装方法进行类似的配置,在此不再赘述。
                  J、采用后台启动的方式启动SVN服务器,关闭防火墙,并在CentOS本机上做checkout测试是否有效
                        启动:

                        [root@sambabin]#svnserve -d -r /opt/svn

                        关闭防火墙:

                        [root@sambabin]#service iptables stop

                        本机测试(co:是指checkout的缩写):

                        [root@sambabin]#svn co svn://127.0.0.1/svntest

                        结果如图所示:

                        CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档

                        途中需要你输入用户名与密码。

                        最后Checked out revision 0 是指你在安装的时候,还没有项目,所以所有的项目的版本都是从 0 开始。
                  K、只要认证成功,那么在本机执行下载命令,就可以直接下载相关的项目,比如我本机的svn项目,过程如下:

                        [root@sambasoft]#svn co svn://127.0.0.1/svntest/svn

                        结果如下:

                        CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档

                        从图中我们可以知道,svn服务器的下载文件明细,以及下载结果情况。

                        我们从远程客户端windows端的svn客户端测试,结果如图所示:
                        CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                        从图中可以看到,我们一样可以下载到相关的项目(svn项目)。
                        综上可以看出,无论是CentOS客户端还是windows客户端的svn客户端软件,都可以下载到相关的项目,说明我们配置的svn服务器是没有问题的。
        五、SVN的两种安装方式结果的对比,主要看结构目录的对比,这里对比安装目录/usr/local/svn下的结构:
          1、YUM安装方式结果:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
          2、源码安装方式:     
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 说明:源码安装的方式的测试库svntest不在/usr/local/svn,而在/opt/svn/目录下。
        六、问题:     
                 在YUM安装方式下,我没有找到跟源码安装之后相同的目录和相关的结构,导致在后面的SVN全量备份与增量备份的时候,找不到相关的SVN命令。
        七、全量备份与增量备份:
                 首先在/usr/local/svn目录下建立备份所需的目录svn_backup、full、increment、log,并授权:
                 [root@samba ~]# cd /usr/local/svn
                 [root@samba svn]# mkdir svn_backup
                 [root@samba svn]# chmod 744 svn_backup
                 [root@samba svn]# mkdir /usr/local/svn/svn_backup/full
                 [root@samba svn]# mkdir /usr/local/svn/svn_backup/increment
                 [root@samba svn]# mkdir /usr/local/svn/svn_backup/log
                 说明:full表示全量备份的所需备份目录;
                              increment表示增量备份的所需备份目录;
                             log表示增量备份所需的备份日志目录。
          A、全量备份:
                 在/usr/local/svn目录下利用VI或者VIM脚本根据建立全量备份的SHELL脚本文件svn-backup-full.sh,内容如下:
#!/bin/sh
##Subversion的安装目录及执行文件
SVN_HOME=/usr/local/svn/bin
SVN_ADMIN=$SVN_HOME/svnadmin
SVN_LOOK=$SVN_HOME/svnlook

##配置库根目录
SVN_REPOROOT=/opt/svn

##增量备份文件存放路径
date=$(date '+%Y-%m-%d')
RAR_STORE=/usr/local/svn/svn_backup/full/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi

##读取项目库列表
cd $SVN_REPOROOT
for name in $(ls)
do 

##开始做全量备份
$SVN_ADMIN hotcopy $SVN_REPOROOT/$name $RAR_STORE/$name

done
                 执行全量备份的脚本:
                 [root@samba svn]# sh svn-backup-full.sh
                 结果如图所示:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 在全量备份的脚本被执行之后,我们在full目录下看到一个以日前命名的文件目录,如果你的配置过程中没有出现问题,你可以在该日期目录下去查看,你的备份过程是成功的。(本人执行成功,如你在测试过程中,没有执行成功,请检查脚本以及svn的配置过程)
                 说明:如果你是采用YUM安装SVN服务器的话,可能在备份的时候会出现错误,原因是找不到相关的备份命令,这也是我刚才在第六大点提的问题。
          B、增量备份:
                 在/usr/local/svn目录下利用VI或者VIM脚本根据建立增量备份的SHELL脚本文件svn-backup-increment.sh,内容如下:
#!/bin/sh
#Subversion的安装目录及执行文件
SVN_HOME=/usr/local/svn/bin
SVN_ADMIN=$SVN_HOME/svnadmin
SVN_LOOK=$SVN_HOME/svnlook

##配置库根目录
SVN_REPOROOT=/opt/svn

##增量备份文件存放路径
date=$(date '+%Y-%m-%d')
RAR_STORE=/usr/local/svn/svn_backup/increment/$date
if [ ! -d "$RAR_STORE" ];then
mkdir -p $RAR_STORE
fi

##日志存放目录
Log_PATH=/usr/local/svn/svn_backup/log
if [ ! -d "$Log_PATH" ];then
mkdir -p $Log_PATH
fi

##读取项目库列表
cd $SVN_REPOROOT
for name in $(ls) 
do
if [ ! -d "$RAR_STORE/$name" ];then
mkdir $RAR_STORE/$name
fi

cd $RAR_STORE/$name
if [ ! -d "$Log_PATH/$name" ];then
mkdir $Log_PATH/$name
fi

echo ******Starting backup from $date****** >> $Log_PATH/$name/$name.log
echo ******svn repository $name startting to backup****** >> $Log_PATH/$name/$name.log
$SVN_LOOK youngest $SVN_REPOROOT/$name > $Log_PATH/A.TMP
UPPER=`head -1 $Log_PATH/A.TMP`


##取出上次备份后的版本号,并做+1处理
NUM_LOWER=`head -1 $Log_PATH/$name/last_revision.txt`
let LOWER="$NUM_LOWER+1"

##开始做增量备份并记录$UPPER,为下次备份做准备
$SVN_ADMIN dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR_STORE/$name/$LOWER-$UPPER.dump
rm -f $Log_PATH/A.TMP
echo $UPPER > $Log_PATH/$name/last_revision.txt
echo ******This time we bakcup from $LOWER to $UPPER****** >> $Log_PATH/$name/$name.log
echo ******Back up ended****** >> $Log_PATH/$name/$name.log
done
                 执行增量备份的脚本:
                 [root@samba svn]# sh svn-backup-increment.sh.sh
                 结果如图所示:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 从图中可以看出,增量备份成功。(本人执行成功,如你在测试过程中,没有执行成功,请检查脚本以及svn的配置过程)
                 说明:如果你是采用YUM安装SVN服务器的话,可能在备份的时候会出现错误,原因是找不到相关的备份命令,这也是我刚才在第六大点提的问题。
                 说明:SVN备份与恢复的命令都位于bin目录下,如下图所示:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                全量备份与增量备份过程结束。
        八、备份文件一览:
                 全量备份在此不描述,顾名思义就是把整个项目备份下来,没有什么好描述的。我们看一下增量备份的几个备份版本。我的CentOS系统下SVN服务器已经提交了好几个版本,以供测试的时候使用,故直接采用我所备份的文件来查看。
                 首先查看日志目录下的svntest.log文件:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 从此文件中我们可以看到,每个增量备份的文件中包括了哪几个具体的版本。比如:1 to 2、3 to 3、4 to 5等。从此文件中也可以看出,你在做增量备份的时候,改项目已经被提交了多少次文件。所以这个增量备份的信息很清晰明了。
                 同时在last_revision.txt中记录着该项目的最新版本。如果你的最新版本和上面的最新增量备份日志的最大版本号对不上的话,说明你的备份脚本可能存在相关的问题,你需要检查你的脚本,或者检查的SVN服务器的配置。
                 那么我们怎么知道哪个具体的版本中有什么变化呢?请看下面的内容:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 这个图中的文件是在/usr/local/svn/svn_backup/increment/2014-03-15/svntest之下。从图中可以看出,我们进行了三次增量备份,第一次是两个版本,第二次是一个版本,第三次是两个版本。
                 我们看一个比较有代表性的增量备份文件,即对项目文件有修改也有增加文件的版本增量备份文件,我本机是4-5.dump文件,下面只摘抄比较关键的重要内容做说明,证明增量备份的成功以及版本的变化:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 从图中的Node-path、Node-kind、Node-action节点中可以知道,在第五个版本中,我们是在工程项目的/WebContent/WEB-INF/目录下新增了一个test.jsp页面,而且我们还知道文件的内容、长度、版本、文件的MD5加密等信息。
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 从图中的Node-path、Node-kind、Node-action节点中可以知道,在第五个版本中,我们是在工程项目的/WebContent/WEB-INF/目录下修改了一个test.jsp页面,而且我们还知道文件的内容、长度、版本、文件的MD5加密等信息。但是值得注意的是,在此得不到修改之前的文件信息,只能是修改之后的文件信息。
                 在此也再次声明,如果参考该文档配置SVN服务器的话,强烈建议采用第二种方式安装,即源码安装的方式。当然,如果你不需要使用相关的一些命令的,第一种安装模式也能满足你的要求。
        九、SVN服务器数据存储简介:
                 进入你的svn项目库的目录:/opt/svn/svntest/db/revs/0,我们可以看出有如图的文档:
                 CentOS6.3之配置(9)关于SVN服务器的安装、全量备份、增量备份的配置及分析、数据存储文档
                 从图中可以看出,我们的项目最新版本是第五版。
                 SVN服务器端不是简单将上传的文件一个一个存放起来的,SVN服务器端默认采用的FSFS格式是将每次commit的内容增量方式存放的,每个增量包存成1个文件,这个增量包中包括了这次commit的全部数据。也就是说你不可能在服务器端存放该版本库的文件夹下找到你上传的某个文件。
                 你采用more命令浏览文件的文件,你会看到classpath等信息,还有一些***.jar包的信息,那就是了。
                 至此,SVN的第一阶段配置、备份等任务结束。
        十、引用百度的FSFS资料:
                FSFS 采用文件系统的方式, 替代原来的基于Berkeley DB的实现。
                一种不需要数据库的存储系统。FSFS版本库在单一文件中存储修订版本树,所以版本库中所有的修订版本都在一个子文件夹中有限的几个文件里。事务在单独的子目录中被创建,创建完成后,一个单独的事务文件被创建并移动到修订版本目录,这保证提交是原子性的。因为一个修订版本文件是持久不可改变的,版本库也可以做到热备份,就象Berkeley DB版本库一样。
                修订版本文件格式代表了一个修订版本的目录结构,文件内容,和其它修订版本树中相关信息。不像Berkeley DB数据库,这种存储格式可跨平台并且与CPU架构无关。因为没有日志或用到共享内存的文件,数据库能被网络文件系统安全的访问和在只读环境下检查。缺少数据库花消同时也意味着版本库的总体体积可以稍小一点。
                FSFS也有一种不同的性能特性。当提交大量文件时,FSFS使用O(N)算法来追加条目,而Berkeley DB则用(N^2)算法来重写整个目录。另一方面,FSFS通过写入与上一个版本比较的变化来记录新版本,这也意味着获取最新修订版本时会比Berkeley DB慢一点,提交时FSFS也会有一个更长的延迟,在某些极端情况下会导致客护端在等待回应时超时。
                最重要的区别是当出现错误时FSFS不会楔住的能力。如果使用Berkeley DB的进程发生许可错误或突然崩溃,数据库会一直无法使用,直到管理员恢复。假如在应用FSFS版本库时发生同样的情况,版本库不会受到任何干扰,最坏情况下也就是会留下一些事务数据。
                唯一真正对FSFS不利的是相对于Berkeley DB的不成熟,缺乏足够的使用和压力测试,许多关于速度和可扩展性的判断都是建立在良好的猜测之上。在理论上,它承诺会降低管理员新手的门槛并且更加不容易发生问题。在实践中,只有时间可以证明。
               总之,这两个中并没有一个是更正式的,访问版本库的程序与采用哪一种实现方式无关。通过上文和下表(从总体上比较了Berkeley DB和FSFS版本库),读者可以自行选择自己需要的存储方式。
               引用地址:
               http://baike.baidu.com/link?url=8W1nYBUuzZAkip2H9qBpPcyPoAkCvJX4IdV4TuABCTlwHFFKIjvqEdFqh35nSxYrvJ7x1kWykgywJmE-nxEZi_