在Centos5.9下通过rsync+inotify实现数据的实时备份

一.rsync的不足

随着生产规环境的不断扩大,对数据的安全性和可靠性提出了更好的要求,rsync在对实时性要求较高的业务系统中也逐渐暴露了很多的不足之处。首先,rsync同步数据时,需要扫描文件系统或目录下的所有文件进行比对,然后进行增量传输。如果文件数量过大,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中的很少一部分,因此rsync是非常低效的一种方式。其次,rsync不能实时监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端可能出现数据不一致的情况,无法在出现故障时完全恢复数据。基于以上原因,采用rsync+inotify可以解决这些问题。

二.什么是inotify

inotify是一种文件变化通知机制,Linux内核从2.6.13版本起,引了对inotify的支持。通过inotify可以监控文件系统中添加、删除、修改等各种细微事件,利用这个内核接口,inotify-tools可以监控文件系统的各种变化。一旦文件发生了变动时,就会触发rsync同步,相对于rsync而言,这个过程是主动的,更好的解决了数据同步的实时性问题。

三.安装inotify-tools

由于inotify需要Linux内核的支持,在安装inotify-tools之前,请确认Linux系统内核是否高于2.6.13版本,是否支持inotify特性。可以用如下方法判断是否支持inotify。

[root@localhost ~]# uname -r
2.6.18-348.el5
[root@localhost ~]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Dec  4 17:29 max_queued_events
-rw-r--r-- 1 root root 0 Dec  4 17:29 max_user_instances
-rw-r--r-- 1 root root 0 Dec  4 17:29 max_user_watches

从上面的输出可以得知,系统可以支持inotify特性。现在可以通过源码安装inotify-tools了。由于我是最小化安装的Linux系统,首先要通过yum安装gcc 、gcc-c++、automake、autoconf软件包,以便源码能够顺利编译。

[root@localhost src]# tar xzf inotify-tools-3.14.tar.gz
[root@localhost src]# cd inotify-tools-3.14
[root@localhost inotify-tools-3.14]# ./configure
[root@localhost inotify-tools-3.14]# make && make install
[root@localhost ~]# ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 47224 Dec  4 17:50 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 43570 Dec  4 17:50 /usr/local/bin/inotifywatch

安装inotify-tools完成后,会在/usr/local/bin目录下生成inotifywait和inotifywatch两个指令。inotifywait用于等待文件或文件集上的一个特定事件,可以监控文件任何文件和目录设置,并且可以递归地监控整个目录树;inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生的次数等信息。

四.rsync+inotify的配合使用

可以将rsync+inotify放入同一个shell脚本中,首先通过inotify主动监控目录文件,一旦文件产生了由inotify定义的事件,就会触发rsync的守护进程,对被监控的目录进行相应的同步。脚本内容如下所示:

#!/bin/bash
/usr/local/bin/inotifywait -mrq --timefmt '%Y/%m/%d %H:%M' --format '%T %w%f %e' -e delete,create,attrib,close_write /src | while read files
do
/usr/bin/rsync -vrztopg --delete --progress /src [email protected]::src --password-file=/etc/rsyncd.passwd
echo "${files} was rsyncd" >> /var/log/rsyncd.log 
done

脚本中相关参数解释如下:

-m:即monitor,表示始终保持事件监听状态。

-r:即recursive,表示递归查询目录。

-q:即quiet,表示打印出监控事件。

--timefmt:指定时间的输出格式。

--format:指定文件变化信息的输出格式。

-e:即event,定义inotify要监控的事件。

将该脚本文件先放入后台执行。

[root@localhost ~]# nohup  sh /root/inotify.sh &

最后将该命令加入开机启动项中。

[root@localhost src]# echo " nohup  sh /root/inotify.sh &" >> /etc/rc.d/rc.local

按照以上步骤,rsync+inotify的配置就已经完成了。经过测试,在源目录对文件进行新增,删除,权限变更等操作,目标目录也会同步变更操作。

你可能感兴趣的:(rsync,inotify)