您的位置:首页 > 其它

rsync+Inotify实现数据的实时同步更新

2011-12-30 17:10 471 查看

2.7.4 rsync+Inotify实现数据的实时同步更新(1)

《构建高可用Linux服务器》第2章FreeBSD8.1在企业中的部署应用,本章将会详细讲解FreeBSD8.1的安装、最小化安装后的优化、jail虚拟机的部署,以及FreeBSD8.1下的应用部署。希望大家通过本章的学习,能够很好地掌握FreeBSD8.1的基础知识,并且可以快速地搭建自己的开发环境和测试环境。本节为rsync+Inotify实现数据的实时同步更新。



2.7.4 rsync+Inotify实现数据的实时同步更新(1)

1.rsync的优点与不足

大家通过上面的描述和实验应该已经了解rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期地备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出了更好的要求,rsync在高端业务系统中也逐渐暴露出了很多的不足之处:首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时地去监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致的情况,无法在应用故障时完全恢复数据。

基于以上原因,考虑采用rsync+inotify,这样就可以解决这些问题了。

2.初识Inotify

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):

uname -r  
2.6.18-194.el5


然后我们通过ls来查看是否存在/proc/sys/fs/inotify目录,如下所示:
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可以监视的文件系统事件包括:

IN_ACCESS:

即文件被访问。

IN_MODIFY:

文件被write。

IN_ATTRIB:

文件属性被修改,如chmod、chown、touch等。

IN_CLOSE_WRITE:

可写文件被close。

IN_CLOSE_NOWRITE:

不可写文件被close。

IN_OPEN:

文件被open。

IN_MOVED_FROM:

文件被移走,如mv。

IN_MOVED_TO:

文件被移来,如mv、cp。

IN_CREATE:

创建新文件。

IN_DELETE:

文件被删除,如rm。

IN_DELETE_SELF:

自删除,即一个可执行文件在执行时删除自己。

IN_MOVE_SELF:

自移动,即一个可执行文件在执行时移动自己。

IN_UNMOUNT:

宿主文件系统被umount。

IN_CLOSE:

文件被关闭,等同于(IN_CLOSE_WRITEIN_CLOSE_NOWRITE)。

IN_MOVE:

文件被移动,等同于(IN_MOVED_FROMIN_MOVED_TO)。

注意 上面所说的文件也包括目录。

2.7.4 rsync+Inotify实现数据的实时同步更新(2)

《构建高可用Linux服务器》第2章FreeBSD8.1在企业中的部署应用,本章将会详细讲解FreeBSD8.1的安装、最小化安装后的优化、jail虚拟机的部署,以及FreeBSD8.1下的应用部署。希望大家通过本章的学习,能够很好地掌握FreeBSD8.1的基础知识,并且可以快速地搭建自己的开发环境和测试环境。本节为rsync+Inotify实现数据的实时同步更新。

2.7.4 rsync+Inotify实现数据的实时同步更新(2)

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配置详见2.7.2节的内容。下面是配置好/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/www/  
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的配置过程和原理请大家参考2.7.2节的内容,这里就不详细说明了。

注意 为了保证/data/htdocs/www的目录能够被自动同步,此目录建议分配777权限;/etc/rysncd.password分配600,不然实现不了自动同步,同步时会报如下错误:

password file must not be other-accessible  
continuing without password file  
Password:


(3)配置好WebServer2的Inotify后,写一个inotify的监控脚本/root/rsync.sh,脚本内容如下:
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脚本相关解释如下:

--timefmt:

指定时间的输出格式。

--format:

指定变化文件的详细信息。

这个脚本的作用就是通过Inotify监控文件目录的变化,进而触发rsync进行同步操作。由于这个过程是一种主动触发操作,是通过系统内核完成的,所以,比起那些遍历整个目录的扫描方式来,效率要高很多。

然后我们将此脚本放入后台运行,输入如下命令即可:

nohup sh/root/rsync.sh&

(4)验证就很容易了,我们可以在192.168.1.6的机器的/data/htdocs/www目录下新建文件,更改文件内容,可以很欣慰地发现,192.168.1.5的机器上马上也会发生相应的改变,就像两台机器是网络RAID1一样,非常方便。

总体说来,rsync+Inofity比较适用于没有存储环境的小文件的即时同步更新,如果要更新的文件非常大则不建议用这种方式,如果需要同步的机器数量在10台以上时,我建议还是以共享存储的方法来解决。如果没有资金购置昂贵的存储,大家不妨考虑一下Heartbeat+DRBD+NFS的架构方案来作为我们的文件服务器。

参考文档如下所示:

http://ixdba.blog.51cto.com/2895551/580280   http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/index.html


另外,rsync在Linux/Unix下是一个比较重要和实用的服务,它不仅可以用于服务器之间的备份,还很适用做海量小文件(例如多级目录图片)的同步。另外,它同步数据的速度非常快,仅次于FTP速度,再加上自身可以配置成无人会话模式,所以许多系统管理员喜欢将其做成Crontab计划任务来自动化备份重要服务器资料。由于rsync的强大,现在有许多开源软件,都是针对于rsync的二次开发,大家可以在Google上面了解了一下。建议大家熟悉掌握rsync的用法,我们在工作中会经常用到它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: