rsync+inotify实现文件时时同步

   此处只是做个记录,方便以后查找。实验过程中如有不正确的地方可以跟我联系,会及时改正。

  使用rsync同步数据时需要扫描所有文件进行对比,然后进行差量传输。如果文件比较多扫描会比较耗时,效率会比较低。并且rsync不能时时监测同步数据。使用inotify可以对文件的删除、修改、移动、添加等事件监控,可以使用inotify-tools软件进行监控处理。

一、部署环境:

服务器名称 IP地址 系统版本
website1 192.168.10.4 centos 6.5
website2 192.168.10.5 centos 6.5

二、安装rsync并测试:

  在website1和website2上已经部署了lamp环境,所以此处就不再新建系统账户了。同步的目录权限没调,直接使用属于root用户。

首先检查是否安装rsync:

  

如果没安装可以使用yum -y install rsync或者下载源码包安装即可。

同步目录为:/var/www/html

1、配置rsync的配置文件:

[root@website1 ~]# cat /etc/rsyncd.conf 
uid = root    #html目录的属主和属组
gid = root
use chroot = no
max connections = 400  #允许多少客户端同时传文件
pid file = /var/run/rsyncd.pid  #进程号文件
lock file = /var/run/rsync.lock #日志文件
log file = /var/log/rsyncd.log  #日志文件

[html]    #对应同步目录,此名字可以随意起
path = /var/www/html   #需要同步目录
ignore errors   #忽略出现的错误
read only = no  #表示网络权限可写(本地控制真正可写)
list = false    #这里设置IP或让不让同步
hosts allow = 192.168.10.5 #允许同步的IP
auth users = rsync   #同步用到的虚拟帐户,跟系统账户无关,可以不用创建账户
secrets file = /etc/rsync.pas #虚拟帐号的密码文件

2、配置虚拟账户的密码文件:

[root@website1 ~]# cat /etc/rsync.pas 
rsync:123456

[root@website1 ~]# chmod 600 /etc/rsync.pas 
[root@website1 ~]# ll /etc/rsync.pas 
-rw-------. 1 root root 13 Jan  2 11:55 /etc/rsync.pas

3、启动rsync服务:

[root@website1 ~]# rsync --daemon
[root@website1 ~]# ps -ef | grep rsync
root      1871     1  0 15:48 ?        00:00:00 rsync --daemon
root      1874  1813  0 15:48 pts/0    00:00:00 grep rsync
[root@website2 ~]# netstat -tunlp |grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1862/rsync          
tcp        0      0 :::873                      :::*                        LISTEN      [root@website1 html]# cat /var/www/html/ceshi.txt 
ceshi9811862/rsync

4、从website2上测试rsync同步:

在website2上设置密码文件:

[root@website2 ~]# cat /root/rsync.pwd 
123456  #此处只写密码即可
[root@website2 ~]# chmod 600 /root/rsync.pwd

同步一个文件测试:

[root@website2 html]# echo "ceshi981" > ceshi.txt
[root@website2 html]# cat ceshi.txt 
ceshi981
[root@website2 html]# rsync -avz ceshi.txt rsync@192.168.10.4::html --password-file=/root/rsync.pwd
sending incremental file list
ceshi.txt
sent 79 bytes  received 27 bytes  212.00 bytes/sec
total size is 9  speedup is 0.08

在website1上查看:

[root@website1 html]# cat /var/www/html/ceshi.txt 
ceshi981

三、安装inotify并测试

1、查看是否支持inotify

[root@website1 html]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jan  5 16:01 max_queued_events
#表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
-rw-r--r-- 1 root root 0 Jan  5 16:01 max_user_instances
#表示每一个real user ID可创建的inotify instatnces的数量上限。
-rw-r--r-- 1 root root 0 Jan  5 16:01 max_user_watches
#表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

显示这三项表明支持inotify

2、下载inotify-tools源码包安装:

[root@website2 inotify-tools-3.14]# ./configure --prefix=/usr/
[root@website2 inotify-tools-3.14]# make && make install
[root@website2 inotify-tools-3.14]# inotifywait --help
-r|--recursive   Watch directories recursively. #递归查询目录
-q|--quiet      Print less (only print events). #打印监控事件的信息
-m|--monitor   Keep listening for events forever.  Without this option, inotifywait will exit after one  event is received.        #始终保持事件监听状态
--excludei <pattern>  Like --exclude but case insensitive.    #排除文件或目录时,不区分大小写。
--timefmt <fmt> strftime-compatible format string for use with %T in --format string. #指定时间输出的格式
--format <fmt>  Print using a specified printf-like format string; read the man page for more details.
#打印使用指定的输出类似格式字符串
-e|--event <event1> [ -e|--event <event2> ... ] Listen for specific event(s).  If omitted, all events are  listened for.   #通过此参数可以指定需要监控的事件,如下所示:
Events:
access           file or directory contents were read       #文件或目录被读取。
modify           file or directory contents were written    #文件或目录内容被修改。
attrib            file or directory attributes changed      #文件或目录属性被改变。
close            file or directory closed, regardless of read/write mode    #文件或目录封闭,无论读/写模式。
open            file or directory opened                    #文件或目录被打开。
moved_to        file or directory moved to watched directory    #文件或目录被移动至另外一个目录。
move            file or directory moved to or from watched directory    #文件或目录被移动另一个目录或从另一个目录移动至当前目录。
create           file or directory created within watched directory     #文件或目录被创建在当前目录
delete           file or directory deleted within watched directory     #文件或目录被删除
unmount         file system containing file or directory unmounted  #文件系统被卸载

3、通过脚本监控并加载到后台运行:

[root@website2 ~]# cat inotify.sh 
#!/bin/bash
#para
host01=192.168.10.4  #inotify-slave的ip地址
src=/var/www/html/        #本地监控的目录
dst=html         #inotify-slave的rsync服务的模块名
user=rsync      #inotify-slave的rsync服务的虚拟用户
rsync_passfile=/root/rsync.pwd   #本地调用rsync服务的密码文件
inotify_home=/usr    #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
#  rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0

[root@website2 ~]# sh inotify.sh &    #脚本加入后台执行
[1] 1945

4、测试:

在website2上创建50个文件,然后看下同步效果:

[root@website2 html]# for a in `seq 50`;do touch $a;done
[root@website2 html]# ls
1   12  15  18  20  23  26  29  31  34  37  4   42  45  48  50  8
10  13  16  19  21  24  27  3   32  35  38  40  43  46  49  6   9
11  14  17  2   22  25  28  30  33  36  39  41  44  47  5   7

在website1上查看同步结果:

[root@website1 html]# ls
1   12  15  18  20  23  26  29  31  34  37  4   42  45  48  50  8
10  13  16  19  21  24  27  3   32  35  38  40  43  46  49  6   9
11  14  17  2   22  25  28  30  33  36  39  41  44  47  5   7

删除时website1上也同样会对应删除这些文件。

上边内容有些是参考此链接处理http://chocolee.blog.51cto.com/8158455/1400596