主页 > Linux | 其他技术 > linux上利用rsync来实现跨服务器间的数据同步和备份

linux上利用rsync来实现跨服务器间的数据同步和备份

2011 年 12 月 27 日 2条评论

今天要用到这个rsync是因为在工作中要用到数据跨服务器调用的问题,我这边的情况是这样子的:我的服务器两台(A,B),原先的的数据都是放在A上面的,之前在A上面安装了SVN的服务器,那么这样子,我们把数据都已版本控制的形式放在svn的版本控制中,那么在windows中获取这些数据就比较简单了,但是现在我们新增了B服务器,想把我们的项目app放到B这个web服务器上面,但是又不装svn服务器,所以我一开始的做法是在B服务器上面安装了svn的客户端,然后去checkout A 服务器上面的svn版本,但是我发现这样子操作,恨死,因为我们开发的人很多,不知道有谁在什么时候提交了,而且都还要人为的去操作,狠不方便。我现在只想实现的是,当我在windows向A的svn服务器提交数据的时候,A服务器会自动的向B服务器同步数据。我知道在svn的办版本库中有个hooks文件夹,这个文件夹里面可以写一些钩子文件。但是我发现在这个里面执行的svn update不能操作到另外一台机器,也就是说只能操作本机器(A)的。不知道用svn来实现这个哪位高人会,求指点?(这里面可以有一种方法:那就是通过脚本去请求:我在钩子里面写一个shell脚本去请求B服务器的一个php文件,然后通过这个文件去执行shell命令。最好是不要用类似于定时执行的例行性任务这种)
后来通过网上找了下,说是可以通过rsync来实现这个功能,经过测试,确实是可以的,把过程记录下:
这里讲实现两个过程:1.让服务器A自动把数据通过不到服务器B(我需要的),2.从服务器B自动从A服务器更新
1:讲服务器A 自动把数据上传到B服务器
首先不管哪台机器,首先要确保rsync这个有安装,可以敲命令:# rsync –version来查看情况,如果没有安装,请自行安装吧
如果安装了,那么就进行如下操作:
a:配置rsyncd.conf
/etc/rsyncd.conf文件的内容(实际上,当我以A向服务器B同步数据时,A是一个客户端,不需要这个配置文件,只需要一个rsyncd.secrets的密码文件就可以了,如果当我是一B座服务器向A服务器更新数据时就需要这个配置文件了)

    uid = nobody
    gid = nobody
    max connections = 5
    read only = true
    #hosts allow = 202.207.177.180
    hosts allow = *
    transfer logging = true
    log format = %h %o %f %l %b
    log file = /var/log/rsyncd.log
    slp refresh = 300
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock

    [dkcore]
    path = /home/web/www
    comment = DKCORE FIRST SERVER
    read only = false
    list = false
    auth users = fbbin
    setrcts file = /etc/rsyncd.secrets   #存放账号密码文件

b:配置密码文件/etc/rsyncd.secrets

binbin  #这是需要验证的密码

c:配置欢迎页面文件/etc/rsyncd.motd(实际上当A直接上传时,这个文件时不需要的,只有当A被当做服务器来请求连接时,才会用到)

Welcome to use the rsync services!

d:配置要上传的目标服务器的的/etc/rsyncd.conf文件
/etc/rsyncd.conf文件的内容

    uid = nobody
    gid = nobody
    max connections = 5
    read only = false
    hosts allow = *
    transfer logging = true
    log format = %h %o %f %l %b
    log file = /var/log/rsyncd.log
    slp refresh = 300
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock

    [dkcore]
    path = /home/web/www
    comment = DKCORE FIRST SERVER
    read only = false
    list = false
    auth users = fbbin
    setrcts file = /etc/rsyncd.secrets   #存放账号密码文件

e:配置密码文件/etc/rsyncd.secrets

fbbin:binbin  #这是需要验证的用户名和密码密码需要在A服务器上面的rsyncd.secrets文件中写好。

f:配置欢迎页面文件/etc/rsyncd.motd

Welcome to use the dkcore

然后我们在B服务器上面启动rsync(我们是要把数据让A服务器自动上传到B服务器)

# rsync --daemon --config=/etc/rsyncd.conf

这个时候我们在A机器中运行一下命令就可以把A机器中/home/dkcore同步到B机器中的dkcore模块也就是/home/web/www中了

# rsync -avzuCP --delete --password-file=/etc/rsyncd.secrets /home/dkcore fbbin@192.168.12.253::dkcore

上面的/home/dkcore是要同步的本地(A)数据地址,后面的IP是同步到的目标ip和用户名以及模块,这些都是在配置文件中定义的!
那么我现在只需要把这个命令写在post-commit文件中就可以了!

======================================================================================
2:让服务器B自己去A上面更新文件
这个时候A就是服务器了,那么只需要把上面B那个配置拿来用可以了,把里面的path改成我要同步的本机地址:/home/dkcore,然后把密码文件改成和上面的B一样的就行了,欢迎文件可要可不要,然后就是B上面的,这个时候B是客户端,配置文件其实可以不用要,只需要个密码文件。此时B不需要启动服务器,但是A就需要启动服务了,命令:

# rsync --daemon --config=/etc/rsyncd.conf

OK,这时我们在B机器上面用如下命令就可以把A上面的指定目录更新到B的机器上面了。

# rsync -vrztopg --delete --password-file=/etc/rsyncd.secrets rsync://fbbin@192.168.12.183/dkcore /home/wwwroot/dkcore

上面的/home/wwwroot/dkcore是把数据更新到的本地物理地址,rsync://fbbin@192.168.12.183/dkcore是指183这台机器(A)上面的dkcore模块更新到本地的/home/wwwroot/dkcore目录中,其中的fbbin是在A机器中的conf文件中配置的。
要是想执行备份的话,那么就可以添加个crontab任务来执行这个命令就OK了!
搞定。。。
参考资料:
1.http://blog.lixiphp.com/solve-rsync-auth-failed-on-module/
2.http://apps.hi.baidu.com/share/detail/16876083

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>