inotify+rsync原理实验详解

一、rsync介绍:

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来–remote sync。

特性:

l可以镜像保存整个目录树和文件系统。

l可以很容易做到保持原来文件的权限、时间、软硬链接等等。

l无须特殊权限即可安装。

l快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

l安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

二、inotify介绍:

inotify可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。

inotify可以监视的文件系统常见事件包括:

2IN_ACCESS:文件被访问

2IN_MODIFY:文件被修改

2IN_ATTRIB,文件属性被修改

2IN_CLOSE_WRITE,以可写方式打开的文件被关闭

2IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭

2IN_OPEN,文件被打开

2IN_MOVED_FROM,文件被移出监控的目录

2IN_MOVED_TO,文件被移入监控着的目录

2IN_CREATE,在监控的目录中新建文件或子目录

2IN_DELETE,文件或目录被删除

2IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

2IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

三、inotify-tools

inotify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。

inotify-tools提供的两个命令行工具:

notifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。

inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

inotifywait命令使用简介:

inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:

l-m, –monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;

l-r, –recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。

l-e <event>, –event<event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib,close_write, close_nowirte, close, open, moved_to, moved_from, move, create,delete, delete_selt等;

l–timefmt <fmt>:当在–format选项中使用%T时,–timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;–timefrt后常用的参数是’%d/%m/%y %H:%M’;

l–format <fmt>:自定义inotifywait的输出格式,如–format ‘%T %w %f’;常用的格式符如下:

%w:显示被监控文件的文件名;

%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;

%T:使用–timefmt选项中自定义的时间格式;

四、inotify+rsync实验过程:

inotify+rsync原理实验详解

服务器 IP地址 文件路径

files 172.16.2.1 /www/webpages

web01

 172.16.2.2 /www/webpages

配置过程:

files配置:

1、安装inotify:

# tar xf inotify-tools-3.14.tar.gz

# cd inotify-tools-3.14

# ./configure && make && make install

# mkdir /root/scripts

                                                                                                                                                                                                                                                                                             

# vim /root/scripts/in_rsync.sh  编写脚本内容如下:

#!/bin/bash

host1=172.16.2.2

src=/www/webpages

dst1=web01

user1=root

/usr/local/bin/inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f%e’ -e modify,delete,create,attrib  $src \

| while read files;do

/usr/bin/rsync -zrtopg  –delete –password-file=/etc/rsyncd.pass $src  $user1@$host1::$dst1 >/dev/null 2>&1

  echo “${files} was rsynced” >>/tmp/rsync.log 2>/dev/null

done

# chmod +x /root/scripts/in_rsync.sh

# setenforce 0

# service iptables stop

# vim /etc/rsyncd.pass

rsync

# chmod 600 /etc/rsyncd.pass

# nohup /root/scripts/in_rsync.sh &  //挂载到后台执行同步

# echo “nohup /root/scripts/in_rsync.sh >/etc/rc.local  //添加到开机启动中

web服务器配置

# yum install xinetd rsync –y

# vim /etc/rsyncd.conf  //添加以下内容

#Global Settings

uid = root   

gid = root

use chroot = no

max connections = 20

strict modes = yes     

log file = /var/log/rsyncd.log   

pid file = /var/run/rsyncd.pid   

lock file = /var/run/rsync.lock 

log format = %t %a %m %f %b

[web01]                       

path = /www

auth users = root

read only = no

hosts allow =172.16.2.0/24

list = no

uid = root

gid = root   

secrets file = /etc/rsyncd.pass

ignore errors = yes

# vim /etc/rsyncd.pass  //添加以下内容:

root:rsync

# chmod 600 /etc/rsyncd.pass  //设置600权限。

# setenforce 0

# service iptables stop

# /usr/bin/rsync –daemon  //启动rsync

# echo “/usr/bin/rsync –daemon” >>/etc/rc.local  //添加开机自动启动

安装apache

可以参考《企业级LAMMP架构应用实践》 描述进行部署。见

http://www.linuxidc.com/Linux/2013-08/89338.htm

  在files服务器上的/www/webpages下添加一个文件,然后在web01上的/www/webpages/下也可以看到同步一个文件,如下图所示:

timg?pa&quality=100&size=b1500_1500&sec=

当然修改和删除文件均可以实时同步,如果是多台web服务器,就可以保证web的页面是一样的了。

inotify+rsync实验完成!