标签为 Subversion 的文章

利用hotcopy与svnsync实现SVN镜像的快速搭建

背景/需求:
在我的上一篇文章中,我详细介绍了如何实现SVN主从架构的方法;
但在实际的应用环境中,却面临着另一个难题,现有的主SVN服务器上的数据量太大,超过10G以上,而svnsync却需要先初始化一个空库,然后再从0开始一直同步到相同的版本;
而主从服务器之间存在的网络状况并不理想,因此需要耗费非常多的时间且很可能出现同步中断等不稳定的情况。

方案/设计:
转换一种思路,试想MySQL的复制过程与svnsync非常相似,但是MySQL就可以通过初次导入完整库的数据,然后再指定其Position的值来实现增量同步,从而完成整个主从的搭建;
那么,我们也可以试着用这样的方式来操作svnsync,通过hotcopy将整个SVN主库完整备份下来,再压缩打包后传送到从服务器上,解开之后,修改相关的配置文件使svnsync认为从服务器上的库已经是经过了初始化并同步过的,从而实现增量同步,快速完成整个主从的搭建。

配置过程:
1. 通过hotcopy将SVN主库进行一次完整备份 - Master
注:以下操作需要在Master上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin hotcopy project1 /opt/backups/project1

# cd /opt/backups/
# tar cjvf project1-master.tar.bz2 project1/

2. 将备份文件传送到从服务器上 - Master

3. 在从服务器上创建一个空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin create project1

# chown -R apache:apache project1/
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

4. 在主服务器上通过svnsync初始化仓库 - Master
注:以下操作需要在Master上进行
# /opt/subversion/bin/svnsync init http://slave.heylinux.com/svn-proxy-sync/project1 file:///data/svn_repo/project1

5. 在从服务器上备份初始化过后的空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# mv project1 /opt/backups/

6. 解压从主服务器过来的完整备份文件,并进行“调包”的过程 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo
# tar xjvf /opt/backups/project1-master.tar.bz2

替换钩子文件
# cd project1/hooks
# cp -p /opt/backups/project1/hooks/pre-revprop-change .

替换uuid
# cd ../db/
# cp -p /opt/backups/project1/db/uuid .

替换初始版本日志
# cd revprops/0/
# cp -p /opt/backups/project1/db/revprops/0/0 .

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

6.复制sync-last-merged-rev(最后一次同步)版本号 - Master
注:以下操作需要在Master上进行
获取当前版本号,例如:40482
# cat /data/svn_repo/project1/db/current

将当前版本号复制到从服务器
# /opt/subversion/bin/svn propset --revprop -r0 svn:sync-last-merged-rev 40482 http://slave.heylinux.com/svn-proxy-sync/project1

执行一次同步
# /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1

7. 镜像搭建完成

8. 经验总结
通过上面的“调包”操作,svnsync成功的被我们“欺骗”了,可以直接在完整库的基础上利用svnsync进行增量同步了;
这样就不必傻乎乎的非得等svnsync从0开始同步到目前的版本,这种思路也可以用于今后SVN服务器Crash的情况以及修复主从同步。

贴一些报错信息方便搜索引擎定位:
svnsync: Destination HEAD (40482) is not the last merged revision (0); have you committed to the destination without using svnsync?
svnsync: Destination repository has not been initialized.
svnsync: Error setting property 'sync-lock':could not remove a property.
svnsync: DAV request failed;

No Comments

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

参考资料:
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类似的一主多从的架构。
如下图所示:

安装与配置:

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
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

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

<Location /svn>
DAV svn
SVNListParentPath On
SVNParentPath /data/svn_repo
SVNMasterURI http://master.heylinux.com/svn  ##将master.heylinux.com替换为Master服务器的IP地址或域名
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /opt/subversion/conf/svn_passwdfile
AuthzSVNAccessFile /opt/subversion/conf/svn_accessfile
Require valid-user
</Location>

<Location /svn-proxy-sync>
DAV svn
SVNListParentPath On
SVNParentPath /data/svn_repo
Order deny,allow
Deny from all
Allow from 192.168.203.133  ##将192.168.203.133替换为Master服务器的IP地址
</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
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
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

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

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

#!/bin/sh
# Post-revprop-change script to replicate revprop-changes to slaves

REV=${2}
/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钩子文件中即可。

,

11 Comments

让SVN用户能够修改自身密码的PHP页面

在苦苦搜寻和反复实践之后,终于成功了,虽然该php程序的原作者已经无从知晓,但仍然要表示感谢,同时鄙视那些不经过实践就把文章转来转去的人。
因为那样做除了增加点可怜的PV,根本帮助不了任何人,只会浪费他人的时间。

源码安装SVN的过程请参考我的这篇文章:http://heylinux.com/archives/917.html

1.修改Apache配置文件
因为我在安装和配置SVN的时候,对Apache的配置文件进行过优化,将所有关于SVN的配置都写在了/opt/apache2/conf/extra/httpd-svn.conf中,然后再通过主配置文件/opt/apache2/conf/httpd.conf中Include conf/extra/httpd-svn.conf方式来调用。
因此,我这里需要修改的就是/opt/apache2/conf/extra/httpd-svn.conf文件,加入以下内容(其中第1,2,6行请根据实际情况进行修改):

