在上一篇中介绍了rsync的应用和一些rsync的优势、缺点等,并在最后提到了inotify这个工具,下面就来讲一下inotify这个工具。
先来讲一下rsync的不足之处吧。web
一、rsync同步数据时,须要扫描全部文件后进行比对,而后进行差量传输。若是文件数量达到百万甚至千万量级,扫描全部文件将是很是耗费时间的,并且发生变化的每每是其中的不多一部分,所以在这种状况下rsync的工做效率是很是低的,shell
二、rsync不能实时监测、同步数据,虽然它能够经过Linux守护进程的方式触发同步,可是在两次触发动做必定会有时间差,可能就致使服务器端与客户端数据出现不一致,没法在出现应用故障时彻底恢复数据。vim
基于以上缘由,rsync+inotify组合出现了。bash
关于inotify服务器
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13版本就开始加入对inotify的支持。异步
经过inotify能够监控文件系统中添加、删除、修改、移动等各类细微事件,利用这个内核接口,第三方软件能够监控文件系统下文件的各类变化状况,inotify-tools就是这样的一个第三方软件。ide
正因为inotify这些特性可以弥补rsync的不足。二者的工做方式是:用inotify能够监控文件系统和各类变化,当文件有任何变更时,会触发rsync同步。工具
安装inotify工具inotify-tools性能
因为inotify的特性须要Linux内核的支持,在安装以前要确认Linux系统内核是否在2.6.13版本之上,若是低于这个版本,就要从新编译内核加入对inotify的支持。能够用如下方式来判断是否支持inotify测试
- [root@localhost ~]# uname -r
- 2.6.18-164.el5
- [root@localhost ~]# ll /proc/sys/fs/inotify/
- total 0
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_queued_events
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_instances
- -rw-r--r-- 1 root root 0 Jun 21 18:11 max_user_watches
若是有上面3行的输出说明系统默认支持inotify,能够安装inotify-tools了。能够到http://inotify-tools.sourceforge.net/下载相应版本的inotify-tools
- [root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz
- [root@localhost inotify-tools-3.14]# cd inotify-tools-3.14
- [root@localhost inotify-tools-3.14]# ./configure
- [root@localhost inotify-tools-3.14]# make
- [root@localhost inotify-tools-3.14]# make install
- [root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa*
- -rwxr-xr-x 1 root root 37260 Jun 21 18:20 /usr/local/bin/inotifywait
- -rwxr-xr-x 1 root root 35434 Jun 21 18:20 /usr/local/bin/inotifywatch
- 安装完成后,会生成inotifywait和inotifywatch两个指令。
inotifywait用于等待文件或文件集上的一个待定事件,能够监控任何文件和目录设置,而且能够递归地监控整个目录树;
inotifywatch 用于收集被监控的文件系统计数据,包括每一个inotify事件发生多少次等信息
从上面可知inotifywait是一个监控事件,能够配合shell脚本使用它。与它相关的参数:
-m 即“--monitor”,表示始终保持事件监听状态。
-r 即“--recursive”,表示递归查询目录
-q 即“--quiet”,表示打印出监控事件
-e 即 “--event”,经过此参数能够指定要监控的事件,常见的事件有modify、delete、create、和attrib等
要想更多的了解能够用man inotifywait
下面针对rsync和inotify来作个小设计:
有两个台服务器也就是两个节点 A 、B
还有一个服务器C是来将静态的页面同步到A、B两个服务器上的。
这三台服务器的相关信息:
内核版本 用途 ip地址 网页数据路径
A 2.6.18-164.el5 服务节点1 192.168.35.4 /web1/wwwroot
B 2.6.18-164.el5 服务节点2 192.168.35.5 /web2/wwwroot
C 2.6.18-164.el5 内容发布节点 192.168.35.6 /web/wwwroot
一、安装rsync与inotify-tools
inotify-tools是用来监控文件系统变化的工具,所以必须安装在内容发布节点上,服务节点不用安装。
还有就是这三台服务器都要安装上rsync这个工具。安装方式在上篇博客中提到在这里就再也不说了。
安装完成后,下面来讲一下各服务器节点的配置
对于两台服务器节点上的配置以下:
A 节点的rsyncd.conf配置以下:
- uid = nobody
- gid = nobody
- use chroot = no
- max connections = 10
- strict modes = yes
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
- [web1]
- path = /web1/wwwroot/
- comment = web1 file
- ignore errors
- read only = no
- write only = no
- hosts allow = 192.168.35.6
- hosts deny = *
- list = false
- uid = root
- gid = root
- auth users = web1user
- secrets file = /etc/web1.pass
B 节点的rsyncd.conf配置以下:
- uid = nobody
- gid = nobody
- use chroot = no
- max connections = 10
- strict modes = yes
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
- [web2]
- path = /web2/wwwroot/
- comment = web2 file
- ignore errors
- read only = no
- write only = no
- hosts allow = 192.168.35.6
- hosts deny = *
- list = false
- uid = root
- gid = root
- auth users = web2user
- secrets file = /etc/web2.pass
这两个配置文件完成了,下面还要在这两台服务器上分别建立web1.pass和web2.pass这两个文件
所要添加的内容是:
# vim /etc/web1.pass
web1user:zhou
# vim /etc/web2.pass
web2user:zhou
在配置完成后,就能够启动rsync守护进程了。
/usr/local/bin/rsync --daemon
下面在内容发布节点上来作一下配置,主要工做是将变化的内容实时同步到2个服务节点上,来建立一个脚原本实现这个功能。
脚本内容以下:
- #!/bin/bash
- host1=192.168.35.4
- host2=192.168.35.5
- src=/web/wwwroot/
- dst1=web1
- dst2=web2
- user1=web1user
- user2=web2user
- /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modfiy,delete,create,attrib $src | while read files
- do
- /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
- /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user2@$host2::$dst2
- echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
- done
在这个脚本完成后还建立一个文件在
# vim /etc/server.pass
内容就是上面两个服务器中的用户的密码。zhou
# more /etc/server.pass
zhou
脚本的一些参数以下:
--timefmt: 指定时间的输出格式
--format: 指定变化文件的详细信息
这个参数要配合使用,经过指定输出格式输出相似如下的内容
15/06/10 12:00 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced
这个脚本的做用就是经过inotify监控文件目录的变化,进而触发rsync进行同步操做。因为这个过程是一个主动触发操做的过程,是经过系统内核完成的,因此比那些遍历整个目录的扫描方式效率要高不少。
有时会出现这样的状况,当在监控的目录中写入一个很大的文件,也就写入的文件须要一段时间,inotify会持续不停地输出该文件被更新的信息,这样就会持续不断地触发rsync执行同步操做,占用大量系统资源。出现这种状况,最理想的作法就是等待文件写完后再触发rsync同步。在这种状况下,能够修改inotify的监控事件,即,“-e close_write,delete,create,attrib”。
给上面的脚本添加执行权限,放到后台运行就能够了。
下面就可在发布节点上的/web/wwwroot/目录下添加,删除或者修改某个文件来测试一下,是否能正常工做。若是看到有变化说明这个实时同步的功能就配置成功了。
若是有什么不对的地方,还请指出来,谢谢你们!