rsync能够实现触发式的文件同步,可是经过crontab守护进程方式进行触发,同步的数据和实际数据会有差别,而inotify能够监控文件系统的各类变化,当文件有任何变更时,就触发rsync同步,这样就能够解决同步数据的实时性问题。linux
1、rsync的优势与不足vim
rsync具备安全性高、备份迅速、支持增量备份等优势,经过rsync能够解决对实时性要求不高的数据备份需求,例如按期的备份文件服务器数据到远端服务器,对本地磁盘按期作数据镜像等。后端
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了不少不足,首先,rsync同步数据时,须要扫描全部文件后进行比对,进行差量传输。若是文件数量达到了百万甚至千万量级,扫描全部文件将是很是耗时的。并且正在发生变化的每每是其中不多的一部分,这是很是低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它能够经过Linux守护进程的方式进行触发同步,可是两次触发动做必定会有时间差,这样就致使了服务端和客户端数据可能出现不一致,没法在应用故障时彻底的恢复数据。基于以上缘由,rsync+inotify能够解决这个问题。安全
2、 初识inotifybash
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):ide
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 能够监视的文件系统事件包括:
注:上面所说的文件也包括目录。
5、rsync+inotify企业应用案例
咱们的后端WEB是二台部署了Nginx的WEB服务器,因为没有共享存储,咱们如今要实现的是对它们的根目录/data/htdocs/www实现即时同步更新。
WebServer1:192.168.1.5,Centos5.5 x86_64 WebServer2:192.168.1.6,Centos5.5 x86_64
根目录均为/data/htdocs/www,自动同步顺序为WebServer2à WebServer1,咱们将WebServer1配置成rsync的服务器端便可
1.咱们首先开始安装inotify-tools
能够到http://inotify-tools.sourceforge.net/下载相应的inotify-tools版本,而后开始编译安装:
cd /usr/local/src tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure &&make && make install
2.WebServer1端
即192.168.1.5的rsync,咱们配置好/etc/rsyncd.conf文件,以下:
[root@server ~0m]# vim /etc/rsyncd.conf uid = nobody gid = nobody user chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [www] path=/data/htdocs/ ignore errors read only = no list = no hosts allow = 192.168.1.0/255.255.255.0 auth users = www secrets file = /etc/rsyncd.password
而后重启xinetd便可,以下所示:
/etc/init.d/xinetd restart
记得二台WEB机器都要配置/etc/rsyncd.passwd文件,rsync的配置过程和原理请你们参考我在51cto.com的rsync配置相关文章,这里就不详细说明了。
3.咱们配置好WebServer2的inotify
让其开机即启动,脚本内容以下:
vim /root/rsync.sh #!/bin/bash src=/data/htdocs/www/ des=www ip=192.168.1.5 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src | while read file do rsync -vzrtopg --delete --progress $src www@$ip::$des --password-file=/etc/rsyncd.password && echo "$src was rsynced" done
脚本相关解释以下:
这个脚本的做用就是经过inotify监控文件目录的变化,进而触发rsync进行同步操做,因为这个过程是一种主动触发操做,经过系统内核完成的,因此,比起那些遍历整个目录的扫描方式,效率要高不少。
而后咱们将此脚本放在/etc/rc.local,即在最后一行添加,/etc/rc.local文件改动后内容以下:
[root@slave www0m]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /root/rsync.sh &
修改rc.local后重启生效,注意最后的“&”不能少,若是不加“&”的话,系统没法重启。
若是文件没法同步的话,也多是rsync.sh脚本写错了,那么能够在命令行界面直接执行:/root/rsync.sh,看是否有语法错误。
4.验证就很容易了
咱们能够在192.168.1.6的机器的/data/htdocs/www目录下新建文件,更改文件内容,咱们很欣慰的发现,192.168.1.5的机器上立刻也会发生相应的改变,就像二台机器是网络Raid-1样,很是方便。
整体说来,rsync+inofity比较适用于没有存储环境的小文件的即时同步更新,若是要更新的文件很是大并且同步的机器数量在10台以上时,我建议仍是以共享存储的方法来解决,若是没有资金购置昂贵的存储,你们不妨考虑下Heartbeat+DRBD+NFS方案来做为咱们的文件服务器。