随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。
首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。
基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。
一、Inotify 简介
inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。
在使用rsync首次全量同步后,结合inotify对源目录进行实时监控,只有有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效使用!
二、Inotify 安装
[root@nfs /]# uname -r
3.10.0-1062.el7.x86_64
[root@nfs /]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_queued_events # 设置inotify实例事件队列可容纳的事件数
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_user_instances #设置每个用户可以运行inotify工具命令的进程数
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_user_watches #设置inotify可以监视的文件数量
#说明:有这三个文件证明系统支持inotify
#查看三个文件的默认参数
[root@nfs /]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@nfs /]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@nfs /]# cat /proc/sys/fs/inotify/max_user_watches
8192
#安装Inotify
[root@nfs /]# yum install -y inotify-tools
三、Inotify 主要命令
1. Inotifywait命令
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
Inotifywait命令常用参数
命令参数 | 命令说明 |
-m, --monitor | 始终保持事件的监听状态 |
-r --recursive | 递归查询目录 |
-q, --quiet | 输出信息少(只打印监控的事件信息) |
-d, –daemon | 跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog |
-o, –outfile | 输出事情到一个文件而不是标准输出 |
-s, –syslog | 输出错误信息到系统日志 |
--excludei <pattern> | 排除文件或者目录,不区分大小写 |
--timefmt <fmt> | 自定义时间输出格式 常用的时间格式: %d 日 %m 月 %y 年 %H:%M 时:分 |
--format <fmt> | 自定义inotifywait的输出格式, %w 事件发生时,监控文件或目录的名称信息 %f 事件发生时,将显示监控目录下触发事件的文件 或目录信息,否则为空 %e 显示发生的事件信息,将不同事件信息用逗号隔 开 %T 输出时间格式中定义的时间格式信息,通过 --timefmt 选项的语法格式进行设置 %Xe 显示事件发生的信息,不用的事件用X进行分 ,可以修改X为指定的分隔符 |
-e <event> | 监听指定事件,有几个常见的事件如下: access:读取文件或目录内容 modify:修改文件或者目录内容 attrib:文件或者目录属性改变 close_write(常用):以可写方式打开的文件被关闭 close_nowrite:以只读方式打开的文件被关闭 open:文件或目录被打开 moved_to(常用):文件或目录移动到 moved_from:文件从目录移动 move:移动文件或目录移动到监视目录 create(常用):在监视目录下创建文件或目录 delete(常用): 删除监视目录下的文件或目录 delete_self: 删除目录下的文件或目录 unmount :卸载文件系统 |
2. Inotifywatch命令
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
四、Inotify优化
[root@nfs /]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events
# 单进程可以监控的文件数量
[root@nfs /]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches
# 队列容纳事件的数量
#说明:意思配置文件重启系统会失效,需要放到rc.local文件中