inotify+rsync实现文件实时同步

项目中用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太小需要调整参数后再次使用
     2. max_user_watches是监控目录的最大值,我们需要根据项目的实际情况来确定。

下面来介绍下实验:

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后再启动脚本。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值