1. Rsync的强大之处和不足

通过使用rsync不仅可以实现cpls的功能,还可以将rsync作为daemon运行,对远程设备(Windows或类UNIX系统)上的数据进行备份,不仅可以备份文件还可以对整个文件系统进行备份,使用起来也是比较的方便。在第一次使用rsync时,采用的是完全备份,后续如果要对相同的内容进行备份的话,则采用的是增量备份,备份速度快,并且可以创建计划任务,定期的对数据进行备份。当使用rsync进行备份时,会对要进行备份的数据进行扫描,当要备份的数据量比较大时,且变化的内容又比较小,这是对数据的扫描就要花去很多的时间,效率不是很高,无法对数据的进行实时的监控,因此如果希望对数据进行实时备份的话,可以使用inotifyrsync组合。前一篇博文已经对rsync进行了比较细致的介绍,这里就不对rsync进行说明了,将详细的介绍inotify的使用。

Rsync博客地址:http://hezhang.blog.51cto.com/1347601/1357323

2. Inotify介绍

inotify是一种强大的、细粒度的、异步的文件系统监控机制,在Linux内核2.6.13以后的版本中增加了对inotify的支持,通过使用Inotify可以监控文件系统中的添加、删除、移动、修改等等各种细微的事件,利用这个内核接口,通过使用诸如inotify-tools的第三方软件就可以监控文件系统中文件的各种细微的变化情况,通过使用inotify对文件系统中的各种细微事件的监控,当发生变化时,触发rsync的同步,从而实现数据的实时备份。

3. Inotify-tools的安装

由于inotify需要操作系统的内核达到2.6.13,因此可以使用uname –r查看操作系统的内核版本,如果内核版本低于2.6.13,需要对内核进行重新编译,加入inotify的功能。也可以使用如下方法判断,内核是否支持Inotify

[root@server1 ~]#uname -r

2.6.18-308.el5

[root@server1 ~]#


当前内核的版本是2.6.18.

使用ll /proc/sys/fs/inotify/

[root@server1 ~]#ll /proc/sys/fs/inotify/

total 0

-rw-r--r-- 1 rootroot 0 Feb  9 09:14 max_queued_events

-rw-r--r-- 1 rootroot 0 Feb  9 09:14 max_user_instances

-rw-r--r-- 1 rootroot 0 Feb  9 09:14 max_user_watches

[root@server1 ~]#

如果有出现上面的3项的话,则表示已经支持了inotify,就可以进行安装inotify-tools了。

下载intofiy-toolshttp://inotify-tools.sourceforge.net

下载好相应的版本以后,到其传到系统中,开始进行编译安装。

[root@server1 opt]#ll

total 360

-rw-r--r-- 1 root root 358772 Feb  8 17:39 inotify-tools-3.14.tar.gz

drwxr-xr-x 2 rootroot   4096 Jan 24 15:49 scripts

[root@server1 opt]#

解压:

tar –zxvfinotify-tools-3.14.tar.gz

进入到解压目录:

cd inotify-tools-3.14

在进行编译安装之前,可以查看READMEINSTALL文档,了解一下编译和安装的一些细节问题。

编译和安装:

[root@server1inotify-tools-3.14]# ./configure

[root@server1 inotify-tools-3.14]#make

[root@server1 inotify-tools-3.14]#make install

根据安装时的提示信息可以知道,该软件安装在/usr/local/bin/目录下,在该目录下会产生两个指令,如下所示:

[root@server1 bin]#pwd

/usr/local/bin

[root@server1 bin]#ll

total 92

-rwxr-xr-x 1 rootroot 47208 Feb  9 09:33 inotifywait

-rwxr-xr-x 1 rootroot 43562 Feb  9 09:33 inotifywatch

[root@server1 bin]#

inotifywait:用于等待文件或目录上的特定事件,可以监控任何一组文件或目录,或者是监控整个目录树(目录、子目录、子目录的子目录等)。在shell脚本中使用的是inotifywait

inotifywatch:用于收集被监视的文件系统的统计数据,包括每个inotify时间发生多少次等信息。

