經過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鉤子文件中便可。

相關文章
相關標籤/搜索