资源描述
SVN主从服务(SVNSYNC镜像模式)设置说明
赵青风
2012-12-21
公司的SVN相关状况如下:
A)SVN服务器在美国机房,软件发版服务器在美国机房;
B)公司的主要开发人员分别在青岛(联通宽带)和广州(电信宽带),一些国外同事有少量的SVN访问;
C)SVN源码库中同时存放大量的图片等美术资源文件。
在日常开发活动中,大量的代码更新活动会因为网络速度慢和资源文件大而耗费较多的等待时间。为提高日常开发效率,决定分别在青岛和广州设置SVN服务。
为避免主从一致性维护的风险成本,设置青岛和广州的SVN服务为只读镜像服务模式。即终端在提交时连接主服务,在同步时连接从服务。具体设置说明如下:
一、主库设置
常规设置,简单样例(linux系统环境)如下:
1 创建版本库
mkdir -p /dir/data
svnadmin create /dir/data/projectname
2 配置帐号密码
passwd.conf文件内容:
[users]
username=password
syncname=syncpass
3 配置权限
authz.conf文件内容:
[groups]
g_user=username
[network:/]
@g_user=rw
syncname=r
4 SVN服务配置文件
svnserve.conf文件内容:
[general]
anon-access=none
auth-read=write
password-db=/dir/passwd.conf
authz-db=/dir/authz.conf
realm=domainxxx
5 开启服务
svnserve -r /dir/data/ --config-file /dir/svnserve.conf -d
此时访问SVN版本库的路径为: svn://masterip:masterport/projectname
二、从库设置
应当保证操作系统、服务软件等版本与主服务器完全一致,以方便故障排错,样例如下:
1 创建版本库
mkdir -p /dir/data
svnadmin create /dir/data/projectname
为使客户端透明工作,源码库名称(projectname)应当与主服务一致
2 配置帐号密码
passwd.conf文件内容:
[users]
username=password
syncname=syncpass
为使客户端透明工作,帐号密码应当与主服务一致
不在从库覆盖区域内的帐号可以删除,如国外同事的帐号不需要在从库上设置
3 配置权限
authz.conf文件内容:
[groups]
g_user=username
[network:/]
@g_user=r
syncname=rw
为使客户端透明工作,帐号权限应当与主服务一致
镜像服务器是只读模式,应当在从库上去掉所有的写权限
4 SVN服务配置文件
svnserve.conf文件内容:
[general]
anon-access=none
auth-read=write
password-db=/dir/passwd.conf
authz-db=/dir/authz.conf
realm=domainxxx
同主库一致,版本库绝对路径可以不同,相对路径必须相同
5 开启服务
svnserve -r /dir/data/ --config-file /dir/svnserve.conf -d
此时访问SVN版本库的路径为: http://slaveip:slaveport/svn/projectname
三、主从设置及同步
1 增加同步专用SVN帐号
该帐号在主服务器版本库端只读权限即可,在从服务器版本库端具有读写权限
一般在主从库上设置相同的帐号和密码,如synname
2 拷贝版本库的uuid文件到从库
文件名:/dir/data/projectname/db/uuid
此步骤在从库创建之后,服务开启之前执行
每一个版本库的uuid都应当拷贝
3 更换从库的修订版本属性hook
文件名(内容为空即可):/dir/data/projectname/hooks/pre-revprop-change
touch /dir/data/projectname/hooks/pre-revprop-change
注意应当提供可执行权限
chmod +x /dir/data/projectname/hooks/pre-revprop-change
此步骤在从库创建之后,服务开启之前执行
每一个版本库都应当提供此hook
4 初始化从库与主库的对应关系
svnsync init --non-interactive --source-username syncname --source-password syncpass --sync-username syncname --sync-password syncpass file:///dir/data/projectname svn://
此步骤在从库服务开启之后执行,注意只执行一次,一般执行结果如下:
Copied properties for revision 0.
5 日常同步从库
svnsync sync --non-interactive --source-username syncname --source-password syncpass --sync-username syncname --sync-password syncpass file:///dir/data/projectname
此步骤在初始化之后日常重复执行,一般执行结果如下:
Transmitting file data .
Committed revision 4312.
Copied properties for revision 4312.
Transmitting file data ..
Committed revision 4313.
Copied properties for revision 4313.
如果没有新版本需要同步,则此命令会正常结束并且无任何输出
四、 相关辅助工作
1 同步周期策略
A)更新触发同步
实现稍复杂,需要在主服务端的每个版本库上设置post-commit的hook
主从库版本一致性较好,为实现远程跨网络的自动同步,还需要其他辅助工作
可以区别对待各个版本库的同步
B)定时触发同步
实现较简单,在从服务端设置crond策略,间隔一段时间进行从库同步
间隔时间过长容易造成版本更新延迟,会造成客户端版本不一致更新失败
间隔时间过短容易造成网络或者服务器压力过大
总体来说,在辅助工作不到位前用定时触发比较可行,之后转为更新触发
2 设置主版本库的更新hook
文件名:touch /dir/data/projectname/hooks/post-commit
注意应当提供可执行权限
chmod +x /dir/data/projectname/hooks/post-commit
post-commit文件内容:
REPOS="$1"
REV="$2"
DATE=`date +%Y-%m-%d_%H:%M:%S`
svnsync-master-update.sh "$REPOS" "$REV" "$DATE"
真正的通知更新过程就可以在“svnsync-mirror-update.sh”脚本中执行了
3 主从服务帐号权限的同步维护
主服务器进行的所有权限、帐号、版本库相关的工作,在从库上同时执行
基于网络部原来的方式,可以用puppet统一管理
4 终端用户的工作方式
目前的模式是数据提交都到主服务器,数据同步都到从服务器
目前主服务器对外公开域名,当要连接从服务器时,手动设置host域名到从服务器IP
内容为:x.x.x.x
Windows操作系统下hosts文件位置: C:\Windows\System32\drivers\etc\hosts
Linux操作系统下hosts文件位置: /etc/hosts
五、 若干问题的探讨
1 数据安全
SVN源码库本身是核心资产,普通用户是按照权限进行访问,但从服务器的设置将提供另外的全部数据泄漏风险,因此次服务器的数据安全异常重要,建议几种措施如下:
A)设置单独的物理主机(而不是用虚拟机),以防止权限控制不当而出现虚拟机拷贝
B)操作系统权限严格控制,只有授权的管理员可以使用
C)其他常见的网络安全防范
D)关闭其他系统服务
2通知更新过程
A) 通过SSH直接触发
ssh x.x.x.x "/dir/svnsync-mirror-update.sh"
如果是帐号密码模式,可以在shell下用expect命令进行交互
如果是证书模式,证书密码可以为空,则可以直接执行远程脚本:
用ssh-keygen生成/root/.ssh/目录下id_rsa 和 id_rsa.pub两个密钥文件
将id_rsa.pub文件内容追加到服务器的/root/.ssh/authorized_keys文件中
B) 通过应用程序触发
如WEBSERVICE的事件通知
可以通过pptpvpn或者openvpn将master和mirror连接到一个网络中
3 服务状态日常监控
采用网络部常用的监控模式,在主服务器、从服务器、各个hook处、各个脚本处都可以添加相应的状态监控信息
4 Rsync方法
svnsync太慢?rsync更方便?rsync更适合文件同步,对于svn来说,它更适合backup
可参见
但我们更多的是要slave,实时同步,所以用svn自己的镜像工具好些mirror->slave
5 本地容灾
建立从库是为了加快同步速度,如果从库有故障是否有快捷、低成本的容灾恢复手段?
从头开始同步有可能耗费相当长的时间,如果在系统中建立另外的实时mirror(更换版本库名称,但不对外提供权限),这样只要不是硬盘故障,随时都可以恢复到最后一次同步的状态,也许挺方便,这种模式本身也适合主服务器的本地容灾备份。
6 版本一致性
终端所有的提交操作都只在主服务器上完成,这样主服务器永远不会有版本一致性冲突。
7 多slave
重复部署slave即可,没有特别要求。
六、可能的问题
1 从库锁定
在从库同步过程中,如果有新代码在主库提交,有可能造成从库锁定,需要对从库解锁
如果同步过程被中断,也会造成从库锁定。
解锁命令如下:
svn propdel svn:sync-lock --revprop -r 0 file:///dir/data/projectname
2 主库url变更
A)查看原始路径
svn propget svn:sync-from-url --revprop -r 0 file:///dir/data/projectname
执行结果 svn://
B)设置新路径
svn propset svn:sync-from-url --revprop -r 0 svn://newdomain/projectname file:///dir/data/projectname
3 同步过程出错
由于网络等原因造成的同步出错,需要具体排查解决
4 系统异常出错
由于断电、硬盘故障等原因造成的从库服务出错,需要具体排查解决
5 同步不到数据
如果在主服务配置中设置了anon-access=read 而非anon-access=none,svnsync只同步了状态属性,但不同步原始数据,具体原因未详细排查
七、参考链接
1
2
3
4
5
6
展开阅读全文