inotify 可以监视的文件系统事件包括:
access,即文件被访问
modify,文件被 write,即被修改。
attrib,文件属性被修改,如 chmodchowntouch
close_write,可写文件被 close
close_nowrite,不可写文件被 close
open,文件被 open
moved_from,文件被移走, mv
moved_to,文件被移来,如 mvcp
create,创建新文件
delete,文件被删除,如 rm
delete_self,自删除,即一个可执行文件在执行时删除自己
move_self,自移动,即一个可执行文件在执行时移动自己
unmount,宿主文件系统被 umount
close,文件被关闭,等同于(CLOSE_WRITE | CLOSE_NOWRITE)
move,文件被移动,等同于(MOVED_FROM | MOVED_TO)
注:上面所说的文件也包括目录。

4. Inotify的相关参数调优

inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小。下面分别做简单介绍。
/proc/sys/fs/inotify/max_queued_evnets    
表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances
表示每一个real user ID可创建的inotify instatnces的数量上限。
/proc/sys/fs/inotify/max_user_watches
表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:
echo 30000000 > /proc/sys/fs/inotify/max_user_watches



5. Inotifywait相关参数

inotifywait的格式如下:

inotifywait 选项监控的文件

如:

[root@server1 ~]#inotifywait -mrq -e create,delete,move /tmp

/tmp/ CREATE,ISDIRaa

/tmp/ DELETE,ISDIRaa

/tmp/ CREATE test

/tmp/ MOVED_FROMtest

/tmp/ MOVED_TO bb

对监视目录下所做的所有在监视事件内的动作都会被显示出来。

Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数:
-m--monitor,表示始终保持事件监听状态。

-r--recursive,表示递归查询目录。
-q--quiet,表示打印出监控事件。

-e--event,通过此参数可以指定要监控的事件,常见的事件有modifydeletecreateattrib等。

--exclude:不监视某个目录或文件。

--timefmt:指定时间格式,常用的为’%d/%m/%y%H:%M’

--format:用用户指定的格式输入,需要使用%T,常用的有:%w%w

因此在—timefmt—format时,常用的格式如下:

--timefmt ‘%d/%m/%y %H:%M’ –format ‘%T%w%f’
更详细的请参看man  inotifywait

6.测试

脚本内容如下:

[root@server1 opt]#more inotifyrsync.sh

#!/bin/bash

backupdir=/tmp


/usr/local/bin/inotifywait-mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -ecreate,delete,modify,move,attrib ${backupdir} | wh

ile read file

do

       rsync -avz --delete --progress${backupdir} --password-file=/etc/rsyncd.secret frame@172.17.100.254::backup

done

[root@server1 opt]#


Rsync客户端安装inotifytmp目录没有任何内容:

[root@server1 tmp]#ll

total 0

[root@server1 tmp]#

服务器端的备份目录下的内容如下:

[root@serverbackup]# ll

total 0

[root@serverbackup]#

测试:在客户端的tmp目录下创建文件和目录,服务器端的备份目录下查看

客户端:

[root@server1 tmp]#touch aa

[root@server1 tmp]#cp /etc/services .

[root@server1 tmp]#mkdir bb

[root@server1 tmp]#ll

total 364

-rw-r--r-- 1 rootroot      0 Feb  9 11:03 aa

drwxr-xr-x 2 rootroot   4096 Feb  9 11:03 bb

-rw-r--r-- 1 rootroot 362031 Feb  9 11:03 services

[root@server1 tmp]#

服务器端:

[root@serverbackup]# ll

total 4

drwxrwxrwx. 5 rootroot 4096 Feb  9 11:03 tmp

[root@serverbackup]# cd tmp/

[root@server tmp]#ll

total 360

-rw-r--r--. 1 rootroot      0 Feb  9 11:03 aa

drwxr-xr-x. 2 rootroot   4096 Feb  9 11:03 bb

-rw-r--r--. 1 rootroot 362031 Feb  9 11:03 services

[root@server tmp]#pwd

/backup/tmp

[root@server tmp]#

OK……