于2017.04.21 从新浪博客搬迁过来

----------------------------------------------------------------


   在上一次中说了rsync的简单搭建和配置、一个用rsync来简单的进行文件异地备份的案例。相比cp、scp、tar 这些备份方式,rsync多了安全性、快捷性、增量备份等优点;通过rsync可以备份一些实时性不高的数据,但在系统越来越大的情况下 rsync也暴露出了很多不足的地方,比如:文件数量太大后达到百万甚至千万的时候,扫描文件是非常耗时的,对于实时性非常高的同步就非常低效了。

 

       在这样的情况下inotify就出现了,inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,inotify需要内核版本至少2.6.13,通过它来监控文件系统的各种变化,文件有变动的时候触发rsync,来解决rsync实时性的问题。下面是一个实验:

 

A服务器ip:192.168.5.120   (rsync服务端)  web服务器

B 服务器ip:192.168.5.147   (rsync 客户端) 内容发布机

 

Inotify需要安装在rsync的客户端服务器上

一、            安装inotify-tools工具

1.      检测内核是否支持inotify

[root@bogon aa]# ll /proc/sys/fs/inotify/

-rw-r--r-- 1 root root 0 Jan  6 01:20 max_queued_events

-rw-r--r-- 1 root root 0 Jan  6 01:20 max_user_instances

-rw-r--r-- 1 root root 0 Jan  6 01:20 max_user_watches

       如果有以上3条输出表示系统默认支持inotify

2.      下载inotify

wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

tar -zxvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure

Make && make install

在安装完成后会生成两个命令

[root@bogon inotify-tools-3.14]# ll /usr/local/bin/inotifywa*

-rwxr-xr-x 1 root root 47104 Jan  6 01:31 /usr/local/bin/inotifywait

-rwxr-xr-x 1 root root 43418 Jan  6 01:31 /usr/local/bin/inotifywatch

 

3.      Inotify的相关参数

在这个目录下/proc/sys/fs/inotify/

max_queued_events  在调用inotify_init时分配到inotify instance 中可排队的最大值

max_user_instances  每一个real user ID可创建的inotify instances 数量上限

max_user_watches   可实时监控的文件最大数目。在监控文件数量巨大的时候应该增加此值的大小

echo “1000000” >/proc/sys/fs/inotify/max_user_watches

 

inotifywait 是一个监控等待事件,可以通过shell脚本来调用它。

-m 表示监听的状态

-r 表示递归查询目录

-q 表示打印监控事件

-e 指定要监控的事件,常见的事件有modify delete create attrib

             

4.      建立shell脚本来监控文件变化

Vim inotifywait.sh

#! /bin/bash

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --forma '%T %w%f%e' -e modify,delete,create,attrib /data/www/ \

| while read files

 do

 /usr/bin/rsync -vzrtopg --delete --progress --password-file=/root/rsyncd.secrets /data/www/ rsync@192.168.5.120::www

  echo "${files} was rsynced" >>/tmp/rsync.log 2>&1

      done

 

--timefmt 指定时间输出格式

--foemat 指定文件变化的详细信息

 

在某些时间会遇到写入的文件很大时,inotify会输出大量的该文件被更新的信息,不断的触发rsync执行同步操作,占用大量资源;这个时间可以修改监控事件,修改为“-e clost_write,delete,create,attrib”

 

              将脚本加入开机启动并运行脚本

              echo “/bin/sh /data/inotifywait.sh &” >>/etc/rc.local

              chmod 755 /data/inotifywait.sh

              /bin/sh /data/inotifywait.sh &

             

5.      测试同步功能

在B服务器的/data/www/ 目录下新建一个文件,在A服务器马上就能看见这个文件已经同步过去了。

 

Over~~~