运维相关 · 2012年1月16日 0

rsync主动同步代码

目前项目是由多台机器在提供的,他们的代码都一致,但是我又不想写crontab去定时同步代码,因为万一服务器之间连接稍有故障,负载就会飙升。而且我的代码更新并不会太频繁,所以设计了以下方案:
1.拿一台机器当工作机
2.需要同步代码的前端机器都搭建rsync服务端
3.我同步代码到工作机,执行一个shell脚本,代码同步到前端机

rsync的服务端即前端机配置如下
建立一个/etc/rsyncd.conf文件,内容

uid = root
gid = root
use chroot = no
max connections = 4
strict modes =yes
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

[app]
path = /data/www/xs8.cn/app.xs8.cn/
comment = app.xs8.cn
ignore errors
read only = no
list = yes
secrets file = /etc/rsync.pas
hosts allow = 10.0.0.100
hosts deny = 0.0.0.0/0

[www]
path = /data/www/xs8.cn/www.xs8.cn/
comment = www.xs8.cn
ignore errors
read only = no
list = yes
secrets file = /etc/rsync.pas
hosts allow = 10.0.0.100
hosts deny = 0.0.0.0/0

新建一个/etc/rsync.pas文件,内容为“用户名:密码”

xs8:xs8rsync

可以看到,我的其中一台前端需要提供app和www这两个二级域名的服务
启动前端机的rsync服务/usr/bin/rsync –daemon –config=/etc/rsyncd.conf 可以把这句写进/etc/rc.local

然后在工作机上建立与前端机相同的rsync.pas文件
在来个同步脚本sync_app

find /data/www/xs8.cn/app.xs8.cn/ -name ".svn"|xargs rm -r
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ [email protected]::app
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ [email protected]::app

给予执行权限chmod +x /opt/sbin/sync_app

你可以看到我排除了一些文件不进行同步,这个exclude文件内容如下

exclude.txt
application/cache
application/logs

从需要同步的目录算起,下面哪些不需要同步,写上就行,一行一个文件或者目录

这样,当我更改代码以后,先上传到我的工作机,然后执行/opt/sbin/sync_app就会将代码发布到所有前端提供服务的机器上了