紧接上一篇文件中rsync实现数据同步的配置,这次采用rsync+inotify的方式实现数据实时同步,具体的配置和上次保持一致。
事先的准备,2台Redhat 6.3虚拟机,主机名和IP地址如下:
mylinux 192.168.198.100 rsync服务器端
mylinux2 192.168.198.101 rsync客户端
首先查看服务器是否支持inotify(目前基本上大多数服务器都支持),使用如下命令进行查看:
ll /proc/sys/fs/inotify/
如果执行上面的命令结果会列举上图中的三项,那么就表示支持inotify;反之,则不支持。
一、rsync服务端操作
rsync服务端的操作包括创建rsync配置文件和认证用户密码文件,最后启动rsync守护进程,因为在上一篇中已经详细说明过,所以这里也不再赘述。只是确认进程启动即可。
二、rsync客户端操作
rsync客户端的配置也不再重复,按照之前的操作,能正常在两台虚拟机之间同步数据即可。下面主要讲inotify的操作。
登录到mylinux2上,然后下载inotify的安装包,解压。
切换到解压缩后的目录中,使用编译命令安装,
# ./configure --prefix=/usr/local/inotify/
# make && make install
安装完成后,在/usr/local/inotify/bin/目录下会生成如下两个文件,这两个文件就是要执行inotify的主要文件了。
接着创建inotify执行脚本inotify.sh,脚本内容如下:
#bin/bash
#
host01=mylinux
src=/tmp/test/
dst=backup
user=rsync_backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and folder"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src |while read file
do
cd $src && rsync -avz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
相关注解如下:
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e close_write,modify,delete,create,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
/usr/bin/rsync -avH --delete --progress --password-file
-a 存档模式
-H 保存硬连接
-delete 删除于多余文件
--password-file 密码文件
今天参数可以man rsync
要排除同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加--exclude或--excludei参数,具体查看man inotifywait。
--exclude-from="/usr/local/inotify/logs/rules.txt" 可以匹配过滤文件:
如排除包括 .svn的文件:
#cat /usr/local/inotify/logs/rules.txt
- *.svn*
inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read file” 写法细化了返回值,对读取到的文件进行下面的循环操作。
启动该脚本,使用sh inotify.sh &使它后台运行,可以使用查看进程的方式查看inotify进程是否启动。
在mylinux2上批量创建几个文件,然后查看。
再到mylinux上查看/backup/目录下,已经同步到这几个文件了。
在mylinux2上删除刚才创建的这几个文件,然后再到mylinux上查看,
在mylinux上已经看不到刚才删除的文件了。下面在mylinux2上执行以下命令,批量创建100个目录和100个文件,
for id in `echo {0..100}`;do mkdir -p /tmp/test/$id && touch /tmp/test/$id/$id.txt;done
然后到mylinux上查看/backup/目录,
通过上图已经看到,在mylinux2上批量创建的100个目录和100个文件已经同步到mylinux上了,这也说明rsync结合inotify实现了数据实时同步。