经过Apache Write-through proxy实现SVN Master-Slave主从架构

经过Apache Write-through proxy实现SVN Master-Slave主从架构

本文来至:http://heylinux.com/archives/1708.htmlhtml

参考资料:
http://svnbook.red-bean.com/en/1.5/svn.serverconfig.httpd.html#svn.serverconfig.httpd.extra.writethruproxylinux

背景/环境:
目前有一台SVN服务器供全公司使用,但因为分公司数量的增长,且处于不一样的地理区域的网络中,形成了如下问题:
1.部分分公司的网络情况不佳,每次更新和提交代码的时候都很是慢;
2.SVN服务器的压力愈来愈大;apache

同时,不少分公司的领导都提出,但愿能在本地创建一台总部SVN服务器的镜像,提高访问速度;vim

方案/设计:
经过Apache的Write-through proxy使SVN服务器实现与MySQL Master-Slave相似的一主多从的架构。
以下图所示:
bash

安装与配置:服务器

1.安装配置Apache与Subversion - Master&Slave
注:如下操做须要在Master与Slave上进行网络

首先,须要安装和集成Apache与Subversion,具体的步骤能够参考个人这篇文章:
http://heylinux.com/archives/917.html
其中 第1段 和 第3段 分别讲述了Apache与Subversion的安装与配置方法。session

2.检查Apache是否加载proxy与proxy_http模块 - Master&Slave
注:如下操做须要在Master与Slave上进行架构

# grep proxy /opt/apache2/conf/httpd.conf
若是出现如下内容,则代表加载成功:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.soide

若是没有出现,则须要经过如下方式添加:
进入Apache源码包的modules目录
# cd httpd-2.2.18/modules
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy.c proxy/proxy_util.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_http.c

而后重启Apache使模块生效
# /opt/apache2/bin/apachectl restart

3.配置读写分离 - Slave
注:如下操做仅须要在Slave上进行

进入仓库的主目录
# cd /data/svn_repo

删除在第1步中建立的仓库
# rm -rf project1

建立新的空白仓库
# /opt/subversion/bin/svnadmin create project1

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

建立pre-revprop-change钩子文件
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除如下部份内容:

1 if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
2   
3 echo "Changing revision properties other than svn:log is prohibited" >&2
4 exit 1

更改Apache配置文件
# vim /opt/apache2/conf/extra/httpd-svn.conf

01 <Location /svn>
02 DAV svn
03 SVNListParentPath On
04 SVNParentPath /data/svn_repo
05 SVNMasterURI http://master.heylinux.com/svn  ##将master.heylinux.com替换为Master服务器的IP地址或域名
06 AuthType Basic
07 AuthName "Subversion Repository"
08 AuthUserFile /opt/subversion/conf/svn_passwdfile
09 AuthzSVNAccessFile /opt/subversion/conf/svn_accessfile
10 Require valid-user
11 </Location>
12   
13 <Location /svn-proxy-sync>
14 DAV svn
15 SVNListParentPath On
16 SVNParentPath /data/svn_repo
17 Order deny,allow
18 Deny from all
19 Allow from 192.168.203.133  ##将192.168.203.133替换为Master服务器的IP地址
20 </Location>

配置详解:
首先,在>Location /svn>中加入 SVNMasterURI http://master.heylinux.com/svn 指定主SVN服务器的URL;
而后,建立一个新的>Location /svn-proxy-sync>,取消认证功能,并加入地址验证,仅容许来自Master的请求;这样,Master就能够经过 http://slave.heylinux.com/svn-proxy-sync/project1将代码同步到Slave中去,避免了直接提交到http://slave.heylinux.com/svn/project1后会产生死循环的问题;
虽然,咱们平时使用的是Slave - http://slave.heylinux.com/svn/project1,但在commit的时候,代码会经过代理自动提交到Master - http://master.heylinux.com/svn/project1,而后再由Master同步到Slave中;
也就是说,咱们在commit的时候,速度依然会受到与总公司Master服务器之间网络的影响,可是本着80%与20%的读写比例原理,大多数时间下,咱们都是以update为主,而在执行Update动做的时候,咱们的请求只会在Slave上,所以速度会很快。

4.配置镜像同步 - Master
注:如下操做仅须要在Master上进行

进入仓库的主目录
# cd /data/svn_repo

建立pre-revprop-change钩子文件
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除如下部份内容:

1 if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
2   
3 echo "Changing revision properties other than svn:log is prohibited" >&2
4 exit 1

初始化镜像
# /opt/subversion/bin/svnsync init http://slave.heylinux.com/svn-proxy-sync/project1 file:///data/svn_repo/project1
执行后显示如下信息则代表成功:
Copied properties for revision 0.

注意:若是是绝对路径,file://后面还要加一个斜杠/,所以总共是三个斜杠,不然会出现如下错误:
svnsync: Unable to open an ra_local session to URL
svnsync: Local URL 'file://data/svn_repo/project1' contains unsupported hostname

进行初次同步
# /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1
执行后显示如下信息则代表成功:
Transmitting file data .........
Committed revision 1.

建立 post-commit 钩子文件
# cd /data/svn_repo/project1/hooks
# vim post-commit

1 #!/bin/sh
2 # Post-commit script to replicate newly committed revision to slaves
3 /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1 > /dev/null 2>&1

更新 pre-revprop-change 钩子文件
# vim pre-revprop-change

1 #!/bin/sh
2 # Post-revprop-change script to replicate revprop-changes to slaves
3   
4 REV=${2}
5 /opt/subversion/bin/svnsync copy-revprops http://slave.heylinux.com/svn-proxy-sync/project1 ${REV} > /dev/null 2>&1

更改钩子文件的属主与权限
# chmod +x post-commit pre-revprop-change
# chown apache:apache post-commit pre-revprop-change

5.测试
配置完成,接下来即可以经过如下步骤检查是否搭建成功。
a. 从Slave上checkout - 从Master上checkout - 向Slave上commit - 到Master上update
b. 向Master上commit - 从Slave上udpate

若是向Slave提交的代码能够从Master上update下来,则代表Write-through proxy代理配置成功;
若是向Master提交的代码能够从Slave上update下来,则代表镜像同步配置成功;

6.其它 该文章中仅配置了一个Slave,若是在实际状况中须要配置多个Slave的话,只须要重复以上步骤并将Slave所有添加到Master的post-commit和pre-revprop-change钩子文件中便可。

相关文章
相关标签/搜索