Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317758
  • 博文数量: 90
  • 博客积分: 2850
  • 博客等级: 少校
  • 技术积分: 951
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-02 14:01
文章分类

全部博文(90)

文章存档

2015年(1)

2014年(1)

2013年(2)

2011年(3)

2010年(83)

分类: LINUX

2010-10-18 17:13:35

rsync+inotify实现目录实时同步

文章分类:操作系统
最近做的项目需要把生成的静态页面同步到静态页面服务器上,采用rsync+inotify实现目录实时同步当然就成了很好的方式了。

环境:ubuntu-9.01 或者 linux 5.4

生成静态页面的机器作为客户端采用上传的方式,地址为:192.168.18.12
静态页面服务器作为服务器端,地址为:192.168.18.14

同步目录为:/usr/ROOT
rysnc的下载地址为:目前最新的版本为:3.0.7

inotify下载地址为:最新版本为:3.13


服务器端安装:

tar -zxvf rsync-3.0.7.tar.gz

./configure --prefix=/usr/local/rsync --指定安装目录

make

make install


配置:

1、vi /etc/rsyncd.conf

motd file=/etc/rsyncd.conf

read only=no ----因为是上传所以这里一定要可写

list=yes

uid=root
gid=root
hosts allow=192.168.18.12 ---允许连接ip

host deny=19.168.18.100

max connections=2 ----允许最大连接

log file=/var/log/rsyncd.log

pid file=/var/run/rsyncd.pid

lock file=/var/run/rsync.lock


模块

[web]

comment=from 192.168.18.12

path=/usr/ROOT

auth users=allen

secrets file=/etc/rsync.pass ----密码文件

2、vi /etc/rsyncd.motd

welcome to use rsync server!

3、vi /etc/rsync.pass
allen:123456

给密码文件赋权:chmod 400 /etc/rsync.pass

4、vi /etc/services
在最后加入:
rsync 873/tcp
rsync 873/udp

5、vi /etc/xinetd.d/rsync

service{

disable=no

socket_type=staream

wait=no

user=root

server=/usr/local/rsync/bin/rsync

server_args=--daemon

log_on_failure+=USERID
}

6、到这里配置完成,启动:/usr/local/rsync/bin/rsync --daemon

ps -aux | grep rsync 查看是否启动成功!

使用IPTABLES开启873端口的步骤,貌似有点问题。
Rsync是用到UDP数据包的,所以还要打开UDP的包,另外我使用-A参数的时候配置无效,客户端连接服务器没有响应,使用-I参数后就好了。
下面是我使用的命令:
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
iptables -I INPUT -p udp -m state --state NEW -m udp --dport 873 -j ACCEPT


客户端安装:

tar -zxvf rsync-3.0.7.tar.gz

cd rsync-3.0.7

./configure --prefix=/usr/local/rsync --指定安装目录

make

make install

客户端只需安装,无需配置,建个密码文件

vi /etc/rsync-client.pass

123456

赋权:chmod 600 /etc/rsync-client.pass


rsync的上传和下载命令:

cd /usr/local/rsync/bin

下载命令:
./rsync -vzrtopg --progress --delete allen@192.168.18.14::web /usr/ROOT

上传命令:
./rsync -vzrtopg --progress --delete /usr/ROOT allen@192.168.18.14::web

在加上定时执行,就可以定时同步文件了。若需要实时同步则需要用inotify,安装之前需查看系统内核:uname -a
只能在高于2.6.13版本的系统上安装,以下的需要安装补丁。

inotify安装:inotify-tool-3.13

tar -zxvf inotify-tool-3.13
cd inotify-tool-3.13
./configure
make
make install

建个执行文件:rsync.sh
#!/bin/sh
src=/usr/ROOT
/usr/local/bin/inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T%w%f' \
-e modify,delete,move,create,attrib \
${src}\
|while read file
do
rsync -vartopg --progress –delete –password-file=/etc/rsync-client.pass /usr/ROOT/ allen@192.168.18.14::web
echo "success!"
done
这样就能检测到是否有静态页面的生成或修改、删除而进行自动同步,实现实时同步。


其实服务端不用配置的,如果你不是定时运行的,rsync.conf 者不用配置,
可以如下
rsync -vzrtopg --delete  -e ssh root@192.168.1.7:/home/test/ /home/backupl/
或者
rsync -vzrtopg --delete  -e ftp ftpuser@192.168.1.7:/home/test/ /home/backupl/


--------------------可能出现的错误解惑
1、@ERROR: Unknown module 'web'
rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]
这是因为服务器端hosts allow 没有允许该主机访问

2、@ERROR: auth failed on module web
rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]
检查一下用户名是否正确,
服务器端rysnc.pass(用户:密码)<用户必须是系统用户,密码尽量不要为系统用户密码>
客户端rsync-client.pass(密码)<服务器端密码>
注意:auth users=allen 这里不能有空格,上次这个问题把我找惨了。

3、@ERROR: secrets file must not be other-accessible
这是客户端的密码文件需要设置成600权限

chmod 600 rsync-client.pass



Rsync同步常见问题

今天碰到这样一个问题,在rsync同步的时候一直报错,报错内容如下:

@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)

 

最后原因终于找到了。因为有两个网段都需要同步该文件夹内容,所以有人更改了配置文件,并没有在

hosts allow 后面添加另一个IP段,而是另外添加一个配置如下:

[www]
path = /data/cms/webapp
hosts allow = 192.168.1.0/24

auth users = webapp
secrets file = /etc/app.pass


#[www]
#path = /data/cms/webapp
#hosts allow = 192.168.2.0/24
#auth users = webapp
#secrets file = /etc/app.pass

这样更改后导致前一段配置(也就是没有#号的一段)没有生效,服务器就只允许192.168.2.0网段同步。

 

解决方法如下:

将后一段注释或者直接删掉,在上一段的 hosts allow 后添加192.168.2.0 网段,结果如下

[www]
path = /data/cms/webapp
hosts allow = 192.168.1.0/24 192.168.2.0/24

auth users = webapp
secrets file = /etc/app.pass

 

重新启动rsync服务,问题解决。

 

 

网上总结rsync报错信息:

Rsync同步常见问题:
错误一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
解决:这是因为密码设置错了,无法登入成功,检查一下rsync.pwd,看客服是否匹配。还有服务器端没启动rsync 服务也会出现这种情况。
错误二:
password file must not be other-accessible
continuing without password file
Password:
解决:这是因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd
错误三:
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
解决:这是因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步。
错误四:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
解决:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的873端口打开。

还可以参考

https://www.deleak.com/blog/tag/rsync/

阅读(1352) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-19 16:25:16

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com