rsync组合inotify-tools完成实时同步[转]

一. 什么是inotifycss

inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,容许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、建立或者改变属性。python

 

CentOS6天然已经支持:
使用ll /proc/sys/fs/inotify命令,是否有如下三条信息输出,若是没有表示不支持。linux

 

total 0
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances
-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches

 

  • /proc/sys/fs/inotify/max_queued_evnets表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。sql

  • /proc/sys/fs/inotify/max_user_instances表示每个real user ID可建立的inotify instatnces的数量上限。segmentfault

  • /proc/sys/fs/inotify/max_user_watches表示每一个inotify instatnces可监控的最大目录数量。若是监控的文件数目巨大,须要根据状况,适当增长此值的大小。服务器

 

inotify-tools:app

 

inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口库函数,同时还提供了一系列的命令行工具,这些工具 能够用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其余。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。异步

 

下载inotify-tools-3.14-1.el6.x86_64.rpm,经过rpm包安装:函数

 

# rpm -ivh /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm 
warning: /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 4026433f: NOKEY
Preparing...                ########################################### [100%]
   1:inotify-tools          ########################################### [100%]
# rpm -qa|grep inotify
inotify-tools-3.14-1.el5.x86_64

二.inotifywait使用示例工具

监控/root/tmp目录文件的变化:

 

/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
 -e modify,delete,create,move,attrib /root/tmp/

 

上面的命令表示,持续监听/root/tmp目录及其子目录的文件变化,监听事件包括文件被修改、删除、建立、移动、属性更改,显示到屏幕。执行完上面的命令后,在/root/tmp下建立或修改文件都会有信息输出:

 

2014/12/11-15:40:04 /root/tmp/ new.txt
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
2014/12/11-15:40:23 /root/tmp/ .new.txt.swp
2014/12/11-15:40:31 /root/tmp/ .new.txt.swp
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ 4913
2014/12/11-15:40:32 /root/tmp/ new.txt
2014/12/11-15:40:32 /root/tmp/ new.txt~
2014/12/11-15:40:32 /root/tmp/ new.txt
...

三.组合rsync实现实时同步

这一步的核心其实就是在客户端建立一个脚本rsync.sh,适用inotifywait监控本地目录的变化,触发rsync将变化的文件传输到远程备份服务器上。为了更接近实战,咱们要求一部分子目录不一样步,如/root/tmp/log和临时文件。

1. 建立排除在外不一样步的文件列表

排除不须要同步的文件或目录有两种作法,第一种是inotify监控整个目录,在rsync中加入排除选项;第二种是inotify排除部分不监控的目录,rsync天然也不会触发。咱们选择第二种。

 

这个操做在客户端进行,/root/tmp/log以及/root/tmp/src目录下的js、css和一些临时文件不一样步,因此不须要inotifywait,/root/tmp下的其余文件和目录都同步。(其实对于打开的临时文件,能够不监听modify时间而改为监听close_write)

 

# vi /etc/inotify_rsync_exclude.lst:
@/root/tmp/cache??*
@/root/tmp/src/js
@/root/tmp/src/css
@/root/tmp/src
@/root/tmp/src/20*/20*/20*/.??*
@/root/tmp/log/

 

目前测试看到只能用绝对路径。

 

2.客户端同步到远程的脚本rsync.sh

rsync.sh文件:

#variables
current_date=$(date +%Y%m%d_%H%M%S)
source_path=/home/guotmp/
log_file=/var/log/rsync_client.log

#rsync
rsync_server=192.168.1.84
rsync_user=ant5
rsync_pwd=/etc/rsync-84.pas
rsync_module=tmp

#rsync client pwd check
if [ ! -e ${rsync_pwd} ];then
    echo -e "rsync client passwod file ${rsync_pwd} does not exist!"
    exit 0
fi

#inotify_function
inotify_fun(){
    /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
          --fromfile /etc/inotify_rsync_exclude.lst -e modify,delete,create,move,attrib ${source_path} \
          | while read file
      do
          /usr/bin/rsync -auvrtzopgP --progress --bwlimit=200 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
      done
}

--bwlimit=200用于限制传输速率最大200kb,由于在实际应用中发现若是不作速率限制,会致使巨大的CPU消耗。

 

在客户端运行脚本# ./rsync.sh便可实时同步目录。

 

本文摘自:http://segmentfault.com/a/1190000002427568

相关文章
相关标签/搜索