【ACCESS精品源码栏目提醒】:网学会员在ACCESS精品源码频道为大家收集整理了“SVN主从服务(SVNSYNC镜像模式)设置说明 - 其它资料“提供大家参考,希望对大家有所帮助!
SVN 主从服务(SVNSYNC 镜像模式)设置说明 赵青风 2012-12-21 公司的 SVN 相关状况如下: A)SVN 服务器在美国机房,软件发版服务器在美国机房; ,一些国外同 B)公司的主要开发人员分别在青岛(联通宽带)和广州(电信宽带) 事有少量的 SVN 访问; C)SVN
源码库中同时存放大量的图片等美术资源文件。
在日常开发活动中,大量的代码更新活动会因为网络速度慢和资源文件大而耗费较多的等待时间。
为提高日常开发效率,决定分别在青岛和广州设置 SVN 服务。
为避免主从一致性维护的风险成本,设置青岛和广州的 SVN 服务为只读镜像服务模式。
即终端在提交时连接主服务,在同步时连接从服务。
具体设置说明如下:一、主库设置 常规设置,简单样例(linux 系统环境)如下:1 创建版本库 mkdir -p/dir/data svnadmin create /dir/data/projectname2 配置帐号密码 passwd.conf 文件内容:usersusernamepasswordsyncnamesyncpass3 配置权限 authz.conf 文件内容:groupsg_userusernamenetwork:/g_userrwsyncnamer4 SVN 服务配置文件 svnserve.conf 文件内容:generalanon-accessnoneauth-readwritepassword-db/dir/passwd.confauthz-db/dir/authz.confrealmdomainxxx5 开启服务 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 文件内容:usersusernamepasswordsyncnamesyncpass 为使客户端透明工作,帐号密码应当与主服务一致 不在从库覆盖区域内的帐号可以删除,如国外同事的帐号不需要在从库上设置3 配置权限 authz.conf 文件内容:groupsg_userusernamenetwork:/g_userrsyncnamerw 为使客户端透明工作,帐号权限应当与主服务一致 镜像服务器是只读模式,应当在从库上去掉所有的写权限4 SVN 服务配置文件 svnserve.conf 文件内容:generalanon-accessnoneauth-readwritepassword-db/dir/passwd.confauthz-db/dir/authz.confrealmdomainxxx 同主库一致,版本库绝对路径可以不同,相对路径必须相同5 开启服务 svnserve -r /dir/data/ --config-file /dir/svnserve.conf -d 此时访问 SVN 版本库的路径为:http://slaveip:slaveport/svn/projectname三、主从设置及同步1 增加同步专用 SVN 帐号 该帐号在主服务器版本库端只读权限即可,在从服务器版本库端具有读写权限 一般在主从库上设置相同的帐号和密码,如 synname2 拷贝版本库的 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 此步骤在从库创建之后,服务开启之前执行 每一个版本库都应当提供此 hook4 初始化从库与主库的对应关系svnsync init --non-interactive --source-username syncname --source-passwordsyncpass --sync-username syncname --sync-passwordsyncpassfile:///dir/data/projectname svn://svn.domain.com/projectname 此步骤在从库服务开启之后执行,注意只执行一次,一般执行结果如下:Copied properties for revision 0.5 日常同步从库svnsync sync --non-interactive --source-username syncname --source-passwordsyncpass --sync-username syncname --sync-password syncpassfile:///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 文件内容:REPOS1REV2DATEdate Y-m-d_H:M:Ssvnsync-master-update.shREPOS REV DATE 真正的通知更新过程就可以在“svnsync-mirror-update.sh”脚本中执行了3 主从服务帐号权限的同步维护 主服务器进行的所有权限、帐号、版本库相关的工作,在从库上同时执行 基于网络部原来的方式,可以用 puppet 统一管理4 终端用户的工作方式 目前的模式是数据提交都到主服务器,数据同步都到从服务器 目前主服务器对外公开域名,当要连接从服务器时,手动设置 host 域名到从服务器 IP 内容为:x.x.x.x svn.domain.com Windows 操作系统下 hosts 文件位置: C:WindowsSystem32driversetchosts 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 可参见 http://www.svnspot.com/svn/svnconf/27594_1.html 但我们更多的是要 slave,实时同步,所以用 svn 自己的镜像工具好些 mirror-slave5 本地容灾 建立从库是为了加快同步速度,如果从库有故障是否有快捷、低成本的容灾恢复手段? 从头开始同步有可能耗费相当长的时间,如果在系统中建立另外的实时 mirror(更换版本库名称,但不对外提供权限),这样只要不是硬盘故障,随时都可以恢复到最后一次同步的状态,也许挺方便,这种模式本身也适合主服务器的本地容灾备份。
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://svn.domain.com/projectname B)设置新路径svn propset svn:sync-from-url --revprop -r 0 svn://newdomain/projectnamefile:///dir/data/projectname3 同步过程出错 由于网络等原因造成的同步出错,需要具体排查解决4 系统异常出错 由于断电、硬盘故障等原因造成的从库服务出错,需要具体排查解决5 同步不到数据 如果在主服务配置中设置了 anon-accessread 而非 anon-accessnone,svnsync 只同步了状态属性,但不同步原始数据,具体原因未详细排查七、参考链接1 http://www.iusesvn.com/bbs/tag.phpnamesvnsync2 http://blog.csdn.net/liuzhigang1237/article/details/70645613 http://wowking.blog.51cto.com/blog/1638252/8475104 http://zengrong.net/post/1598.htm5 http://blog.chinaunix.net/uid-22646981-id-3084472.html6 http://www.cnblogs.com/vegaliming/archive/2012/05/01/2478351.html