rsync+inotify配置

时间 : 14-06-14 栏目 : linux运维 作者 : 老薛 评论 : 0 点击 : 2,364 次

rsync+inotify企业应用案例
 案例描述
这是一个CMS内容发布系统,后端采用负载均衡集群部署方案,有一个负载调度节点和三个服务节点以及一个内容发布节点构成,内容发布节点负责将用户发布的 数据生成静态页面,同时将静态网页传输到三台服务节点,而负载调度节点负责将用户请求根据负载算法调度到相应的服务节点,实现用户访问。用户要求在前端访 问到的网页数据始终是最新的、一致的。
解决方案
为了保证用户访问到的数据一致性和实时性,必须保证三个服务节点与内容发布节点的数据始终是一致的,这就需要通过文件同步工具来实现,这里采用 rsync,同时又要保证数据是实时的,这就需要inotify,即:使用inotify监视内容发布节点文件的变化,如果文件有变动,那么就启动 rsync,将文件实时同步到三个服务节点。
系统环境
这里所有服务器均采用Linux操作系统,系统内核版本与节点信息如表1 所示:
表1

节点名称

内核版本

用途

IP地址

网页数据路径

Lamp1

2.6.18-194.32.1.el5

服务节点

192.168.15.1

/web1/wwwroot

Lamp2

2.6.18-194.32.1.el5

服务节点

192.168.1.203

/web2/wwwroot

Lamp3

2.6.18-194.32.1.el5

服务节点

192.168.15.15

/web3/wwwroot

server

2.6.18-194.32.1.el5

发布节点

192.168.1.63

/web/wwwroot

、安装rsync与inotify-tools
inotify-tools是用来监控文件系统变化的工具,因此必须安装在内容发布节点,服务节点无需安装inotify-tools,另外需要在 web1、web2、web3、webserver节点上安装rsync,由于安装非常简单,这里不在讲述。
在这个案例中,内容发布节点(即server)充当了rsync客户端的角色,而三个服务节点充当了rsync服务器端的角色,整个数据同步的过程,其实就是一个从客户端向服务端推送数据的过程。这点与上面我们讲述的案例刚好相反。
2 、在三个服务节点配置rsync
这里给出三个服务节点的rsync配置文件,以供参考,读者可根据实际情况自行修改。
Web1节点rsyncd.conf配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web1]
path = /web/wwwroot/
comment = web1 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.15.51
hosts deny = *
list = false
uid = root
gid = root
auth users = web1user
secrets file = /etc/web1.pass
Web2节点rsyncd.conf配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web2]
#==by xk====test========#
uid = root
gid = root
use chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[backup-223]
path = /back_222
ignore errors
read only = false
list = false
hosts allow = 192.168.1.63
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#----------------------------#
Web3节点rsyncd.conf配置如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web3]
path = /web3/wwwroot/
comment = web3 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.15.51
hosts deny = *
list = false
uid = root
gid = root
auth users = web3user
secrets file = /etc/web3.pass
在三台服务节点rsyncd.conf文件配置完成后,依次启动rsync守护进程,接着将rsync服务加入到自启动文件中:
echo  “/usr/bin/rsync --daemon” >>/etc/rc.local
到此为止,三个web服务节点已经配置完成。
、配置内容发布节点
配置内容发布节点的主要工作是将生成的静态网页实时的同步到集群中三个服务节点,这个过程可以通过一个shell脚本来完成,脚本内容大致如下:
[root@server  wwwroot]# cat inotifyrsync.sh
#!/bin/bash
host1=192.168.15.1
host2=192.168.1.203
host3=192.168.15.203

src=/web/wwwroot/
dst1=web1
dst2= backup-223   #rsync中认证的模块名
dst3=web3
user1=webuser
user2=rsync_backup #rsync中用于认证的用户
user3=web3user
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib  $src \
| while read files
do
/usr/bin/rsync --exclude=inotifyrsync.sh -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1
/usr/bin/rsync --exclude=inotifyrsync.sh -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user2@$host2::$dst2
/usr/bin/rsync --exclude=inotifyrsync.sh -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user3@$host3::$dst3
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
脚本相关解释如下:
--timefmt:指定时间的输出格式。
--format:指定变化文件的详细信息。
--exclude=inotifyrsync.sh 这个脚本不用同步到其它机器
这两个参数一般配合使用,通过指定输出格式,输出类似与:
[root@lamp-001 wwwroot]# cat /tmp/rsync.log
07/06/11 08:18 /web/wwwroot/test2.htmlCREATE was rsynced
07/06/11 08:18 /web/wwwroot/test2.htmlMODIFY was rsynced
07/06/11 08:45 /web/wwwroot/test3.htmlCREATE was rsynced
07/06/11 08:45 /web/wwwroot/test3.htmlMODIFY was rsynced
07/06/11 08:46 /web/wwwroot/test4.htmlCREATE was rsynced
07/06/11 08:46 /web/wwwroot/test4.htmlMODIFY was rsynced
这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作, 由于这个过程是一种主动触发操作,通过系统内核完成的,所以,比起那些遍历整个目录的扫描方式,效率要高很多。
有时会遇到这样的情况:向inotify监控的目录(这里是/web/wwwroot/)写入一个很大文件时,由于写入这个大文件需要一段时间,此时 inotify就会持续不停的输出该文件被更新的信息,这样就会持续不停的触发rsync去执行同步操作,占用了大量系统资源,那么针对这种情况,最理想 的做法是等待文件写完后再去触发rsync同步。 在这种情况下,可以修改inotify的监控事件,即:“-e close_write,delete,create,attrib”。
接着,将这个脚本命名为inotifyrsync.sh,放到/web/wwwroot目录下,然后给定可执行权限,放到后台运行:
chmod 755 /web/wwwroot/inotifyrsync.sh
/web/wwwroot/inotifyrsync.sh &
#============================================#
[root@pops-1-2 ~]# ps -ef |grep inotify
root     18925  7109  0 03:00 pts/0    00:00:00 sh inotifyrsync.sh
root     18926 18925  0 03:00 pts/0    00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e close_write,moved_to,moved_from,move,move_self,delete,create,attrib /home/xuekun/   #负责监控
root     18927 18925  0 03:00 pts/0    00:00:00 sh inotifyrsync.sh
当客户端文件发生变化,就会再起一个rsync进程,用来同步用。
#============================================#
最后,将此脚本加入系统自启动文件:
echo  “/web/wwwroot/inotifyrsync.sh &”>>/etc/rc.local
这样就完成了内容发布节点的所有配置工作。
说明:当脚本刚刚运行的时候,是没有同步的,必须等源目录发生变化,同步才会进行。这也就正和inotify的机制---当文件有任何变动时,就触发rsync同步。
当rsync客户端有大量文件生成或者删除,inotify检测到,可以立即同步到rsync服务端,将已进行的操作打出日志—以备将来查询用。

注意:-e modify,delete,create,attrib 在用这种模式的时候,当你用mv命令对rsync客户端目录进行操作时,不会触发inotify的监测机制。

除非注明,文章均为( 老薛 )原创,转载请保留链接: http://www.bdkyr.com/xtyw002/142.html

rsync+inotify配置:等您坐沙发呢!

发表评论

0 + 6 = ?


博主微信号,很高兴为您提供帮助

随便看看

0