inotify是在Linux 2.6.13 内核中新引入的文件系统变化通知机制。inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知。而rsync是unix/linux平台下的一款高效的镜像备份工具。rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录。在文件非常多的情况下,每次遍历都会消耗很多资源,所以往往在备份中,inotify强大的细粒度异步文件系统事件监控机制配和rsync的强大的镜像备份能力结力是一个不错的选择。

需求:六台主机之间同步数据。其中一台为主,其他五台从第一台同步数配置数据。第二、三为windows,第一、四、五、六台为linux 。

一、rsync的安装

1、第二至六主机安装rsync服务端。windows主机上的安装配置,在此省略,具体可以参看另一篇日志——cwrsyncserver的安装 。linux下的安装也十分简单,一般发行版上自带的都有。本次以centos/redhat为例 。可通过yum安装

1rpm -qa|grep rsync 查看是否安装
2yum -y install rsync  安装

2、在/etc下新建rsyncd目录,在该目录下新建rsyncd.conf文件,其内容如下:

 1pid file = /var/run/rsyncd.pid
 2port = 873
 3#address = 192.168.1.35   有多块网卡时,此配置用于指定监听的网卡
 4uid = root   运行RSYNC守护进程的用户(出于安全配置可以配置为nobody)
 5gid = root   运行RSYNC守护进程的组
 6use chroot = yes
 7read only = yes       全局配置,所有指定的目录模块只有读的权限
 8#limit access to private LANs
 9hosts allow=192.168.1.0/255.255.255.0 多个IP或段之间使用空格或英文逗号分隔
10hosts deny=*
11max connections = 5
12motd file = /etc/rsyncd/rsyncd.motd
13#This will give you a separate log file
14log file = /var/log/rsync.log
15#This will log every file transferred - up to 85,000+ per user, per sync
16#transfer logging = yes
17log format = %t %a %m %f %b
18syslog facility = local3
19timeout = 300
20[sdir]
21read only = no
22path = /App/sdir/SDIR_ROOT
23list=no
24ignore errors
25auth users = test
26secrets file = /etc/rsyncd/rsyncd.secrets
27comment = sdir

3、配置密码认证文件和motd提示文件

1[root@test rsyncd]# pwd
2/etc/rsyncd
3[root@test rsyncd]# ll
4总用量 20
5-rw-r--r-- 1 root root 1161 12月 11 10:12 rsyncd.conf
6-rw-r--r-- 1 root root  357 6月  21 13:51 rsyncd.motd
7-rw------- 1 root root    9 6月  21 13:51 rsyncd.password
8-rw------- 1 root root   14 6月  21 13:51 rsyncd.secrets

4、启动并加入rc.local

1/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
2echo "/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf" >> /etc/rc.local

注:步骤3中,密码文件的权限一定要设成600,记得在iptables上开启rsync server使用的端口873

二、安装inotify-tools

1、到git上下载最新的inotify安装。其项止地址为:https://github.com/rvoicilas/inotify-tools/wiki

2、下载安装

1wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
2tar zxvf inotify-tools-3.14.tar.gz
3cd inotify-tools-3.14
4./configure --prefix=/App/inotify
5make && make install

3、inotify 可以监视的文件系统事件

  • IN_ACCESS,即文件被访问
  • IN_MODIFY,文件被 write
  • IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
  • IN_CLOSE_WRITE,可写文件被 close
  • IN_CLOSE_NOWRITE,不可写文件被 close
  • IN_OPEN,文件被 open
  • IN_MOVED_FROM,文件被移走,如 mv
  • IN_MOVED_TO,文件被移来,如 mv、cp
  • IN_CREATE,创建新文件
  • IN_DELETE,文件被删除,如 rm
  • IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
  • IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
  • IN_UNMOUNT,宿主文件系统被 umount
  • IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
  • IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
  • 注:上面所说的文件也包括目录。

4、inotify相关参数

inotify相关的系统参数配置有三个

1/proc/sys/fs/inotify/max_queued_events
2/proc/sys/fs/inotify/max_user_instances
3/proc/sys/fs/inotify/max_user_watches

平时需要更改的是最后一个参数,即监控的文件上限数。如果监控的文件数目巨大,需要根据实际情况适当增加此值得大小。如:

1echo 650000> /proc/sys/fs/inotify/max_user_watches

三、完成rsync+inotify整合

配置脚本sdirdata.sh,内容如下:

 1#!/bin/bash
 2host1=192.168.1.30
 3host2=192.168.1.31
 4host3=192.168.1.32
 5host4=192.168.1.33
 6host5=192.168.1.34
 7user=test
 8src=/App/sdir/SDIR_ROOT/
 9/App/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e close_write,create,move,delete,attrib $src | while read files
10        do
11        /usr/bin/rsync -rdvzP  --delete --password-file=/etc/rsyncd/rsyncd.password  $src $user@$host1::sdir
12        /usr/bin/rsync -rdvzP  --delete --password-file=/etc/rsyncd/rsyncd.password  $src $user@$host2::sdir
13        /usr/bin/rsync -avzP  --delete --password-file=/etc/rsyncd/rsyncd.password  $src $user@$host3::sdir
14        /usr/bin/rsync -avzP  --delete --password-file=/etc/rsyncd/rsyncd.password  $src $user@$host4::sdir
15        /usr/bin/rsync -avzP  --delete --password-file=/etc/rsyncd/rsyncd.password  $src $user@$host5::sdir
16        echo "${files} was rsynced " >> /tmp/rsync.log  2>&1
17   done

其中,30和31为windows服务器,后面三台为linux服务器,在1.35上运行sh sdirdata.sh &运行文件监控与备份同步。一旦inotify监测到文件变更,rsync会立即同步到各服务器。