目的:  为了实现实时同步,我们使用inotify来监控需要同步的目录发生的改变,inotify只是内核中的一个监控文件变化的模块,提供了监控文件变化的API,而要连接这个API,需要安装inotify-tools工具。可以实现文件的新增,删除,修改,改变属性等,功能很强大。现在需要一台服务器做为发布服务器,来把改变的文件,通过rsync实时的同步到内容服务器。

先介绍一下rsync与inotify,都在在网上找的资料。先声明下面的rsync与inotify介绍不是我自己写的。

1、rsync

     与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

2、inotify

      Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。在上面章节中,我们讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

3、测试环境,两台虚拟主机进行测试功能(web使用nginx部署):

     192.168.10.170   这台主机上部署内容发布服务器,安装rsync-3.1.1.tar.gz 和 intoify-tools.tar.gz

     192.168.10.190   这台主机上部署前端服务器,只安装rsync-3.1.1.tar.gz

     实现功能:当内容发布服务器上的内容发生改变时,自动将数据同步到前端服务器

内容发布服务器:

4安装rsync-3.1.1.tar.gz (192.168.10.170)

     # tar xf rsync-3.1.1.tar.gz 

     # cd rsync-3.1.1/

     # ./configure --prefix=/usr/local/rsync/

     # make && make install

5建立用户文件

     # cd /usr/local/rsync/

     # vim rsync.passwd

           hadoop    ##只保存用户的密码

     # chmod 600 ./rsync.passwd   ##修改文件的权限

6安装intoify-tools-3.1.14.tar.gz

     # tar xf intoify-tools-3.1.14.tar.gz 

     # cd intoify-tools-3.1.4/

     # ./configure --prefix=/usr/local/intoify

     # make && make install

7创建rsync复制脚本

     # vim /tmp/rsync.sh

    #!/bin/bash  

    host=192.168.10.190       ##需要数据同步的主机ip

    src=/usr/local/nginx/html/ftp        ##本地需要同步的数据目录

    des=nginx

    user=hadoop

    /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files  

    do  

    /usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des  

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

    done  


8改变脚本文件的执行权限:

    # chmod 764 rsync.sh

9让其在后台运行

    # sh /tmp/rsync.sh &  或 nohup /tmp/rsync.sh &

10将rsync.sh脚本加入到开机启动项里

    # echo "nohup /tmp/rsync.sh &" >> /etc/rc.local


前端服务器:

1安装rsync-3.1.1.tar.gz (192.168.10.190)

     # tar xf rsync-3.1.1.tar.gz 

     # cd rsync-3.1.1/

     # ./configure --prefix=/usr/local/rsync/

     # make && make install

2创建用户密码文件

     # vim /usr/local/rsync/rsync.passwd

            hadoop:hadoop            //在server端只有密码,在client端有密码和用户名

3改变其权限

     # chmod 600 rsync.passwd

4添加配置文件

     # vim /usr/local/rsync/rsync.conf

    uid = root 

    gid = root 

    use chroot = no 

    max connections = 10 

    strict modes = yes 

    pid file = /var/run/rsyncd.pid  

    lock file = /var/run/rsync.lock  

    log file = /var/log/rsyncd.log  

    [nginx]  

    path = /tmp/        ##数据同步到的目录

    comment = web file  

    ignore errors  

    read only = no 

    write only = no 

    hosts allow = 192.168.10.170  

    hosts deny = *  

    list = false 

    uid = root 

    gid = root 

    auth users = hadoop

    secrets file = /usr/local/rsync/rsync.passwd 

5启动rsync

     # /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf  

6把rsync的启动脚本加入到开机启动项里

     # echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local      


PS: 进入/etc/xinetd.d/目录下看是否有rsync文件,有说明rsync是由xinetd进程管理的,可以通过xinetd来启动rsync

     # chkconfig rsync on

     # service xinetd restart