项目中用rsync实现文件同步,但是在实时性方面不如inotify+rsync,下面就来实验下吧。
inotify从内核2.6.13版本中开始引入的一个新功能,因此我们首先需要看下我们的linux是否支持inotify。
[root@usvr-126 test]# uname -r
2.6.32-431.el6.x86_64
[root@usvr-126 test]# ll /proc/sys/fs/inotify/*
-rw-r--r-- 1 root root 0 1月 5 16:00 /proc/sys/fs/inotify/max_queued_events
-rw-r--r-- 1 root root 0 1月 5 16:00 /proc/sys/fs/inotify/max_user_instances
-rw-r--r-- 1 root root 0 1月 5 16:00 /proc/sys/fs/inotify/max_user_watches
[root@usvr-126 test]#
/proc/sys/fs/inotify/max_queued_events
默认值: 16384
该文件中的值为调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值得事件被丢弃,但会触发IN_Q_OVERFLOW事件
/proc/sys/fs/inotify/max_user_instances
默认值: 128
指定了每一个real user ID可创建的inotify instatnces的数量上限
/proc/sys/fs/inotify/max_user_watches
默认值: 8192
指定了每个inotify instance相关联的watches的上限,也就是每一个inotify实例可监控的最大目录数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。
注意:
1.
max_queued_events 是 Inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大!如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用
下面来介绍下实验:
rsync服务器端:
192.168.3.123 目录:/opt/test
192.168.3.124 目录:/opt/test
rsync客户端+inotify
192.168.3.126 目录:/opt/test
实验描述:126服务器端监控/opt/test,若文件有创建,删除,修改,移动等事件发生,则会用rsync自动向123,124服务器的/opt/test目录同步。
一.先在123,124上安装rsync并配置,两台机器一样配置即可。
1.配置rsync服务
[root@usvr-124 src]# cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.3.126
hosts deny = *
auth users = rsync_backup
secrets file = /etc/rsync.password
[web]
comment = test
path = /opt/test
2.创建相关认证及权限。
echo "rsync_backup:cityhouse" > /etc/rsync.password
chmod 600 /etc/rsync.password
3.创建同步目录
mkdir -p /opt/test
4.启动rsync服务。
rsync --daemon
注:uid和gid最好设置成www,因为我们是给web服务器使用,不要忘记设置/opt/test的属主和属组,如:chown -R www.www /opt/test
二.在126上配置rsync客户端。
1.配置rsync相关
echo "cityhouse" > /etc/rsync.password
chmod 600 /etc/rsync.password
mkdir -p /opt/test
2.测试和rsync服务端的同步,只有rsync同步没有问题了,inotify才能和rsync正常运行。
rsync -avzP --delete /opt/test/ rsync_backup@192.168.3.123::web/ --password-file=/etc/rsync.password
rsync -avzP --delete /opt/test/ rsync_backup@192.168.3.124::web/ --password-file=/etc/rsync.password
ok,确认同步成功后可以配置inotify了
三.126上配置inotify
[root@usvr-126 src]wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@usvr-126 src]tar -zxvf inotify-tools-3.13.tar.gz
[root@usvr-126 inotify-tools-3.13]cd /usr/local/src/inotify-tools-3.13
[root@usvr-126 inotify-tools-3.13]./configure
[root@usvr-126 inotify-tools-3.13]make && make install
配置完毕后,我们利用inotify监控126上的/opt/test目录,一旦有close_write,modify,delete,create,attrib,move事件发生,则会触发rsync同步,脚本(参照别人的脚本)如下:
[root@usvr-126 opt]# cat auto-rsync.sh
#!/bin/bash
#放到后台执行
#bash /opt/auto_rsync.sh &>> /var/log/auto_rsync.log &
src1='/opt/test/'
des1=web
des2=web
host1=192.168.3.124
host2=192.168.3.123
user=rsync_backup
allrsync='/usr/bin/rsync -rpgovz --delete --progress'
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %w%f %e' -e close_write,modify,delete,create,attrib,move $src1 | while read DATE TIME DIR FILE EVENT;
do
case $DIR in
${src1}*)
$allrsync $src1 $user@$host1::$des1 --password-file=/etc/rsync.password && echo "$DATE $TIME $EVENT $FILE was rsynced" &>> /var/log/rsync-$des1-$host1.log
$allrsync $src1 $user@$host2::$des2 --password-file=/etc/rsync.password && echo "$DATE $TIME $EVENT $FILE was rsynced" &>> /var/log/rsync-$des2-$host2.log
;;
#${src2}*)
#$allrsync $src2 $user@$host1::$des2 --password-file=/etc/rsync.password && echo "$DATE $TIME $EVENT $FILE was rsynced" &>> /var/log/rsync-$des2-$host1.log
#$allrsync $src2 $user@$host2::$des2 --password-file=/etc/rsync.password && echo "$DATE $TIME $EVENT $FILE was rsynced" &>> /var/log/rsync-$des2-$host2.log
#;;
esac
done
注:
1.当向监控目录/opt/test写入大文件时,由于大文件的写入需要一段时间,此时 inotify就会持续不停的输出该文件被更新的信息, 这样就会持续不停的触发rsync去执行同步操作,占用了大量系统资源,那么针对这种情况,最理想的做法是等待文件写完后再去触
发rsync同步。 在这种情况下,可以修改inotify的监控事件,即:“-e close_write,modify,delete,create,attrib,move”。
2.测试当写入监控目录10g的大文件触发rsync,此时rsync会消耗很大的cpu和内存,需要殷切我们的注意。
四.测试
1.我们在126上运行脚本后,我们向监控目录/opt/test加入文件
[root@usvr-126 test]# bash /opt/auto-rsync.sh &>> /var/log/auto_rsync.log &
[1] 2554
[root@usvr-126 test]# ps -ef |grep rsync
root 2554 931 0 14:52 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2556 2554 0 14:52 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2558 931 0 14:52 pts/2 00:00:00 grep rsync
2.加入文件
mv /usr/local/src/webbench-1.5.tar.gz
3.查看相关日志
[root@usvr-126 test]# cat /var/log/rsync-web-192.168.3.123.log
06/01/15 14:47 MOVED_TO /opt/test/webbench-1.5.tar.gz was rsynced
06/01/15 14:47 MOVED_TO /opt/test/webbench-1.5.tar.gz was rsynced
由于是move事件触发rsync,在同步123这台机器记录的日志如上。
注:进程干扰
auto_rsync.sh后台运行,但是有两台服务器需要同步,因此会有两个进程,如下:
[root@usvr-126 test]# jobs -l
[1]+ 2554 Running bash /opt/auto-rsync.sh &>>/var/log/auto_rsync.log &
[root@usvr-126 test]# kill 2554
[1]+ 已终止 bash /opt/auto-rsync.sh &>>/var/log/auto_rsync.log
[root@usvr-126 test]# ps -ef |grep rsync
root 2556 1 0 14:52 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2560 931 0 14:54 pts/2 00:00:00 grep rsync
当我们杀掉jobs列出的进程后,其实只杀掉了其中一台机器的进程,这样我们再启动后2556这个进程会继续存在
[root@usvr-126 test]# bash /opt/auto-rsync.sh &>> /var/log/auto_rsync.log &
[1] 2561
[root@usvr-126 test]# ps -ef |grep rsync
root 2556 1 0 14:52 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2561 931 0 14:56 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2563 2561 0 14:56 pts/2 00:00:00 bash /opt/auto-rsync.sh
root 2565 931 0 14:57 pts/2 00:00:00 grep rsync
这样在日志中会出现重复打印的情况,另外我们修改脚再次启动后老进程的存在会给我们带来误判,因此我们需要将所有启动的进程重新kill后再启动脚本。