Inotify:

            Inotify,它是在内核 2.6.13 版本中引入的一个新功能,为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

Inotify-tools:

            Inotify-tools是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。

Rsync+Inotify软件角色:

            之前的博客讲述过Rsync工具的使用,在很多场景下,我们使用Rsync工具是从服务器主机获取数据或者是向服务器主机推送数据,这种操作的主动方在客户端主机,往往服务器端是被动接收数据请求或提供数据服务的一方,是对外提供服务的,这种应用场景更适合于企业内的数据存储,而在使用了Inotify+Rsync的应用场景中,数据发送请求的主动方的角色发生了转换,服务器端主动向客户端发起数据同步请求,而客户端(这个场景下的客户端主机通常也是服务器,但是是从服务器)被动的接收数据传输请求,但有一点需要注意,这些从服务器需要启用Rsync的服务器模式,监听在tcp的873端口,所以我们要注意这种场景下主服务器端和从服务器端工作方式的转换和Rsync软件工作于哪类主机的角色上的转换,便于我们理解并配置Rsync和Inotify。

inotofy-tools安装:

[root@rsync ~]# tar xf inotify-tools-3.14.tar.gz
[root@rsync ~]# cd inotify-tools-3.14
[root@rsync inotify-tools-3.14]# ./configure
[root@rsync inotify-tools-3.14]# make && make install

inotify命令使用:

首先要确认当前系统的内核版本,2.6.13版本以后支持Inotify,之前的版本是不支持的。安装后的Inotify工具在/usr/local/bin目录下有两个工具文件:

[root@rsync ~]# ll /usr/local/bin/
total 88
-rwxr-xr-x 1 root root 44271 Aug 23 21:12 inotifywait
-rwxr-xr-x 1 root root 41361 Aug 23 21:12 inotifywatch

inotifywait命令使用:

语法格式:

