SVN程式碼倉庫主從同步方案
1 背景
由於現在公司產品做大,研發團隊都不是集中統一辦公。例如廣州、長沙、杭州等地區都有一波相應的產品開發團隊,現面臨的問題是產品開發的程式碼是屬於本地自管,導致程式碼分散、程式碼冗餘和程式碼無法共享、更嚴重的影響會導致程式碼丟失等問題。為了方便集中管理好新炬的產品程式碼,保障開發人員的能夠共享式開發,並提升開發團隊開發效率,現在設定研發中心基地在廣州由它作為程式碼倉庫基地來託管各地區產品程式碼。2017年下半年我們對研發中心程式碼倉庫進行改造建設,從單機改造從主備,基地倉庫自動備份、遠端地區程式碼同步倉庫基地和程式碼賬號讀寫許可權集中管控等一列系工作。之前有同事分享過SVN環境搭建,這裡不做重點介紹,今天主要介紹一下SVN主從同步實施。
附:程式碼基地倉庫建設方案
2 目標
為了保障各地區開發人員高效訪問廣州研發中心程式碼庫,已提升開發人員開發效率,同時也為了安全保障程式碼的安全不丟失等多方面問題,這裡採用主備雙機熱備方式來實現程式碼庫高可用。下面為了實現線上同步程式碼和 SVN 賬號到備機,以確保程式碼主庫當機,備機正常接管服務以保障開發人員正常工作。
3 主備同步(程式碼與 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 |
4 賬號同步
目前採用的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部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何從SVN遷移原始碼到Git倉庫原始碼Git
- git 同步fork的倉庫程式碼Git
- MYSQL資料庫主從同步(一主一從)MySql資料庫主從同步
- 一種MySQL主從同步加速方案MySql主從同步
- Git上fork後的程式碼倉庫如何與原倉庫進行同步Git
- [資料庫]MYSQL主從同步資料庫MySql主從同步
- 揭秘MySQL的主從同步實現方案MySql主從同步
- Git同步兩個遠端倉庫的分支程式碼Git
- Linux(centos)搭建SVN倉庫LinuxCentOS
- 在本地搭建 SVN倉庫 和 git 倉庫 (倉庫僅限在本地使用)Git
- 高併發架構系列:資料庫主從同步的3種方案架構資料庫主從同步
- 搭建 mariadb 資料庫主從同步資料庫主從同步
- 使用 SVN 搭建 Composer 私有倉庫
- 使用GitBash從Git遠端倉庫下載程式碼Git
- Github程式碼fork之後,如何與原倉庫進行同步?Github
- 自動同步 Github 倉庫到 Gitee 倉庫GithubGitee
- RocketMQ主從同步MQ主從同步
- Redis主從同步Redis主從同步
- mysql主從同步MySql主從同步
- github同步fork倉庫Github
- git 從遠端倉庫指定分支clone程式碼到本地Git
- redis原始碼分析(一)複習redis命令、持久化方案、主從同步原理、配置Redis原始碼持久化主從同步
- MySQL主從同步配置MySql主從同步
- Mongo主從同步原理Go主從同步
- mysql伺服器主從資料庫同步配置MySql伺服器資料庫
- CentOS7.1下MySQL資料庫主從同步CentOSMySql資料庫主從同步
- Mysql資料庫單向同步(一主兩從)MySql資料庫
- MYSQL 主從庫同步 異常處理彙總MySql
- 物化檢視實現資料庫倉庫主從複製(1)資料庫
- 物化檢視實現資料庫倉庫主從複製(2)資料庫
- redis原始碼分析(一)複習redis命令、持久化方案、主從同步原來、配置Redis原始碼持久化主從同步
- SVN倉庫備份和遷移基本操作
- 建立svn倉庫步驟(創業公司需要)創業
- Linux環境中MySQL主從同步–新增新的從庫LinuxMySql主從同步
- 直播帶貨系統原始碼,實現MYSQL資料庫的主從同步原始碼MySql資料庫主從同步
- 使用程式碼將github倉庫裡某個issue同步到CSDN部落格上Github
- 與遠端倉庫保持同步
- MySQL 資料主從同步MySql主從同步