首页 > 自动化运维 > DevOps > SVN代码仓库主从同步方案
由于现在公司产品做大,研发团队都不是集中统一办公。例如广州、长沙、杭州等地区都有一波相应的产品开发团队,现面临的问题是产品开发的代码是属于本地自管,导致代码分散、代码冗余和代码无法共享、更严重的影响会导致代码丢失等问题。为了方便集中管理好新炬的产品代码,保障开发人员的能够共享式开发,并提升开发团队开发效率,现在设定研发中心基地在广州由它作为代码仓库基地来托管各地区产品代码。2017年下半年我们对研发中心代码仓库进行改造建设,从单机改造从主备,基地仓库自动备份、远程地区代码同步仓库基地和代码账号读写权限集中管控等一列系工作。之前有同事分享过SVN环境搭建,这里不做重点介绍,今天主要介绍一下SVN主从同步实施。
附:代码基地仓库建设方案
为了保障各地区开发人员高效访问广州研发中心代码库,已提升开发人员开发效率,同时也为了安全保障代码的安全不丢失等多方面问题,这里采用主备双机热备方式来实现代码库高可用。下面为了实现在线同步代码和 SVN 账号到备机,以确保代码主库宕机,备机正常接管服务以保障开发人员正常工作。
在这里我们是采用SVN自带的svnsync机制来实现代码主库上面的代码自动同步到代码库(备机)。SVN账号是通过数据同步方式来实现主备同步方式。
1. 在备机开启同步代码钩子
|
# 在备机开启同步代码钩子, cd /home/svn/coderepos/devops/hooks ## 进入当前版本库目录 cp pre-revprop-change.tmpl pre-revprop-change; chown apache:apache pre-revprop-change chmod +x pre-revprop-change
# 修改 pre-revprop-change 内容 echo “Changing revision properties other than svn:log is prohibited” >&2 ## 这行下面修改 exit 0 ( 1 修改为 0 ) 说明如下: 原脚本的意思是如果修改的是 svn:log 属性,将允许修改,返回 0 ;否则,不允许,返回 1 我们要将它改为允许修改所有的属性,在脚本中直接返回 0 |
2. 在备机上执行同步操作
|
# 初始化同步操作 svnsync init file:///home/svn/coderepos/devops/ http://192.168.15.170/svn/devops/ --username yanjiehong --password 123456
file:///home/svn/coderepos/devops/ 代表目标主机仓库(备机仓库) http://192.168.15.170/svn/devops 代表源主机仓库路径 -username --password 使用的是 源 SVN 帐号密码
# 开始同步数据 svnsync sync file:///home/svn/coderepos/devops/ |
3. 定时同步脚本
此脚本是每2分钟自动从主库同步代码到备库,此脚本部署到备机。
|
## autosynccode.sh 自动同步脚本 #!/bin/bash workdir="/opt/sysadmin/svnscritps/src_sync_target" maillist="yanjiehong@shsnc.com" v_time=`date +%Y%m%d` url="svnsync sync file:///reposdata/svn/svnrepos/" check(){ if [ `rpm -qa|grep -q mailx;echo $?` -ne 0 ]; then yum -y install mailx fi if [ `rpm -qa|grep -q postfix;echo $?` -ne 0 ]; then yum -y install postfix fi
echo 1 > $workdir/svnsync.lock for repos_name in `cat $workdir/sync_repos.conf|grep -v '^#'|awk '{print $1}'` do $url$repos_name >>$workdir/src_sync_success.log.$v_time if [ $? -eq 0 ];then echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is success!" >>$workdir/src_sync_success.log.$v_time else echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" >>$workdir/src_sync_error.log.$v_time echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" >>$workdir/src_sync_error.log.$v_time echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!"|mail -s "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" -r svn@root.cn ${maillist} fi done echo 0 > $workdir/svnsync.lock }
if [ $(awk '{print $1}' $workdir/svnsync.lock) != 1 ];then check else exit 0 fi ## 定时任务 ##master170 à slave 171 */1 * * * * /opt/svn/autosynccode.sh |
目前采用的apache+subversion+submin软件实现代码库管理,而SVN账号是通过submin平台管理的,然后SVN账号信息存储在sqlite数据库中,如果只是实现主备代码同步后,还需要实现主备SVN账号同步才能算是完整的主备同步。下面我们采用脚本定时去完成代码主库的表数据同步到代码备库中。
1. 主备互信关系
建立主备互信关系主要是为了下面的数据同步过程中免密码登录
|
1) 、生成密钥文件 A 与 B 机执行: ssh-keygen -t rsa 2 )、公钥文件放入到主机 A 的 /root/.ssh/authorized_keys A 机: cat /root/.ssh/id_rsa.pub >/root/.ssh/authorized_keys A 机: ssh B cat /root/.ssh/id_rsa.pub >>/root/.ssh/authorized_keys A 机: scp B:/root/.ssh/authorized_keys /root/.ssh/ |
2. 数据同步
将相关SVN账号存储的表在代码主库导出,然后导入到代码备库中。每周定时同步一次
|
#!/bin/bash ##################################### #Migrate the submin source library database table to the target database #group_members #password_reset #groups #users #permissions #####################################
dumpdir=/opt/svn DataTime=$(date '+%Y%m%d') SumDir=/home/svn/submin
##Temporarily copy data files scp CodeServer1:$SumDir/authz $SumDir >/dev/null scp CodeServer1:$SumDir/conf/submin.db /tmp/submin.db.$DataTime >/dev/null
##Export source database table sqlite3 /tmp/submin.db.$DataTime ".dump group_members" > $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump password_reset" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump groups" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump users" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump permissions" >> $dumpdir/submin.sql
##delete target database table sqlite3 $SumDir/conf/submin.db "drop table group_members" sqlite3 $SumDir/conf/submin.db "drop table password_reset" sqlite3 $SumDir/conf/submin.db "drop table groups" sqlite3 $SumDir/conf/submin.db "drop table users" sqlite3 $SumDir/conf/submin.db "drop table permissions"
##import target database table sqlite3 $SumDir/conf/submin.db < $dumpdir/submin.sql
##cleanup Temporarily files rm -rf $dumpdir/submin.sql rm -rf /tmp/submin.db.$DataTime |
有需要的朋友可以关注我的公众号,文章每日一更
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28833846/viewspace-2723432/ ,如需转载,请注明出处,否则将追究法律责任。