inotify+rsync的组合使用简单介绍

inotify简介:

         inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。国人周洋在金山公司开发的sersync。

         inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通知诸如cron等的伦旭机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。

  rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync的不足之处,取长补短。

案例:(测试数据)

实时热备服务器 192.168.43.200

netserver-inotify服务器 192.168.43.117

---------------------------------------------------------------------------------------------------------------

在实时热备服务器上配置:

rsync-server服务端配置:截图略,详细配置见 https://www.cnblogs.com/su-root/p/10086190.html

①vi /etc/rsyncd.conf  添加如下代码↓↓↓↓↓↓

#Rsync server

#created by bqh 21:30 2018-12-05
#rsyncd.conf start
uid = rsync                                   //客户端连备份服务器具备rsync的用户权限
gid = rsync                                   //客户端连备份服务器具备rsync的用户权限 
use chroot = no                            //程序出现bug会定向为一个空目录,安全方面。
max connections = 2000            //客户端连接数。一般设置大于连接数。
timeout = 600                             //设置客户端连接超时600秒,超时剔除。
pid file = /var/run/rsyncd.pid       //pid进程号
lock file = /var/run/rsync.lock     //锁文件
log file = /var/log/rsyncd.log      //rsync日志文件
ignore errors                            //忽略错误
read only = false                     //只读,true为可读写
list = false                                                   //可以远程列表
hosts allow = 192.168.43.0/24                 //允许什么网段访问
hosts deny = 0.0.0.0/32                            //一般局域网不用,公网可能用,但一般用vpn
auth users = rsync_backup                       //认证用户名,远程连接的用户。
secrets file = /etc/rsync.password             //存放用户和密码的文件,远程用户的密码
#####################################
[backup]                                                   //共享模块调用path服务
comment = backup server by bqhboy 21:40 2018-12-05
path = /backup                                        //共享目录地址

②创建一个虚拟用户: 

useradd rysnc –s /sbin/nologin –M

③创建共享目录及属主:
mkdir /backup

chown –R rsync /backup

④给虚拟用户名设置密码并存放文件中: 
echo “rsync_backup:123” >/etc/rsync.password

⑤给服务端虚拟用户密码文件设置权限:
chmod 600 /etc/rsync.password

⑥启动服务:rsync --daemon

查看服务:ss -lntup|grep rsync 
                netstat -lntup|grep rsync
                ps -ef|grep rsync|grep -v grep
                lsof -i :873

⑦加入开机自启动:

echo "rsync --daemon" >>/etc/rc.local
cat /etc/rc.local

在netserver-inotify服务器 (客户端) 上配置rsync如下:

[root@nfs-server ~]# echo 123 >/etc/rsync.password

[root@nfs-server ~]# cat /etc/rsync.password

123

[root@nfs-server ~]# chmod 600 /etc/rsync.password

[root@nfs-server ~]# ll /etc/rsync.password

-rw------- 1 root root 4 12月 10 21:53 /etc/rsync.password

在客户端测试一下是否配置成功:将客户端/data目录下所有文件推送到服务端/backup/目录下

[root@nfs-server ~]# ll /data/

总用量 0

-rw-r--r-- 1 nfsnobody nfsnobody 0 12月  3 21:49 118.txt

-rw-r--r-- 1 nfsnobody nfsnobody 0 12月  2 17:47 c.txt

[root@nfs-server ~]# rsync -avz /data rsync_backup@192.168.43.200::backup --password-file=

/etc/rsync.password

sending incremental file list

data/

data/118.txt

data/c.txt

 

sent 172 bytes  received 50 bytes  444.00 bytes/sec

total size is 0  speedup is 0.00

[root@nfs-server ~]#

此时我们再热备服务端查看是否推送过来了:

接下来我们yum安装inotify-tools

 ll /proc/sys/fs/inotify/   如果该目录有下面三个文件代表系统支持inotify,Linux内核版本为2.6.13开始支持inotify。

max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)

max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。

max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

安装inotify

yuminstall inotify-tools -y

一共安装了两个工具(命令),即inotifywait和inotifywatch

inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用。

inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统一。

ll /usr/bin/inotifywait或inotifywatch

inotifywait 用法:

实时监控/data的所有事件(包括文件的访问,写入,修改,删除等)

inotifywait -rm --timefmt '%y/%m/%d %H:%M' --format '%T %w %e %f' /data/

我们执行上面的命令后,再打开一个窗口在/data目录下搞点事情如下:

此时我们发现窗口已监控到搞的事情:

我们可以写一个脚本监控/data/目录变化(增量)情况,并推送至备份服务器上:

#!/bin/bash

inotify=/usr/bin/inotifywait

$inotify -rm --timefmt '%y/%m/%d %H:%M' --format '%T %w %e %f' /data \

|while read file

do

 cd / &&

  rsync -az ./data rsync_backup@192.168.43.200::backup/ \

  --password-file=/etc/rsync.password

done

我们再打开一个窗口搞点测试事情:

我们再从热备服务器上查看一下是否推送过来了:

脚本我们可以从后台启动并添加到开机启动项里:

echo "/bin/sh /server/scripts/backup.sh &" >> /etc/rc.local   //& 表示从后台开始运行该条命令。

inotifywatch 用法:

统计(60s内)/data目录下文件系统的事件

inotifywatch -v -e access -e modify -t 60 -r /data

我们再打开一个窗口搞点事情如下:

关于inotifywait参数说明:

-h,–help
输出帮助信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile 
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon
跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile 
输出事情到一个文件而不是标准输出。
-s, –syslog
输出错误信息到系统日志
-r, –recursive
监视一个目录下的所有子目录。
-q, –quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude 
正则匹配需要排除的文件,大小写敏感。
–excludei 
正则匹配需要排除的文件,忽略大小写。
-t , –timeout 
设置超时时间,如果为0,则无限期地执行下去。
-e , –event 
指定监视的事件。
-c, –csv
输出csv格式。
–timefmt 
指定时间格式,用于–format选项中的%T格式。
–format 
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

关于inotifywatch参数说明:

-h, –help
输出帮助信息
-v, –verbose
输出详细信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile 
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, –zero
输出表格的行和列,即使元素为空
–exclude 
正则匹配需要排除的文件,大小写敏感。
–excludei 
正则匹配需要排除的文件,忽略大小写。
-r, –recursive
监视一个目录下的所有子目录。
-t , –timeout 
设置超时时间
-e , –event 
只监听指定的事件。
-a , –ascending 
以指定事件升序排列。
-d , –descending 
以指定事件降序排列。

可监听事件:

在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制,根据场景需要优化:

max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

inotify优点:

1.监控文件系统事件变化,通过同步工具实现实时数据同步。

inotify缺点:

1.并发如果大于200个文件(10-100k),同步就会有延迟。

2.监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。

高并发数据实时同步方案:

1.inotify(sersync)+rsync  文件级别

2.drbd  文件系统级别

3.第三方软件同步功能:mysql、oracle等同步功能

4.程序双写

posted @ 2018-12-16 20:41  南清风  阅读(343)  评论(0编辑  收藏  举报