inotifywait  [-hcmrq]  [-e  <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file> [ ... ]
参数选项:
    -h,--help :输出帮助信息
    @ :排除不需要监视的文件,可以是相对路径,也可以是绝对路径
    -fromfile :从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
    -m,-monitor :接收到一个事件后不退出,无限期执行。
    -d,-daemon :以服务进程的方式在后台运行,不退出,但需要指定-outfile用于记录日志
    -o,-outfile: 输出事件到一个文件而不是标准输出
    -s,-syslog : 输出错误信息到系统日志
    -r,-recursive :监视一个目录下的所有子目录。
    -q,-quiet : 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息
    -exclude : 使用正则表达式匹配需要排除的文件,不忽略大小写
    -excludei :使用正则表达式匹配需要排除的文件,忽略大小写
    -t,-timeout : 设置超时时间,如果时间为0,则无限期的执行下去。
    -e, -event : 指定监视的事件。
    -c,-csv :输出csv格式。
    -timefmt :指定时间格式,用于-format选项中的%T格式。
    -format :指定输出格式。
            %w :表示发生时间的目录
            %f :表示发生事件的文件
            %e :表示发生的事件
            %Xe :事件以“X”分隔
            %T :表示使用由-timefmt定义的时间格式
-e选项指定可以监听的时间,其中时间的可用类型有:
        access :表示文件读取。
        modify : 表示文件更改。
        attrib : 表示文件属性的。
        close_write :以可写的方式打开的文件被关闭时触发,但不一定写入了数据。
        close_nowrite: 以只读的模式打开的文件被关闭时触发。
        close : 文件被后关闭。
        open :文件打开。
        moved_to :文件或目录被移动到被监听的目录中,该事件会被触发。
        moved_from :文件或目录移出被监听的目录,即使在同一个目录移动,该事件也会被触发。
        move:包括moved_to和moved_from。
        move_self:文件或目录被移除,之后不再监听此文件或目录。
        delete:文件或目录被删除触发。
        delete_self:文件或目录移除,以后不再监听此文件或目录。
        umount:文件系统被取消挂载,之后不再监听此文件系统。

inotify命令使用示例:

[root@rsync ~]# inotifywait -rm /etc/
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

打开另一个终端,进入/etc目录执行ls命令就可以触发监听事件。

/etc/ OPEN ld.so.cache
/etc/ CLOSE_NOWRITE,CLOSE ld.so.cache
/etc/ OPEN,ISDIR 
/etc/ CLOSE_NOWRITE,CLOSE,ISDIR

inotifywatch命令使用:

语法格式:

 inotifywatch  [-hvzrqf] [-e <event> ] [-t <seconds> ] [-a <event> ] [-d <event> ] <file> [ ... ]
常用选项:
    -h,-help :输出帮助信息
    -v,-verbose : 输出详细信息
    @:排除不需要监视的文件
    -fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -z,-zero:输出表格的行和列,即使元素为空
    -exclude:正则匹配需要排除的文件,不忽略大小写
    -excludei:正则匹配需要排除的文件,忽略大小写
    -r,-recursive :监视一个目录下的所有子目录。
    -t,-timeout :设置超时时间。
    -e,-event:只监听指定的事件。
    -a:以指定的事件进行升序排列。
    -d:以指定的时间降序排列。

inotifywatch命令使用示例:

统计/etc目录下指定监听的时间发生的次数

[root@rsync ~]# inotifywatch -v -e create -e modify -e delete -t 30 -r /etc
Establishing watches...
Setting up watch(es) on /etc
OK, /etc is now being watched.
Total of 245 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 30 seconds.
total  create  filename
2      2       /etc/

Inotif结合Rsync示例:

实验环境用三台虚拟机:

    主服务器:192.168.2.1

    从服务器:192.168.2.2,192.168.2.3

当主服务器端被监听的目录发生数据改变时,自动向从服务器端发送数据。

步骤1,主服务器端安装Rsync,Inotify-tools,前面已经演示过就不再重复了,但主服务器端需要创建数据传送时认证用户的密码文件,还要准备监听的数据目录,假设为/var/www/html。

[root@rsync ~]# echo "redhat" > /etc/rsyncd.passwd
[root@rsync ~]# cat /etc/rsyncd.passwd
redhat

步骤二,在从服务器端同样也安装上Rsync,但是从服务器端的Rsync是要被动接收服务请求的,所以要配置为服务器模式,配置文件的示例如下,注意:两台从服务器都要配置,从服务器端的数据接收目录假设也为/var/www/html:

[root@client2 ~]# yum install xinetd
[root@client2 ~]# yum install rsync    #多数情况下已安装,需要的情况下执行该操作
[root@client2 ~]# chkconfig rsync on

编辑配置文件/etc/rsyncd.conf:

# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Directory to be synced
[backup]
path = /var/www/html
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.2.0/24
hosts deny = *
list = true
uid = root
gid = root
auth users = backup_transfer
secrets file = /etc/rsyncd.passwd

创建认证用的密码文件,同时改变文件属性为600,注意,密码的长度不要超过8个字符,否则认证会失败:

[root@rsync ~]# echo -e "backup_transfer:redhat" /etc/rsyncd.passwd 
[root@rsync ~]# chmod 600 /etc/rsyncd.passwd
[root@rsync ~]# cat /etc/rsyncd.passwd
backup:redhat

启动xinetd服务:

[root@client2 ~]# service xinetd start
[root@client2 ~]# ss -tnlp | grep xinetd
LISTEN     0      64                       :::873                     :::*      users:(("xinetd",1436,5))

步骤三、测试主服务器端向从服务器拉取和推送数据是否可以正常完成:

[root@rsync tmp]# rsync -a /etc/fstab backup_transfer@192.168.2.3::backup
[root@rsync tmp]# rsync -a backup_transfer@192.168.2.3::backup/fstab ./

测试通过后设置主服务器端监听的数据目录并提供脚本以实现实时数据同步:

脚本内容如下:

#!/bin/bash
#
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %w%f %e' -e modify,delete,create,attrib /var/www/html | while read file;
do
/usr/bin/rsync -vzrtopg --delete --progress /var/www/html/ backup_transfer@192.168.2.3::backup --password-file=/etc/rsyncd.passwd
/usr/bin/rsync -vzrtopg --delete --progress /var/www/html/ backup_transfer@192.168.2.2::backup --password-file=/etc/rsyncd.passwd
echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
done

注意:复制的目录后面要有路径分隔符/,这样可以将目录内的文件同步到从服务器的指定目录下,如果没有路径分隔符,会将主服务器的html目录复制到从服务器的/var/www/html目录下面,会多出一层目录,不是我们期望的效果。

增加脚本的可执行权限,使脚本运行于后台,并且可以开机启动(追加至/etc/rc.d/rc.local文件中)

[root@rsync ~]# chmod +x rsync.sh 
[root@rsync ~]# echo "/root/rsync.sh" >> /etc/rc.d/rc.local

Rsync+Inotify的配置完成。