设为首页 收藏本站
查看: 867|回复: 0

[经验分享] 通过Apache Write-through proxy实现SVN Master-Slave主从架构

[复制链接]

尚未签到

发表于 2018-11-26 06:58:09 | 显示全部楼层 |阅读模式
  参考资料:
  http://svnbook.red-bean.com/en/1.5/svn.serverconfig.httpd.html#svn.serverconfig.httpd.extra.writethruproxy
  背景/环境:
  目前有一台SVN服务器供全公司使用,但由于分公司数量的增加,且处于不同的地理区域的网络中,造成了以下问题:
  1.部分分公司的网络状况不佳,每次更新和提交代码的时候都非常慢;
  2.SVN服务器的压力越来越大;
  同时,很多分公司的领导都提出,希望能在本地建立一台总部SVN服务器的镜像,提升访问速度;
  方案/设计:
  通过Apache的Write-through proxy使SVN服务器实现与MySQL Master-Slave类似的一主多从的架构。
  如下图所示:
DSC0000.png

  安装与配置:
  1.安装配置Apache与Subversion - Master&Slave
  注:以下操作需要在Master与Slave上进行
  首先,需要安装和集成Apache与Subversion,具体的步骤可以参考我的这篇文章:
  http://heylinux.com/archives/917.html
  其中 第1段 和 第3段 分别讲述了Apache与Subversion的安装与配置方法。
  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.so
  如果没有出现,则需要通过以下方式添加:
  进入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
  删除以下部分内容:
view source print?1if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi2  3echo "Changing revision properties other than svn:log is prohibited" >&2 4exit 1  更改Apache配置文件
  # vim /opt/apache2/conf/extra/httpd-svn.conf
view source print?01 02DAV svn 03SVNListParentPath On 04SVNParentPath /data/svn_repo 05SVNMasterURI http://master.heylinux.com/svn  ##将master.heylinux.com替换为Master服务器的IP地址或域名 06AuthType Basic 07AuthName "Subversion Repository"08AuthUserFile /opt/subversion/conf/svn_passwdfile 09AuthzSVNAccessFile /opt/subversion/conf/svn_accessfile 10Require valid-user 11 12  13 14DAV svn 15SVNListParentPath On 16SVNParentPath /data/svn_repo 17Order deny,allow 18Deny from all 19Allow from 192.168.203.133  ##将192.168.203.133替换为Master服务器的IP地址 20  配置详解:
  首先,在>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
  删除以下部分内容:
view source print?1if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi2  3echo "Changing revision properties other than svn:log is prohibited" >&2 4exit 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
view source print?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
view source print?1#!/bin/sh 2# Post-revprop-change script to replicate revprop-changes to slaves 3  4REV=${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钩子文件中即可。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-639564-1-1.html 上篇帖子: windows 下配置apache +php+mysql 下篇帖子: Web之apache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表