自从在第一家公司开始使用版本管理系统SVN之后,就再也离不开了,不管搞个啥都得往SVN上面放,服务器部署更新起来相比于FTP上传那个方便啊。为了访问方便,我的私人SVN库架在了一个客户的服务器上,但是比较郁闷的就在于虽然放在服务器上面,但总还是不放心啊,万一哪天服务器硬盘坏了,这代码库丢失就是大事情了,而且我的这位客户在我把代码库放上去之前硬盘确实坏过一个。
之前一直都是想做一下这个SVN代码库的自动备份的,这个心结今天晚上终于搞掉了。方案跟大家分享一下:
首先,目前共有三台机器参与其中。客户服务器A,目前的代码总库,工作时候的代码签入签出都还是走的这台服务器;自己购买的一台美国VPS虚拟主机B,主力备份;工作&生活笔记本C,候选备份机器。
第一步,在A机器上安装rsync,并配置文件 /etc/rsyncd.conf,参考如下:
uid = nobody gid = nobody use chroot = no max connections = pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [svn] path = /path/to/your/svn/repos comment = my svn repos ignore errors read only = yes list = no auth users = username # 在进行同步服务时使用的用户名 secrets file = /file/to/.rsync.pas # 在该文件中指定用户在同步时需要使用的密码 # 文件内容的格式为 username:pass # 该文件必须权限为 600 # 并且如果是使用sudo来运行rysnc,那么该文件的owner必须为root
然后使用sudo rsync –daemon命令在后台启动rsync服务,到此,离成功已经过半。(配置时您需要删除这些注释)
第二步,在A机器上开启防火墙,让rsync服务能够在其他服务器上进行访问
sudo vim /etc/sysconfig/iptables
仿照你的80端口添加如下行
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
第三步,在B机器上,现在便可以使用下面的命令来进行文件同步了(因显示不下,折为两行,下同):
rsync -vzrtopg --password-file=/***/.rsync.pass --progress --delete username@yourdomain.com::svn /your/svn/repos/backup/path
使用–password-file参数的目的在于将密码保存在B服务器上的某一个文件中,这样就不需要每次都把密码在命令行里面敲了。该文件直接明文保存密码字符串即可。
第三步,在B机器上,设置cron任务,让其每天都同步一次:crontab -u root -e 在vi中加入下面一行:
0 0 * * * rsync -vzrtopg --password-file=/***/.rsync.pass --progress --delete username@yourdomain.com::svn /your/svn/repos/backup/path
最后,在C机器上,因为我的机器是mac,所以编辑~/.profile文件,加入一个命令别名:
alias svn_backup='rsync -vzrtopg --password-file=/***/.rsync.pass --progress --delete username@yourdomain.com::svn /your/svn/repos/backup/path'
这样,每次想在本地机器上再同步一次的时候呢,就可以直接敲svn_backup就把整个SVN代码库同步到本机了。因为已经有了每天能够同步一次的主力备份服务器,在本机就不用备份这么频繁了。同时在本机备份之前,最好确认A、B服务器的备份状态,以防止发生下面的一种情况:A服务器文件系统损坏,目录下文件丢失,导致B服务器在同步的时候也将其目录下的文件删除,这样,在如此极端的情况下,本地还有一份同步备份,虽然该备份可能不是最新的,会有一些版本偏差。
大功告成!洗洗睡觉。