Alias /svntools "/opt/apache2/htdocs/svntools"
<Directory "/opt/apache2/htdocs/svntools">
Require valid-user
AuthType Basic
AuthName "GridTeam`s subversion tools"
AuthUserFile "/opt/subversion/conf/svn_passwdfile"
</Directory>

2.创建修改自身密码的php页面
mkdir /opt/apache2/htdocs/svntools
cd /opt/apache2/htdocs/svntools

vim svnpass.php
输入以下内容(其中第135,136行请根据实际情况进行修改):
阅读全文 »

,

2 Comments

Subversion+svnmanager结合Apache+Mysql+Php的源码安装与配置实践

Subversion作为目前最流行的版本控制软件,得到了广泛的应用。但是单独直接使用Subversion的话,在安全性和易用性上都存在问题,比如 明文密码 和 账号与权限树的管理 等方面。因此,目前一般通过svnmanager来解决易用性问题(图形化界面),通过结合apache来解决安全性问题(账号的加密以及对SSL传输的支持)。

下面,是我对 Subversion+svnmanager结合Apache+Mysql+Php的源码安装与配置实践 进行的总结,按照下面的步骤,就可以完成整个过程。并且由于是源码安装与配置,因此可以支持所有的Linux平台,希望能对大家有所帮助。

1.安装配置apache
wget http://apache.etoak.com//httpd/httpd-2.2.18.tar.bz2

tar xjvf httpd-2.2.18.tar.bz2

cd httpd-2.2.18
./configure --prefix=/opt/apache2 --enable-so --enable-dav --enable-dav-fs --enable-maintainer-mode --with-included-apr --enable-rewrite --enable-ssl --enable-proxy --enable-proxy-http

--enable-so 开启动态库支持,svn要求apache必须启用so
--enable-dav --enable-dav-fs 是支持svn认证使用的
--enable-maintainer-mode 开启调试模式
--with-included-apr 使用内置的apr
--enable-rewrite 开启rewrite
--enable-ssl 开启SSL
--enable-proxy 开启proxy支持
--enable-proxy-http 开启proxy http支持

make
make install

创建apache用户
useradd -M apache

修改apache配置文件,让它以用户apache身份运行
vi /opt/apache2/conf/httpd.conf
============================
User apache
Group apache
============================
阅读全文 »

,

7 Comments

分分钟搞定Subversion在Linux上的安装与配置

Subversion作为目前最优秀的开源版本控制系统,已经替代CVS成为了使用范围最广的软件。
关于Subversion的安装与配置也有很多方式,结合apache、ldap、mysql等软件,可以实现更强大的功能。但本文的目的是对Subversion本身独立的安装与配置进行讲解,使大家能够快速的上手,分分钟搞定,真不是什么难事。

1.安装Subversion
目前各大发行版本都有了subversion的二进制版本,因此推荐采用该方式进行安装。
RHEL/SELS:
rpm -ivh subversion-*

CentOS:
yum install mod_dav_svn subversion

Ubuntu:
apt-get install subversion

2.创建Subversion代码库的根目录
mkdir -p /data/svn_repo

3.启动Subversion服务
svnserve -d -T -r /data/svn_repo

将Subversion服务设置为开机自启动
echo "svnserve -d -T -r /data/svn_repo" >> /etc/rc.local

4.创建project1代码库
svnadmin create /data/svn_repo/project1

5.配置project1代码库基础配置文件
注意:每一行的配置前后都不要留空格。
cd /data/svn_repo/project1/conf
vim svnserve.conf

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

6.配置project1代码库的用户账号
vim passwd

[users]
jack = imjack
tom = tomhere
mary = marygirl
mick = micklee

7.配置project1代码库的用户组以及目录访问权限
vim authz

[groups]
g_manager = jack
g_coder = tom
g_hr = mary
g_vip = jack,tom,mary

[project1:/]
@g_manager = rw
* = r

[project1:/code]
@g_manager = rw
@g_coder = rw
@g_vip = rw
* =

[project1:/code/source]
@g_manager = rw
@g_coder = rw
* =

[project1:/hr]
@g_manager = rw
@g_hr = rw
* =

[project1:/temp]
* = rw

相关注解如下:
以上配置文件中的权限设置如下,具体内容请根据实际情况进行设置
project1 /管理层(可读写)其他(可读)
|— /code 管理层、程序员、特殊权限组(可读写)其他(无权限)
| |— /code/source 管理层、程序员(可读写)其他(无权限)
|— /hr 管理层、人力资源组(可读写)其他(无权限)
|— /temp 所有人(可读写)

8.使project1代码库的authz文件支持中文
将配置文件authz转换成 “不包含 BOM 的 UTF-8 格式”之后,Subversion 就能够正确识别文件中的中文字符了,可以转换的工具软件有 Notepad++ 与 UltraEdit。

9.Subversion客户端的使用
在Windows平台上推荐使用TortoiseSVN作为客户端。
在安装好该客户端软件以后,执行“SVN检出” project1代码库(假设服务器IP为192.168.10.4):svn://192.168.10.4/project1
在提示框中输入用户名与密码,即可上传与下载代码及文件了。

No Comments