wdcp网站备份问题,中小微企业建设网站,长尾词和关键词的区别,网页版游戏排行榜j一、Inotify介绍#xff1a; Inotify 是一个 Linux 内核特性#xff0c;它监控文件系统#xff0c;并且及时向专门的应用程序发出相关的事件警告#xff0c;比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。使用 inotify 很简单#xff1a;创建一个文… 一、Inotify介绍 Inotify 是一个 Linux 内核特性它监控文件系统并且及时向专门的应用程序发出相关的事件警告比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。使用 inotify 很简单创建一个文件描述符附加一个或多个监视器一个监视器 是一个路径和一组事件然后使用 read 方法从描述符获取事件。read 并不会用光整个周期它在事件发生之前是被阻塞的。 内核版本不低于 2.6.13系统就支持 inotify。 同时可以查看内核参数[rootlocalhost inotify]# cd /proc/sys/fs/inotify/[rootlocalhost inotify]# lltotal 0-rw-r--r-- 1 root root 0 Aug 29 17:20 max_queued_events-rw-r--r-- 1 root root 0 Aug 29 17:20 max_user_instances-rw-r--r-- 1 root root 0 Aug 29 17:20 max_user_watches[rootlocalhost inotify]# cat *163841288192 notify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数同时还提供了一系列的命令行工具这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的除了要求内核支持inotify外不依赖于其他。inotify-tools提供两种工具一是 inotifywait它是用来监控文件或目录的变化二是inotifywatch它是用来统计文件系统访问的次数。现在介绍一下它的使用方法。 查看notify-tools信息: https://github.com/rvoicilas/inotify-tools/wiki 结合rsync进行测试脚本如下#!/bin/shcmdwhich inotifywait$cmd -mrq --timefmt %F %T --format %T %f -e create,close_write,attrib /data | while read date time filedo cd /data rsync -azv $file cms192.168.2.207::data --password-file/etc/rsyncd.passdone 注加上delete事件会导致删除同步错误提示文件不存在故删除事件单独启个脚本进程。 性能测试 针对大量的小文件 同步小文件太慢直接同步目录 10-100k的小文件并发达到200-300需要对内核三个参数进行调优 max_queued_events 320000 max_user_watches5000000在对一个大磁盘进行inotify监听时爆出如下错误Failed to watch /home/;upper limit on inotify watches reached!Please increase the amount of inotify watches allowed per user via /proc/sys/fs/inotify/max_user_watches’.cat一下这个文件默认值是8192echo 8192000 /proc/sys/fs/inotify/max_user_watches即可二、sersync介绍sersync利用inotify与rsync对服务器进行实时同步其中inotify用于监控文件系统事件rsync是目前广泛使用的同步算法其优点是只对文件不同的部分进行操作所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点sersync是使用c编写由于只同步发生更改的文件因此比其他同步工具更节约时间、带宽安装方便、配置简单使用多线程进行同步能够保证多个服务器实时保持同步状态自带出错处理机制通过失败队列对出错的文件重新出错如果仍旧失败则每10个小时对同步失败的文件重新同步自带crontab功能只需在xml配置文件中开启即可按您的要求隔一段时间整体同步一次自带socket与http协议扩展你可以方便的进行二次开发 线程组线程是等待线程队列的守护线程当队列中有数据的时候线程组守护线程逐个唤醒当队列中inotify事件交多的时候就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件重发利用服务器的并发能力核数*22。 之所以称之为线程组线程是因为每个线程在工作的时候会根据服务器的数量建立子线程子线程可以保证所有的文件与各个服务器同时同步当要同步的文件较大的时候这样设计可以保证各个远程服务器可以同时获得要同步的文件。 服务线程的作用有三个首先是处理同步失败的文件将这些文件 再次同步对于再次同步失败的文件会生成rsync_fail_log.sh脚本记录失败的事件。同时每隔10个小时执行脚本一次同时清空脚本。服务 线程的第三个作用是crontab功能可以每隔一定时间将所有路径整体同步一次。 过滤队列的建立是为了过滤短时间内产生的重复的inotify信息例如在删除文件夹得时候inotify就会同时产生删除文件夹里的文件与删除文件夹 得事件通过过滤队列当删除文件夹事件产生的时候会将之前加入队列的删除文件的事件全部过滤掉这样只产生一条事件减轻了同步的负担。同时对于修改文件 的操作的时候会产生临时文件与重复操作。 配置文件说明下面做逐行的进行解释说明1、 host hostiplocalhost port8008/hosthostip与port是针对插件的保留字段对于同步功能没有任何作用保留默认即可。2、filter文件过滤功能对于sersync监控的文件会默认过滤系统的临时文件(以“.”开头以“”结尾)除了这些文件外可以自定义其他需要过滤的文件。 filter starttrue exclude expression(.*)\.svn/exclude exclude expression(.*)\.gz/exclude exclude expression^info/*/exclude exclude expression^static/*/exclude exclude expression^APK/*/exclude exclude expression^IOSIPA/*/exclude /filter将start设置为 true 在exclude标签中填写正则表达式默认给出两个例子分别是过滤以.gz结尾的文件与过滤监控目录下的info路径监控路径/info /*可以根据需要添加但开启的时候自己测试一下正则表达式如果出现错误控制台会有提示。相比较使用rsync 的exclude功能被过滤的路径不会加入监控大大减少rsync的通讯量。3、inotify监控参数设定优化对于inotify监控参数可以进行设置根据您项目的特点优化srsync。 inotify delete starttrue/ createFolder starttrue/ createFile startfalse/ closeWrite starttrue/ moveFrom starttrue/ moveTo starttrue/ attrib starttrue/ modify starttrue/ /inotify对于大多数应用可以尝试把createFile监控文件事件选项设置为false来提高性能减少 rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件所以如果关闭create事件只监控文件拷贝结束时的事 件close_write同样可以实现文件完整同步。注意强将createFolder保持为true如果将createFolder设为false则不会对产生的目录进行监控该目录下的子文件与子目录也不会被监控。所以除非特殊需要请开启。默认情况下对创建文件目录事件与删除文件目录事件都进行监控如果项目中不需要删除远程目标服务器的文件目录则可以将delete 参数设置为false则不对删除事件进行监控。4、失败日志脚步配置failLog path/opt/sersync/log/rsync_fail_log.log timeToExecute60/对于失败的传输会进行重新传送再次失败就会写入rsync_fail_log然后每隔一段时间timeToExecute进行设置执行该脚本再次重新传送然后清空该脚本。可以通过path来设置日志路径。5、Crontab定期整体同步功能 crontab startfalse schedule24000!--600mins-- crontabfilter startfalse exclude expression*.php/exclude exclude expressioninfo/*/exclude /crontabfilter /crontabcrontab可以对监控路径与远程目标主机每隔一段时间进行一次整体同步可能由于一些原因两次失败重传都失败了这个时候如果开启了crontab功能还可以进一步保证各个服务器文件一致如果文件量比较大crontab的时间间隔要设的大一些否则可能增加通讯开销。schedule这个参数是设置crontab的时间间隔默认是600分钟如果开启了filter文件过滤功能那么crontab整体同步也需要设置过滤否则虽然实时同步的时候文件被过滤了但crontab整体同步的时候如果不单独设置crontabfilter还会将需过滤的文件同步到远程crontab的过滤正则与filter过滤的不同也给出了两个实例分别对应与过滤文件与目录。总之如果同时开启了filter与crontab则要开启crontab的crontabfilter并按示例设置使其与filter的过滤一一对应。6、插件相关 plugin startfalse namecommand/ /sersync plugin namecommand param prefix/bin/sh suffix ignoreErrortrue/ !--prefix /opt/tongbu/mmm.sh suffix-- filter startfalse include expression(.*)\.php/ include expression(.*)\.sh/ /filter /plugin plugin namesocket localpath watch/opt/fileserver deshost ip192.168.100.160 port8009/ /localpath /plugin plugin namerefreshCDN localpath watch/data0/htdocs/cms.xoyo.com/site/ cdninfo domainnameccms.chinacache.com port80 usernamexxxx passwdxxxx/ sendurl basehttp://pic.xoyo.com/cms/ regexurl regexfalse matchcms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/p_w_picpaths/ /localpath /plugin如上面的xml所示其中plugin标签设置为true时候在同步文件或路径到远程之后后调用插件。通过name参数指定需要执行的插件。目前支持的有command refreshCDN socket http四种插件。http插件目前由于兼容性原因去除以后会重新加入。command插件当文件同步完成后会调用command插件如同步文件是test.php则test.php文件在改动之后调用rsync同步到远程服务器后调用command插件执行/bin/sh test.php suffix/dev/null 21 如果suffix 设置了则会放在inotify事件test.php之后如果ignoreError为true则会添加/dev/null 21当然还可以设置command的filter当filter为tureinclude可以只对正则匹配到的文件调用command。刷新CDN插件“refreshCDN”就在同步过程中将文件发送到目的服务器后刷新cdn接口。如果不想使用则将start属性设为false即可。如果需要使用其他插件则查看其他plugin标签将插件名称改为 xml中其它插件的名称即可。 以下模块refreshCDN http socket可以单独使用只需在命令行下使用-m 参数即可。如果需要作为插件与同步程序一起使用见同步程序说明的插件配置。 该模块根据chinaCDN的协议进行设计当有文件产生的时候就向cdn接口发送需要刷新的路径位置。刷新CDN模块需要配置的xml文件如下。其中 localpath watch 是需要监控的目录。cdnifo标签制定了cdn接口的域名端口号以及用户名与密码。sendurl标签是需要刷新的url的前缀。regexurl标签中的regex属性为true时候使用match属性的正则语句匹配inotify返回的路径信息并将正则匹配到的部分作为url一部分举例如果产生文件事件为/data0/htdoc/cms.88181.com/site/jx3.88181.com/p_w_picpath/a/123.txt经过上面的match正则匹配后最后刷新的路径是:http://pic.88181.com/cms/jx3/a/123.txt;如果regex属性为false最后刷新的路径是http://pic.88181.com/cms/jx3.88181.com/p_w_picpaths/a/123.txt;三、inotify及sersync压力测试环境介绍 172.16.171.100 测试客户机、nfs客户端 172.16.171.110 inotify、sersync端 、nfs服务端 172.16.171.120 rsync服务端 均为CentOS release 6.6 64位系统4核2G1、测试脚本介绍[rootopenstack-nova test]# lltotal 61680-rw-r--r--. 1 root root 1024000 Aug 30 11:27 1000k.txt-rw-r--r--. 1 root root 102400 Aug 30 11:27 100k.txt-rw-r--r--. 1 root root 10240 Aug 30 10:28 10k.txt-rw-r--r--. 1 root root 10240000 Aug 30 11:39 10m.txt-rw-r--r--. 1 root root 512000 Aug 30 11:27 500k.txt-rw-r--r--. 1 root root 51200 Aug 30 10:28 50k.txt-rw-r--r--. 1 root root 51200000 Aug 30 11:39 50m.txt-rwxr-xr-x. 1 root root 313 Aug 30 11:09 test.shcat test.sh#!/bin/shcount20a1name$1num$2file$3while [ $a -le $num ]do for ((i1;i$count;i)) do [ ! -e /cms/$name/$i ] /bin/mkdir /cms/$name/$i /bin/cp ${file}.txt /cms/$name/$i/${file}_echo $(date)$RANDOM | md5sum | cut -c 1-8.txt done aexpr $a 1 sleep 1done2、针对sersync目录进行10K、500K、1000K、10M测试测试命令如下sh test.sh sersync 20 10ksh test.sh sersync 20 500ksh test.sh sersync 20 1000ksh test.sh sersync 20 10m172.16.171.110sersync端和172.16.171.120(rsync)端查看统计命令while true; do tree sersync/ | wc -l; sleep 1 ;done | tee -a sersync.log结果如下ids(10k)r(10k)s(500k)r(500k)s(1m)r(1m)s(10m)r(10m)133333333243364339431421113635363544343433047863786363634543583838383838359516103103103103103986363712312312312312311070648143143143143125123746991631531631531431437471101821631721631631637573111831831831831831837773122032032032032031937776132232232232232142037877142432432432352232238083152632532592472432438283162832632632632632588384172842832832832812668885183033033033032832839088193233233233233033039490203433433433333233239995213633593483433433331009622383372363363352343100992339238338338336336310210024403403403403383383103103254234234234164033991091032642342140811210627423423115107从统计结束来看在172.16.171.110上直接生成文件文件大小在1M之内的小文件同步效率在秒级。10M的大文件sersync端使用了126秒rsync端同步完成共使用了161秒。在172.16.171.100上以nfs挂载并批量生成文件进行测试。10K文件使用28-29秒500K文件使用45秒1M文件使用70秒10M文件使用279秒同步完成使用281秒3、针对inotify目录进行10K、500K、1000K、10M测试测试命令如下sh test.sh inotify 20 10ksh test.sh inotify 20 500ksh test.sh inotify 20 1000ksh test.sh inotify 20 10m172.16.171.110inotify端和172.16.171.120(rsync)端查看统计命令while true; do tree inotify/ | wc -l; sleep 1 ;done | tee -a inotify.log结果如下ids(10k)r(10k)s(500k)r(500k)s(1m)r(1m)s(10m)r(10m)1333333332434343434337438363636356635448294838280638366633258383838384837737610310310310310310380427123123123123123123834381431431431431431371034391631631631561631501104410183172171166176166115471118618318318318318311747122032032032032032031234713223223223223223223123481424324324324124323612454152632632632472592451255816283271264263263263136631728828628328328328313664183033033033033033011396419323323323323323313140642034334334333633332314364213633633553463433431436622383383363363363363143712339439338338338337815072244034034034034033911587225423423423421414405160722642342342316372从统计结束来看在172.16.171.110上直接生成文件文件大小在1M之内的小文件同步效率在秒级和sersync效率不相上下。10M的大文件inotify端使用了103秒rsync端同步完成使用了410秒要远远超过sersync。在172.16.171.100上以nfs挂载并批量生成文件进行测试。10K文件使用28-29秒500K文件使用41秒1M文件使用50秒10M文件使用210秒同步完成使用216秒总结当并发大量生成大文件时sersync因多线程效率会高点当并发量一般时感觉inotify效率更高点。 转载于:https://blog.51cto.com/wushank/1689616