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