1.inotify简介

  inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率、细粒度、异步地监控机制, 用于通知用户空间程序的文件系统变化。可利用它对用户空间进行安全、性能、以及其他方面的监控。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。如果内核版本不低于 2.6.13,系统就支持 inotify。 如果存在
/usr/include/sys/inotify.h 文件, 表明内核支持 inotify。

[root@localhost ~]#  ls -l /proc/sys/fs/inotify/     #列出文件目录,出现下面的内容,说明服务器内核支持inotify
total
-rw-r--r-- root root Oct : max_queued_events
-rw-r--r-- root root Oct : max_user_instances
-rw-r--r-- root root Oct : max_user_watches

2.inotify的作用

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

  

  3.inotify实现数据实时同步原理

  无论是手动执行 rsync 还是把 rsync 客户端发出的数据同步请求命令做成周期性任务计划, 每隔一段时间不管有没有数据变化都发出一次数据同步请求命令, 同步一次数据。 服务端和客户端都有时间差。所以, 使用内核提供的 inotify 机制,当数据发生改变时(删除、修改等)就触发 rsync 客户端发出数据 同步请求。 从而实现数据的实时传输。
rsync + inotify 机制实现的两台服务器数据同步如下图如示:

  4.inotify的安装与使用

[root@localhost ~]# yum install -y inotify-tools
[root@localhost ~]# inotifywait -mrq --timefmt '%d%m%Y %H:%M' --format '%T %w%f' -e create /backup #创建对目录/backup的监控
: /backup/.txt
: /backup/.txt
: /backup/.txt
: /backup/.txt
: /backup/.txt

  5.inotify之inotifywait命令详解

参数详解:
-r:递归查询目录
-q:打印监控时间信息
-m:始终保持时间监听状态
--excludei: 排除文件或目录时,不区分大小写。
--timefmt: 指定时间输出的格式
--format: 打印使用指定的输出类似格式字符串
a、 %w:显示被监控文件的文件名;
b、 %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
c、 %T:使用--timefmt 选项中自定义的时间格式;
d、 %e 表示发生的事件
e、 %Xe 事件以“X”分隔
-e:指定需要监控的事件
access: 文件或目录被读取
modify: 文件或目录内容被修改
attrib: 文件或目录属性被改变
close: 文件或目录封闭,无论读/写模式
open:文件或目录被打开
move_to:文件或目录被移动到另外一个目录
move:文件或目录被移动另一个目录或从另一个目录移动到当前目录
create:文件或目录被创建在当前目录
delete:文件或目录被删除
unmount:文件系统被卸载
常用组合:close_write,modify,delete,create,attrib

  6.编写监控脚本

[root@nfs scripts]# vim inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq '%w%f' -e close_write,modify,delete,create /backup \
| while read line
do
cd /backup && rsync -azP ./ rsync_bakup@192.168.0.175::backup/ --password-file=/etc/rsync.password >/dev/null >&
done
exit
[root@nfs scripts]# sh inotify.sh & #<==运行脚本监控/backup
[root@nfs scripts]# touch /backup/{..}.log #<==NFS上创建文件进行测试
[root@backup backup]# ll #<==备份服务上查看是否备份成功
total
-rw-r--r-- rsync rsync Oct : .log
drwxr-xr-x rsync rsync Oct : 192.168.0.165
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
-rw-r--r-- rsync rsync Oct : .log
[root@nfs scripts]# echo "/bin/bash /server/scripts/inotify.sh &" >> /etc/rc.local #<==设置开机启动

  7.修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events =
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches =
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances =
修改参数:
sysctl -w fs.inotify.max_queued_events=""
sysctl -w fs.inotify.max_user_watches=""
sysctl -w fs.inotify.max_user_instances=""
vim /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=
fs.inotify.max_user_watches=
fs.inotify.max_user_instances=
:wq! #保存退出
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:
每个用户创建inotify实例最大值
【inotify在实际生产环境中,对于50-200KB的文件,inotify的最发并发量为200-,如果客户端写入速度大于这个量,将会造成短暂的延迟】

  8.总结

 rysnc+inotify实时备份流程:
a.实现从NFS客户端到rsync服务端的rsync的部署
b.实现从NFS客户端对NFS目录文件系统时间的实时监控
c.当监控到NFS目录文件系统事件变化后,触发rsync推送变化的文件

 高并发数据实时同步方案:
()inotify(sersync)+rsync,是文件级别
()drbd文件系统级别,基于block块文件
()第三方软件的同步功能:
mysql同步,oracle,mongodb
()程序双写,直接写入两台服务器
()业务逻辑解决(读写分离,备读不到,读主)

最新文章

  1. 【转】Hive内部表、外部表
  2. win7下python3.4 ImportError: No module named &#39;MySQLdb&#39;错误解决方法
  3. 如何创建 CSS
  4. h5自动生成工具
  5. 分享一下怎么开发一款图片视频类App,秒拍和prisma
  6. meizu mx4 usb调试
  7. uva 11489
  8. android用异步操作AsyncTask编写文件查看器
  9. bigData Ecosystem Unscramble
  10. 谷歌识图、google识图如何知道图片相似?
  11. C语言中的system函数參数具体解释
  12. js循环生成多个easyui datagrid数据网格时,初始化表格
  13. Effective Java 第三版——4. 使用私有构造方法执行非实例化
  14. Oracle通过JOB定时执行存储过程实现两表数据比对
  15. 1.1 NCE21 Daniel Mendoza
  16. 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)
  17. JSED204B
  18. 019 python面相对象编程
  19. centos7 安装maven
  20. AtCoder Grand Contest 018 E Sightseeing Plan

热门文章

  1. pythone 请求响应字典
  2. tcp 面向连接
  3. MySQL查询时强制区分大写和小写
  4. Android Studio 学习之 Android SDK快速更新
  5. fastjson反序列化TemplatesImpl
  6. [Python 模块] logging模块、Logger类
  7. python学习day24 项目目录结构
  8. Mybatis 插件
  9. Kafka个人总结
  10. 有关集合的foreach循环里的add/remove