Rsync(remote sync)远程同步工具,经过rsync能够实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差别同步。咱们能够想象一下,若是服务器的文件数量达到了百万甚至千万量级,那么文件对比将是很是耗时的。并且发生变化的每每是其中不多的一部分,这是很是低效的方式。inotify的出现,能够缓解rsync不足之处,取长补短。算法
ls -l /proc/sys/fs/inotify total 0 -rw-r--r-- 1 root root 0 Nov 1 11:38 max_queued_events -rw-r--r-- 1 root root 0 Nov 1 11:38 max_user_instances -rw-r--r-- 1 root root 0 Nov 1 11:38 max_user_watches #显示这三个文件证实支持
关键参数说明:shell
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有必定的限制
max_user_watches:设置inotifywait或inotifywatch命令能够监视的文件数量(单进程)
max_user_instances:设置每一个用户能够运行的inotifywait或inotifywatch命令的进程数。
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install inotify-tools rpm -qa inotify-tools
一共安装了2个工具,即inotifywait和inotifywatch
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。
inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。bash
下面用列表详细解释一下各个参数的含义服务器
inotifywait参数 | 含义说明 |
---|---|
-r --recursive | 递归查询目录 |
-q --quiet | 打印不多的信息,仅仅打印监控事件的信息 |
-m,--monitor | 始终保持事件监听状态 |
--exclude | 排除文件或目录时,不区分大小写。 |
--timefmt | 指定时间输出的格式 |
--format | 打印使用指定的输出相似格式字符串 |
-e,--event | 经过此参数能够指定须要监控的事件,以下一个列表所示 |
-e :--event的各类事件含义并发
Events | 含义 |
---|---|
access | 文件或目录被读取 |
modify | 文件或目录内容被修改 |
attrib | 文件或目录属性被改变 |
close | 文件或目录封闭,不管读/写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动至另一个目录 |
move | 文件或目录被移动到另外一个目录或从另外一个目录移动至当前目录 |
create | 文件或目录被建立在当前目录 |
delete | 文件或目录被删除 |
umount | 文件系统被卸载 |
开启两个窗口ide
第一个窗口输入以下信息: [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup 第二个窗口输入以下信息: [root@backup backup]# rm -rf chensiqi 此时第一个窗口会出现以下信息: 17 03 11 07 29 /backup/chensiqi #命令说明: -e delete:指定监听的事件类型。监听删除delete事件
第一个窗口输入以下信息: [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup 第二个窗口输入以下信息: [root@backup backup]# rm -rf chensiqi 此时第一个窗口会出现以下信息: 17 03 11 07 29 /backup/chensiqi #命令说明: -e delete:指定监听的事件类型。监听删除delete事件
第一个窗口输入以下信息: inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e close_write /backup 第二个窗口输入以下信息: [root@backup backup]# touch close_write.log [root@backup backup]# echo 111 >> close_write.log [root@backup backup]# rm -f close_write.log 此时第一个窗口会出现以下信息: 17 03 11 07 38 /backup/close_write.log 17 03 11 07 39 /backup/close_write.log #命令说明: -e close_write:指定监听类型。监听文件写模式的关闭。
第一个窗口输入以下信息: [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e moved_to /backup 第二个窗口输入以下信息: 此时第一个窗口会出现以下信息: [root@backup backup]# touch chensiqi [root@backup backup]# mv chensiqi chen [root@backup backup]# mkdir ddddd [root@backup backup]# mv chen ddddd/
#!/bin/bash backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do cd /data rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password done
上边那个脚本效率很低,效率低的缘由在于只要目录出现变化就都会致使我整个目录下全部东西都被推送一遍。所以,咱们能够作以下改动提升效率:工具
#!/bin/bash Path=/data backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do if [ -f $line ];then rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password else cd $Path &&\ rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password fi done
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有必定的限制
max_user_watches:设置inotifywait或inotifywatch命令能够监视的文件数量(单进程)
max_user_instances:设置每一个用户能够运行的inotifywait或inotifywatch命令的进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。测试
实战调整:ui
[root@nfs01 data]# cat /proc/sys/fs/inotify/max_ max_queued_events max_user_instances max_user_watches [root@nfs01 data]# cat /proc/sys/fs/inotify/max_user_watches 8192 [root@nfs01 data]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches [root@nfs01 data]# cat /proc/sys/fs/inotify/max_user_watches 50000000 [root@nfs01 data]# cat /proc/sys/fs/inotify/max_queued_events 16384 [root@nfs01 data]# echo "326790" > /proc/sys/fs/inotify/max_queued_events [root@nfs01 data]# cat /proc/sys/fs/inotify/max_queued_events 326790 [root@nfs01 data]# sysctl -p
10K-100Kspa
每秒100个并发
[root@nfs01 data]# paste inotify_100_server.log inotify_100_backup_server.log > inotify_100.txt [root@nfs01 data]# cat inotify_100.txt 23:05 34227 23:05 34227 23:05 34387 23:05 34387 23:05 35027 23:05 35027 23:05 35587 23:05 35587 23:05 36473 23:05 36473 23:05 36707 23:05 36707 23:05 37587 23:05 37587 如下省略...
Inotify实时并发:
结论:通过测试,每秒200文件并发,数据同步几乎无延迟(小于1秒)