您的位置:首页 > 运维架构 > Linux

Linux学习--rsync+inotify实现数据实时同步

2016-03-23 16:45 791 查看
紧接上一篇文件中rsync实现数据同步的配置,这次采用rsync+inotify的方式实现数据实时同步,具体的配置和上次保持一致。

事先的准备,2台Redhat 6.3虚拟机,主机名和IP地址如下:

mylinux 192.168.198.100 rsync服务器端

mylinux2 192.168.198.101 rsync客户端

首先查看服务器是否支持inotify(目前基本上大多数服务器都支持),使用如下命令进行查看:

<span style="font-family:Microsoft YaHei;font-size:12px;">ll /proc/sys/fs/inotify/</span>




如果执行上面的命令结果会列举上图中的三项,那么就表示支持inotify;反之,则不支持。

一、rsync服务端操作

rsync服务端的操作包括创建rsync配置文件和认证用户密码文件,最后启动rsync守护进程,因为在上一篇中已经详细说明过,所以这里也不再赘述。只是确认进程启动即可。



二、rsync客户端操作

rsync客户端的配置也不再重复,按照之前的操作,能正常在两台虚拟机之间同步数据即可。下面主要讲inotify的操作。

登录到mylinux2上,然后下载inotify的安装包,解压。



切换到解压缩后的目录中,使用编译命令安装,

<span style="font-family:Microsoft YaHei;font-size:12px;"># ./configure --prefix=/usr/local/inotify/
# make && make install </span>



安装完成后,在/usr/local/inotify/bin/目录下会生成如下两个文件,这两个文件就是要执行inotify的主要文件了。



接着创建inotify执行脚本inotify.sh,脚本内容如下:

<span style="font-family:Microsoft YaHei;font-size:12px;">#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	</span>


相关注解如下:

/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个文件,

<span style="font-family:Microsoft YaHei;font-size:12px;">for id in `echo {0..100}`;do mkdir -p /tmp/test/$id && touch /tmp/test/$id/$id.txt;done</span>




然后到mylinux上查看/backup/目录,



通过上图已经看到,在mylinux2上批量创建的100个目录和100个文件已经同步到mylinux上了,这也说明rsync结合inotify实现了数据实时同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: