inotify是Linux内核的一个功能,它能监控文件系统的变化,好比删除、读、写和卸载等操做。要使用inotify,Linux内核版本必须是大于2.6.13,实现inotify的软件为inotify-toolscss
# 查看系统内核版本 [root@nfs ~]# uname -r 3.10.0-1062.12.1.el7.x86_64 # 查看inotify的内核参数的文件是否存在 [root@nfs ~]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jul 8 09:43 max_queued_events -rw-r--r-- 1 root root 0 Jul 8 09:43 max_user_instances -rw-r--r-- 1 root root 0 Jul 8 09:43 max_user_watches max_queued_events ---设置inotify实例事件(event)队列可容纳的事件数量,默认值16384 max_user_instances ---设置每一个用户单个进程监控文件的数量,默认是8129 max_user_watches ---设置i用户建立inotify实例的最大值,默认是128 # 修改max_queued_events内核参数 [root@nfs ~]# echo 'fs.inotify.max_queued_events=999999' >> /etc/sysctl.conf [root@test ~]# cat /proc/sys/fs/inotify/max_queued_events 999999
安装inotify-tools须要用到epel源html
[root@nfs ~]# yum -y install inotify-tools [root@nfs ~]# rpm -ql inotify-tools /usr/bin/inotifywait --- 监控目录数据信息变化 /usr/bin/inotifywatch --- 对监控的变化信息进行统计 ......
## inotifywait参数说明 参数名称 参数说明 -m ,-monitor 始终保持事件监听状态 -r,-recursive 递归查询目录 -q,-quiet 只打印监控事件的信息 -exclude 排除文件或目录时,不区分大小写 -t,-timeout 超时时间 --timefmt 指定时间输出格式 --format 指定输出格式 -e,event 后面指定增,删,改等事件 ## --timefmt <fmt>时间格式 %Y: ---表示年份信息,包含世纪信息 %y: ---表示年份信息,不包含世纪信息 %m: ---表示月份,范围01-12 %d: ---表示每个月的第几天,范围01-31 %H: ---表示小时信息,使用24小时制度,范围00-24 %M: ---表示分钟,范围00-59 ## --format<fmt>输出信息格式定义 %T: ---输出时间格式中定义的时间格式,这个表示调用咱们前面定义时间格式,一般状况--timefmt选项和--format结合使用 %w: ---表示事件出现时,监控文件或目录的名称信息。也就是监控资源名称信息 %f: ---时间出现时,显示监控目录下触发事件的文件或目录信息 %e: ---显示发生的事件信息,不一样事件默认用逗号分隔 %Xe: ---显示发生的事件,不一样的时间指定用"X"分割 ## -e选项指定监控事件类型说明 access ---读取文件或目录内容 modify ---修改文件或目录内容 attrib ---文件或目录的属性改变 close_write ---修改真实文件内容 close_nowrite ---示文件或目录关闭,在只读模式打开以后关闭的 close ---表示文件或目录关闭,不论是读仍是写模式 open ---文件或目录被打开 moved_to ---文件或目录移动到 moved_from ---文件或目录从...移动到 move ---移动文件或目录移动到监视目录 create ---在监视目录下建立文件或目录 delete ---删除监视目录下的文件或目录 delete_self ---表示文件或目录被删除,目录自己被删除 umount ---卸载文件系统
服务器 | 主机名 | 外网IP | 内网IP | 软件 |
---|---|---|---|---|
NFS服务器 | nfs | 192.168.1.31 | 172.16.1.31 | nfs-utils+rpcbind |
web服务器 | web01 | 192.168.1.7 | 172.16.1.7 | nfs-utils |
# 长时间递归监听/mnt目录 [root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data # /mnt目录下操做文件或目录 [root@web01 mnt]# touch aaa [root@web01 mnt]# echo "hello" > aaa [root@web01 mnt]# rm -f aaa [root@web01 mnt]# mv bbs /root # 监听信息 [root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data 2020-07-08 14:34 /data/ aaa event_info:CREATE 2020-07-08 14:34 /data/ aaa event_info:CLOSE_WRITE,CLOSE 2020-07-08 14:35 /data/ aaa event_info:MODIFY 2020-07-08 14:35 /data/ aaa event_info:CLOSE_WRITE,CLOSE 2020-07-08 14:35 /data/ aaa event_info:DELETE 2020-07-08 14:35 /data/ bbs event_info:DELETE,ISDIR
[root@nfs scripts]# cat 01-inotify_rsync.sh #!/bin/sh backup_Server=172.16.1.41 export RSYNC_PASSWORD=123456 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do echo ${line} if [ -f ${line} ] then rsync -az ${line} rsync_backup@${backup_Server}::data else rsync -az --delete /data/ rsync_backup@${backup_Server}::data fi done
sersync相似于inotify,一样用于监控,但它克服了inotify的缺点.linux
inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操做会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而致使重复调用rsync命令。好比:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来讲是不该该被监控的c++
sersync 优势:git
环境准备:两台服务器,一台NFS服务器,一台备份服务器(部署好Rsync守护进程服务)github
NFS服务器上操做:web
# 下载软件 [root@nfs tools]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz # 解压 [root@nfs tools]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz # 修更名称 [root@nfs tools]# mv GNU-Linux-x86/ sersync # 移动到/usr/local [root@nfs tools]# mv sersync /usr/local/ [root@nfs tools]# cd /usr/local/sersync [root@nfs sersync]# cp confxml.xml confxml.xml.bak
[root@nfs sersync]# vim confxml.xml ## 排除指定数据信息不要进行实时传输同步 <filter start="false"> <!--为true时生效--> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> ## 定义inotify程序须要监控的事件 <inotify> <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> ## 监控目录 <localpath watch="/data"> # 同步数据远程服务器ip 模块名 <remote ip="172.16.1.41" name="data"/> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # 同步参数 <commonParams params="-artuz"/> # rsync远程认证用户,认证密码文件 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> # 端口,默认874 <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync>
[root@nfs conf]# sersync -h set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param ______________________________________________________ 参数-d:启用守护进程模式 参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍 参数-n:指定开启守护线程的数量,默认为10个 参数-o:指定配置文件,默认使用confxml.xml文件 参数-m:单独启用其余模块,使用 -m refreshCDN 开启刷新CDN模块 参数-m:单独启用其余模块,使用 -m socket 开启socket模块 参数-m:单独启用其余模块,使用 -m http 开启http模块 不加-m参数,则默认执行同步程序 _______________________________________________________
[root@nfs conf]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
cd /data while true ;do ls |wc -l;sleep 0.1;done
cd /data for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done
说明:使用sersync是能够解决以前的缺陷问题,可是这个服务自生也是存在缺陷问题,例如:不能同时监控多个目录,该服务实现多目录监控只能将以前的配置文件从新复制一份重命名,以后与以前启动守护进程同样,在从新启动一个新的进程,这样就比较麻烦。这个问题在lsyncd这个服务中就很好地解决了这个问题shell
Lysncd 其实是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及之后)里的 inotify 触发机制,而后经过rsync去差别同步,达到实时的效果。我认为它最使人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 经过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua自己就是一种配置语言,可读性很是强。lsyncd也有多种工做模式能够选择,本地目录cp,本地目录rsync,远程目录rsyncssh。express
官方地址vim
[root@nfs ~]# yum -y install lsyncd
这里在上面的基础上在主机名为nfs新建一个目录data1,对应在backup新建一个backup1目录
[root@nfs ~]# cat /etc/lsyncd.conf settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", inotifyMode = "CloseWrite", maxProcesses = 8, } sync { default.rsync, source = "/data1", target = "rsync_backup@172.16.1.41::data", delete = true, exclude = { ".*" }, delay = 1, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsync.password", _extra = {"--bwlimit=200"} } } sync { default.rsync, source = "/backup1", target = "rsync_backup@172.16.1.41::backup", delete = true, exclude = { ".*" }, delay = 1, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsync.password", _extra = {"--bwlimit=200"} } }
lsyncd.conf配置选项说明 settings 里面是全局设置,--开头表示注释,下面是几个经常使用选项说明: logfile 定义日志文件 stausFile 定义状态文件 nodaemon=true 表示不启用守护模式,默认 statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒 inotifyMode 指定inotify监控的事件,默认是CloseWrite,还能够是Modify或CloseWrite or Modify maxProcesses 同步进程的最大个数。假如同时有20个文件须要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程 maxDelays 累计到多少所监控的事件激活一次同步,即便后面的delay延迟时间还未到 sync 里面是定义同步参数,能够继续使用maxDelays来重写settings的全局变量。通常第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式: default.rsync :本地目录间同步,使用rsync,也能够达到使用ssh形式的远程rsync效果,或daemon方式链接远程rsyncd进程; default.direct :本地目录间同步,使用cp、rm等命令完成差别文件备份; default.rsyncssh :同步到远程主机目录,rsync的ssh模式,须要使用key来认证 source 同步的源目录,使用绝对路径。 target 定义目的地址.对应不一样的模式有几种写法: /tmp/dest :本地目录同步,可用于direct和rsync模式 172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令相似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,好比指定username,免密码同步 172.29.88.223::module :同步到远程服务器目录,用于rsync模式 三种模式的示例会在后面给出。 init 这是一个优化选项,当init = false,只同步进程启动之后发生改动事件的文件,原有的目录即便有差别也不会同步。默认是true delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件) excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",若是是简单的排除,可使用exclude = LIST。 这里的排除规则写法与原生rsync有点不一样,更为简单: 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar能够匹配规则foo 若是规则以斜线/开头,则从头开始要匹配所有 若是规则以/结尾,则要匹配监控路径的末尾 ?匹配任何字符,但不包括/ *匹配0或多个字符,但不包括/ **匹配0或多个字符,能够是/ delete 为了保持target与souce彻底同步,Lsyncd默认会delete = true来容许同步删除。它除了false,还有startup、running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。 rsync (提示一下,delete和exclude原本都是rsync的选项,上面是配置在sync中的,我想这样作的缘由是为了减小rsync的开销) bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里居然没有标出) compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步能够考虑把它设为false perms 默认保留文件权限。 其它rsync的选项 其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后文示例。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。 lsyncd.conf能够有多个sync,各自的source,各自的target,各自的模式,互不影响。
[root@nfs ~]# systemctl start lsyncd
# backup测试 cd /data while true ;do ls |wc -l;sleep 0.1;done # NFS测试 cd /data for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done