于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~~~