实时备份工具之inotify+rsync
2024-10-21 04:14:56
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
()程序双写,直接写入两台服务器
()业务逻辑解决(读写分离,备读不到,读主)
最新文章
- 【转】Hive内部表、外部表
- win7下python3.4 ImportError: No module named &#39;MySQLdb&#39;错误解决方法
- 如何创建 CSS
- h5自动生成工具
- 分享一下怎么开发一款图片视频类App,秒拍和prisma
- meizu mx4 usb调试
- uva 11489
- android用异步操作AsyncTask编写文件查看器
- bigData Ecosystem Unscramble
- 谷歌识图、google识图如何知道图片相似?
- C语言中的system函数參数具体解释
- js循环生成多个easyui datagrid数据网格时,初始化表格
- Effective Java 第三版——4. 使用私有构造方法执行非实例化
- Oracle通过JOB定时执行存储过程实现两表数据比对
- 1.1 NCE21 Daniel Mendoza
- 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)
- JSED204B
- 019 python面相对象编程
- centos7 安装maven
- AtCoder Grand Contest 018 E Sightseeing Plan