1,背景介绍
Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。
inotify:下载地址:http://sourceforge.net/projects/inotify-tools/
版本号:3.1.13
SourceForge.net,又称SF.net,是开源软件开发者进行开发管理的集中式场所。SourceForge 是全球最大开源软件开发平台和仓库,网站建立的宗旨,就是为开源软件提供一个存储、协作和发布的平台。SourceForge 上拥有大量非常优秀的开源软件,事实上,这些软件完全可以代替一些商业软件。
2,实战
2.1 查看系统是否支持inotify,优化内核参数
- 判断系统是否支持inotify,---内核是否高于2.6.13
[root@cdncenter inotify-tools-3.13]# uname -r 2.6.18-194.el5
- 判断系统是否支持inotify,---查看内核参数,在proc下面存在下面三个文件
[root@cdncenter inotify-tools-3.13]# ll /proc/sys/fs/inotify/ 总计 0 -rw-r--r-- 1 root root 0 12-28 00:10 max_queued_events -rw-r--r-- 1 root root 0 12-28 00:10 max_user_instances -rw-r--r-- 1 root root 0 12-28 00:10 max_user_watches
在linux内核中,默认的inotify机制提供了三个调控参数:
- max_queued_events #表示监控事件队列
- max_user_instances #表示最多监控实例数
- max_user_watches #表示每个实例最多监控文件数
[root@cdncenter inotify]# cat max_queued_events 16384 [root@cdncenter inotify]# cat max_user_instances 128 [root@cdncenter inotify]# cat max_user_watches 8192
注:当要监控的目录、文件数量较多或者变化较频繁时,要加大这三个参数的值。
例如:可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为9000000(建议大于监控目标的总文件数)。
[root@cdncenter ~]# vim /etc/sysctl.conf #以文件最后,添加以下内容 fs.inotify.max_queued_events = 32768 fs.inotify.max_user_instances = 1024 fs.inotify.max_user_watches = 90000000 [root@cdncenter ~]# sysctl -p #使修改后的sysctl.conf文件生效
查看是否修改成功:
[root@cdncenter inotify]# cat max_user_watches 90000000 [root@cdncenter inotify]# cat max_user_instances 1024 [root@cdncenter inotify]# cat max_queued_events 32768
2.2 安装inotify工具
1,使用sftp将inotify-tools-3.13.tar.gz上传到/usr/local/src目录下
2,解压软件 tar –zxvf inotify-tools-3.13.tar.gz
3,编译安装 ./configure && make –j4 && make install -j4 意思是:使用4个CPU来编译,编译速度大大提升
2.3 inotify测试
inotifywait命令基本用法
[root@xuegod63 ~]# inotifywait -h
常用参数:
-e 用来指定要监控哪些事件。
这些事件包括: create创建,move移动,delete删除,modify修改文件内容,attrib属性更改。
-m 表示持续监控
-r 表示递归整个目录
-q 表示简化输出信息
使用inotifywait命令监控目录/mpeg/mirrors/yumwarehouse/rhel6发生的变化。然后在另一个终端向/mpeg/mirrors/yumwarehouse/rhel6目录下添加文件、移动文件,查看屏幕输出结果。
终端1:
[root@cdncenter yumwarehouse]# inotifywait -mrq -e create,move,delete,modify /mpeg/mirrors/yumwarehouse/rhel6/ /mpeg/mirrors/yumwarehouse/rhel6/ CREATE test /mpeg/mirrors/yumwarehouse/rhel6/ MODIFY test /mpeg/mirrors/yumwarehouse/rhel6/ MODIFY test /mpeg/mirrors/yumwarehouse/rhel6/ DELETE test /mpeg/mirrors/yumwarehouse/rhel6/ CREATE test /mpeg/mirrors/yumwarehouse/rhel6/ MOVED_FROM test /mpeg/mirrors/yumwarehouse/rhel6/ MOVED_TO test1
终端2:
[root@cdncenter rhel6]# touch test [root@cdncenter rhel6]# echo "111" >test [root@cdncenter rhel6]# rm -rf test [root@cdncenter rhel6]# touch test [root@cdncenter rhel6]# mv test test1
使用inotifywait输出的监控结果中,每行记录中依次包括目录、事件、文件。那木根据此可以识别变动情况,编写触发式同步脚本:
2.4 编写触发式同步脚本
SRC_address=10.80.0.1
SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/
DST_address=10.80.0.161
SRC_dir=/home/rpmpackage/saltmaster/
第一步,同步时不需要输入密码:10.80.0.1发生变化后,直接将发生变化的数据同步到10.80.0.161,同步时不需要输入密码
[root@cencenter~]# ssh-keygen [root@cencenter~]# ssh-copy-id root@10.80.0.161 [root@cencenter~]# ssh 10.80.0.161 Last login: Wed Nov 12 17:51:35 2017
第二步编写触发式同步脚本
前提:参考以下shell脚本:将输出结果赋给变量,并打印
[root@cdncenter scripts]# cat aaa.sh #!/bin/sh echo aaa bbb ccc |while read D E F do echo $D echo $E echo $F done
执行结果
[root@cdncenter scripts]# sh aaa.sh aaa bbb ccc
实战脚本,监控10.80.0.1服务器的=/mpeg/mirrors/yumwarehouse/rhel6/,一旦发生变化,将增量数据同步给10.80.0.161的=/home/rpmpackage/saltmaster/目录
[root@cdncenter scripts]# cat inotify.sh #!/bin/sh SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/ DST_address=10.80.0.161 DST_dir=/home/rpmpackage/saltmaster/ inotifywait -mrq -e create,move,delete,modify ${SRC_dir} |while read D E F do rsync -azvP --delete --progress ${SRC_dir} root@${DST_address}:${DST_dir} done
[root@cdncenter scripts]# cat inotify_rsync.sh #!/bin/sh SRC_dir=/mpeg/mirrors/yumwarehouse/rhel6/ DST_address=10.80.0.161 DST_dir=/home/rpmpackage/saltmaster/ inotifywait -mrq -e create,move,delete,modify ${SRC_dir} |while read D E F do a=`pgrep rsync|wc -l` if [ $a -le 3 ];then /usr/bin/rsync -azvP --delete --progress ${SRC_dir} root@${DST_address}:${DST_dir} fi done
注:进程数大于3个时,暂停同步
---rsync完结