安装环境:
1.操作系统:CentOS release 6.6 (Final)
2.软件包:apr-1.5.2.tar.gz apr-iconv-1.2.1.tar.gz apr-util-1.5.4.tar.gz sqlite-amalgamation-3071501.zip subversion-1.9.2.tar.gz zlib-1.2.8.tar.gz
3.服务器IP: 192.168.200.205 192.168.200.206
说明:
1.软件包的存放目录:/data/soft
2.服务器192.168.200.205 192.168.200.206
3.SVN目录说明
SVN安装目录:/data/app/svn
SVN数据存放目录:/data/svndata
目前SVN的架构:master-slave,可以做通过计划任务做定时同步,也可以实现实时同步,具体采用哪种方式根据实际需要来进行选择
具体操作步骤:
一、Master端的操作
1.先安装依赖包然后进行svn的源码编译安装,具体见svn_install.sh
cat svn_install.sh
yum -y install gcc rsync xinetd
#soft_package apr-1.5.2.tar.gz apr-iconv-1.2.1.tar.gz apr-util-1.5.4.tar.gz sqlite-amalgamation-3071501.zip zlib-1.2.8.tar.gz
#soft_path:/data/soft
#define soft_path variables
soft_path="/data/soft"
#install subversion dependent package
cd $soft_path
tar zxf apr-1.5.2.tar.gz && cd apr-1.5.2 && ./configure --prefix=/usr/local/apr && make && make install
cd $soft_path
tar zxf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4 && ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
cd $soft_path
tar zxf apr-iconv-1.2.1.tar.gz && cd apr-iconv-1.2.1 && ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr && make && make install
cd $soft_path
tar zxf zlib-1.2.8.tar.gz && cd zlib-1.2.8 && ./configure --prefix=/usr/local/zlib && make && make install
#install subversion
cd $soft_path && tar zxf subversion-1.9.2.tar.gz && unzip sqlite-amalgamation-3071501.zip
mv /data/soft/sqlite-amalgamation-3071501 /data/soft/subversion-1.9.2/sqlite-amalgamation
cd subversion-1.9.2 && ./configure --prefix=/data/app/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-zlib=/usr/local/zlib/ && make && make install
2.创建svn目录和版本库php ios
mkdir -p /data/svndata
svnadmin create /data/svndata/php
svnadmin create /data/svndata/ios
3. 多版本库统一配置管理
实际使用过程中是多版本库,为方便对多版本库进行管理,建立conf目录
mkdir /data/svndata/conf #该目录用于管理所有项目的帐号密码、权限控制等
[root@localhost conf]# cd /data/svndata/php/conf
[root@localhost conf]# cp passwd authz svnserve.conf /data/svndata/conf/
针对passwd authz snvserve.conf文件的修改如下所示:
[root@localhost conf]# cat passwd |grep -v "^$"|grep -v "#" #每个用户的用户名和密码
[users]
user = passwd
[root@localhost conf]# cat authz |grep -v "^$"|grep -v "#" #权限管理,权限管理的统一思路是:创建多个组,将各个用户加入到各个组,控制各个组的权限。以后对权限管理就维持在组的维度,
[groups]
php = user
[php:/]
user = rw
[root@localhost conf]# cat svnserve.conf |grep -v "^$"|grep -v "#" #svn的总控文件[general]
anon-access = none #未鉴定的用户无权限访问该版本库
auth-access = write #鉴定后的可读写版本库
password-db = passwd #使用的密码文件是同级路径的passwd文件,即是/data/svndata/conf/passwd
authz-db = authz #使用的权限控制文件是同级路径的authz文件,即是/data/svndata/conf/authz
realm = svndata #realm 指定版本库的认证域,即在登录时提示的认证域名称。各个项目的认证域都可以自定义
4.各个版本库配置文件修改
每个项目默认使用的配置文件是该项目下的配置文件,所以必须修改掉,否则不受总控配置文件的管理
接下来以对php版本库配置文件的修改为例来进行说明,其余的版本库请参考此步骤进行相关配置文件的修改
[root@localhost ~]# cd /data/svndata/php/conf/
[root@localhost conf]# cat svnserve.conf|grep -v "^$"|grep -v "#"
[general]
anon-access = none
auth-access = write
password-db = ../../conf/passwd
authz-db = ../../conf/authz
realm = php
4.启动svn: svnserve -d -r /data/svndata/
5.安装SVN客户端,checkout svn://192.168.200.205/php 并在检出的目录中新增test.txt文档
二、Slave端的操作
前4步操作和Master端一样(省略)
5.准备备库的钩子(以php项目为例,其他项目一样)
[root@yx-u2-svn-slave ~]# cat /data/svndata/php/hooks/pre-revprop-change
#!/bin/sh
exit 0
[root@yx-u2-svn-slave ~]# chmod 755 /data/svndata/php/hooks/pre-revprop-change
三、建立SVN的Master-Slave关系,并将主上的数据同步到从
注:192.168.200.206 是备库,192.168.200.205是主库;主库和备库的用户名和密码一致,并且liyuemei需要有相关权限,具体看/data/svndata/conf/authz
[root@yx-u2-svn-slave ~]# svnsync init svn://192.168.200.206/php svn://192.168.200.205/php --username user --password passwd --no-auth-cache
Copied properties for revision 0.
如果看到以下内容就说明成功了。如果发现只有版本号,没有Transmitting file data,请仔细检查主库备库配置文件,是否有错误和遗漏
[root@yx-u2-svn-slave ~]# svnsync sync --non-interactive svn://192.168.200.206/php --username user --password passwd
Transmitting file data .
Committed revision 1.
Copied properties for revision 1.
Transmitting file data .
Committed revision 2.
Copied properties for revision 2.
四、定时计划保证数据一致性
[root@yx-u2-svn-slave ~]# crontab -l
0 */2 * * * /usr/sbin/ntpdate -s -b -p 8 -u 172.16.100.5 >/dev/null 2>&1
*/3 * * * * /data/scripts/svn_sync.sh &>/dev/null
[root@yx-u2-svn-slave ~]# cat /data/scripts/svn_sync.sh
#!/bin/bash
now_time=$(date +"%F_%T")
for project in php ios
do
svnsync sync --non-interactive svn://192.168.200.206/$project --username user--password passwd >>/data/logs/svnbackup.log.$now_time 2>&1
done
五、Master-Slave实时同步(此操作需要在Master进行)
[root@yx-u2-svn-master ~]# cd /data/svndata/php/hooks/
[root@yx-u2-svn-master hooks]# cp post-commit.tmpl post-commit
[root@yx-u2-svn-master hooks]# cat post-commit|tail -6
#REV="$2"
#TXN_NAME="$3"
#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
/data/app/svn/bin/svnsync sync --non-interactive svn://192.168.200.206/php --username user --password passwd
将post-commit文件的最后三行注释掉并追加一行同步命令,这样便可以实现主从数据的实时同步
六、验证
Master客户端 checkout svn://192.168.200.205/php 新增文本文件或者是对原有的文件做修改,然后svn commit
Slave客户端 checkout svn://192.168.200.206/php svn update 即可以看到本机的数据和Master端保持一致
七、部署SVN服务器Master-Slave架构过程中遇到的问题:
1.报错信息:svnsync: Destination repository has not been initialized
[root@node2 ~]# svnsync sync svn://192.168.200.206/java --username user--password passwd --no-auth-cache
Authentication realm: <svn://192.168.200.206:3690> ios
Username: user
Password for 'user':
-----------------------------------------------------------------------
ATTENTION! Your password for authentication realm:
<svn://192.168.200.206:3690> ios
can only be stored to disk unencrypted! You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible. See the documentation for details.
You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
svnsync: Destination repository has not been initialized
原因:先执行svnsync init 再执行 svnsync sync
svnsync init svn://192.168.200.206/java svn://192.168.200.205/ios --username user --password passwd --no-auth-cache
svnsync sync svn://192.168.200.206/ios --username user --password passwd --no-auth-cache
2.修改文档后,执行svn commit操作时报错信息:post-commit hook failed (exit code 255) with output
原因:post-commit文件没有执行权限
3.修改文件后svn commit时报错信息如下:
Error post-commit hook failed(exit code 127) with output
Error /data/svndata/php/hooks/post-commit:line 64:svnsync:command not found
原因:找不到svnsync命令
解决方法:/data/app/svn/bin/svnsync sync --non-interactive svn://192.168.200.206/php --username user --password passwd