rsync+inotify是一个比较常用的实时同步解决方案,但是它并不是在所有的场景中都适用的,rsync+inotify比较适用的是在10台以下的一些小规模web集群中实时同步,不过在使用rsync+inotify解决方案和日常使用rsync不同,在rsync+inotify中rsync服务端需要部署多个而客户端只有一个,在rsync的客户端上做为日常内容发布的服务器从而由它把数据推送至各个各个rsync的服务端上。其中用来监控文件系统变化的工具是inotify-tools,在rsync的客户端上安装了inotify-tools后指定需要监控的文件路径,在被监控路径下文件发生变化后就可以根据相关的信息用来触发rsync来做文件推送。在Linux下支持inotify的内核最小为2.6.13,可以使用uname -r可以查看,现在Centos5以上都是是支持的都是在2.6.18以上的所以一般来说内核都是支持的。安装也很简单,在配置好epel的源后可以通过yum进行安装:yum -y install inotify-tools,在安装好后会有2个二进制文件分别是inotifywait和inotifywatch,其中用于监控文件变化的就是inotifywait,而inotifywait所使用的参数选项也很简单:

-m是要持续监视变化。 
-r使用递归形式监视目录。 
-q减少冗余信息,只打印出需要的信息。 
-e指定要监视的事件列表。 
--timefmt是指定时间的输出格式。 
--format指定文件变化的详细信息。

所以可以通过脚本挂在后台实时监控指定目录文件用来触发rsync做文件推送:

#!/bin/bash
#rsync_inotify.sh
port=873
src_dir="/data/www/"
rsyncd_user="username"
rsyncd_host="192.168.2.1"
DEST_name="backup"
password_file="/etc/.rsync.passwd"

inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %Xe %w%f' -e modify,delete,create,attrib ${src_dir} | while read line
do
    file=$(echo $line | awk '{print $4}')
    dir=$(dirname $file)
    if [ -f $file ];then
        rsync -vzrLtopg --progress --delete --port=${port} ${file} --password-file=${password_file} ${rsyncd_user}@${rsyncd_host}::${DEST_name}
    else
        cd $dir && rsync -vzrLtopg --progress --delete --port=${port} ./ --password-file=${password_file} ${rsyncd_user}@${rsyncd_host}::${DEST_name}
    fi
done

这样再把脚本后台启动后加入开机启动文件/etc/rc.local文件中,使得下次在服务器重启后还会生效:

nohup /usr/local/scripts/rsync_inotify.sh > /dev/null &

当然用inotify以外其实我们还可以利用crontab中定时每隔一定时间内进行一次rsync也能实现