2.7.4 rsync+Inotify实现数据的实时同步更新(1)
1.rsync的优点与不足
大家通过上面的描述和实验应该已经了解rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期地备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出了更好的要求,rsync在高端业务系统中也逐渐暴露出了很多的不足之处:首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时地去监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致的情况,无法在应用故障时完全恢复数据。
基于以上原因,考虑采用rsync+inotify,这样就可以解决这些问题了。
2.初识Inotify
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种细微事件。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样一个第三方软件。
在上面章节中,我们讲到,rsync可以实现触发式的文件同步,但是通过Crontab守护进程方式触发,同步的数据和实际数据会有差异,而Inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这就刚好解决了同步数据的实时性问题。
3.安装inotify工具inotify-tools
由于inotify特性需要Linux内核的支持,在安装inotify-tools前先要确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入对inotify的支持,也可以用如下方法来判断内核是否支持inotify(服务器系统为Centos5.5 x86_64):
然后我们通过ls来查看是否存在/proc/sys/fs/inotify目录,如下所示:
- uname -r
- 2.6.18-194.el5
- ls -lsart /proc/sys/fs/inotify/
- 总计 0
- 0 dr-xr-xr-x 7 root root 0 06-16 00:02 ..
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_watches
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_instances
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_queued_events
- 0 dr-xr-xr-x 2 root root 0 06-21 11:15 .
通过以上显示我们明白,Centos5.5 x86_64是支持inotify的。
4.inotify可以监控的文件系统事件
Inotify是文件系统事件监控机制,是dnotify的有效替代品(dnotify是较早内核支持的文件监控机制)。Inotify是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。
Inotify可以监视的文件系统事件包括:
IN_ACCESS:
即文件被访问。
IN_MODIFY:
文件被write。
IN_ATTRIB:
文件属性被修改,如chmod、chown、touch等。
IN_CLOSE_WRITE:
可写文件被close。
IN_CLOSE_NOWRITE:
不可写文件被close。
IN_OPEN:
文件被open。
IN_MOVED_FROM:
文件被移走,如mv。
IN_MOVED_TO:
文件被移来,如mv、cp。
IN_CREATE:
创建新文件。
IN_DELETE:
文件被删除,如rm。
IN_DELETE_SELF:
自删除,即一个可执行文件在执行时删除自己。
IN_MOVE_SELF:
自移动,即一个可执行文件在执行时移动自己。
IN_UNMOUNT:
宿主文件系统被umount。
IN_CLOSE:
文件被关闭,等同于(IN_CLOSE_WRITEIN_CLOSE_NOWRITE)。
IN_MOVE:
文件被移动,等同于(IN_MOVED_FROMIN_MOVED_TO)。
注意 上面所说的文件也包括目录。