在上篇博文《rsync实现Linux服务器数据同步》中,我们讲了rsync实现文件同步的方法与特点,rsync在这方面有着很多优点,但也并非完美无缺。比如,rsync不能实时地监控数据变化,来实现实时同步的目的,虽然可以使用计划任务的方式定时触发同步,但两次触发动作一定会有时间差,对于实时性要求高的环境,这是不可接受的。另外,rsync每次开始时都需要扫描目录里面的所有文件,然后进行差量传输,如果目录里面的文件达到十万,甚至百万级别时,整个操作将非常耗时,而发生改变的可能只是其中的一两个文件,这样无疑是很低效率的行为。
      在了解了rsync 的不足之处后,我们再来了解一下inotify。Inotify是linux系统本身的一种文件系统事件的监控机制,通过它可以监控到文件系统的变化,如:添加、删除、修改等各种细微的动作。利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,Inotify-tools就是这样一款软件,当它与rsync结合使用时,可以弥补rsync所存在的缺陷,达到最好的效果。
      操作环境如下,服务器A的/data目录为源,对其中的内容做任何更新都将即时同步到B和C服务器中的/test目录。

rsync+inotify实现数据实时同步_第1张图片

服务器B和C的 rsync.conf配置:

---------------------------------------

uid=root     
gid=root     
use chroot=no                     
max connections=20                
strict mode =yes                  
pid file=/var/run/rsyncd.pid      
lock file=/var/lock/rsync.lock    
log file=/var/log/rsyncd.log      

[model1]                         
path=/data/                       
comment=Test              
ignore errors                   
read only=no                       
write only=no                     
hosts allow=192.168.0.10          
hosts deny=*                      
list=false                                         
auth users=alex                  
secrets file=/etc/rsyncd.pass      

---------------------------------------

配置完成后,启动服务器的rsync守护,并将rsync服务加入到自启动文件中。
echo “/usr/local/bin/rsync –daemon “>> /etc/rc.local
注:关于rsync配置的详细介绍,可参考我博客中上一篇的rsync博文。

 

 

服务器A上安装配置inotify-tools工具:
注:linux内核版本需要高于2.6.13才能支持inotify特性。
1. 下载安装inotify-tool工具
wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz
cd  inotify-tools-3.14
./configure --prefix=/usr/local/inotify-tools-3.14/
make
make install 
ln -s /usr/local/inotify-tools-3.14/  /usr/local/inotify
安装完inotify-tools后,会生成inotifywait和inotifywatch两个指令。其中,inotifywait用于等待文件或文件集上的一个特定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

2. 添加同步目录
mkdir  /data

3.添加密码文件
vi /etc/rsyncd.passwd
123456

4.创建脚本:
vi  inotify.sh
---------------------------------------
#!/bin/bash
host1=192.168.0.20
host2=192.168.0.30
src=/data
dst=/test
user=alex
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /apps/apk_update/ | while read files
do
/usr/bin/rsync -vzrtopg --delete --progress  --password-file=/etc/rsyncd.passwd  $src $user@$host1::$dst

/usr/bin/rsync -vzrtopg --delete --progress  --password-file=/etc/rsyncd.pass  $src $user@$host2::$dst

echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
done

---------------------------------------

inotifywait的相关参数:
-m 即 –monitor ,表示始终保持事件监听状态;
-r  即 –recursive,表示递归查询目录
-q 即 –quiet ,打印出监控事件
--timefmt,指定时间的输出格式
--format,指定变化文件的详细信息

5.启动脚本
sh inotify.sh &
最后,将些脚本加入自启动文件
echo “sh inotify.sh &” >> /etc/rc.local