rsync+inotify构建多服务器同步方案

测试环境如下:

系统:Centos 6.5 64位

rsync+inotify构建多服务器同步方案_服务器

软件安装

rsync安装(每台服务器上都要安装)

rpm -qa |grep rsync        #查看rsync是否已安装

yum -y  install  rsync

inotify-tools安装(更新服务器上安装)

由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持,也可以用如下方法判断,内核是否支持

一、检查系统内核版本

[root@centos6 Music]# uname -rs

Linux 2.6.32-431.el6.x86_64

 

二、检查系统是否支持inotify

[root@centos6 Music]# ll /proc/sys/fs/inotify

总用量 0

-rw-r--r-- 1 root root 0 2月  15 13:38max_queued_events

-rw-r--r-- 1 root root 0 2月  15 13:38max_user_instances

-rw-r--r-- 1 root root 0 2月  15 13:38max_user_watches

有以上三项就代表系统默认是支持的,接着安装inotify-tools

yum -yinstall inotify-tools

rpm -qa |grepinotify

三、查看inotify默认参数

[root@centos6]#sysctl -a | grep max_queued_events

fs.inotify.max_queued_events =16384

[root@centos6]#sysctl -a | grep max_user_watches

fs.inotify.max_user_watches =8192

fs.epoll.max_user_watches =798863

[root@centos6]#sysctl -a | grep max_user_instances

fs.inotify.max_user_instances =128

四、修改inotify参数

4-1、命令临时生效修改

    [root@centos6]# sysctl -w fs.inotify.max_user_instances=130 

    fs.inotify.max_user_instances = 130 

4-2、文件永久生效修改

[root@centos6]#vi /etc/sysctl.conf 

fs.inotify.max_user_instances=130

4-3、参数说明

max_user_instances:每个用户创建inotify实例最大值

max_queued_events:inotify队列最大长度,如果值太小,会出现错误,导致监控文件不准确

max_user_watches:同步的文件包含的目录数

 

五、配置rsync服务端(172.16.251.93、172.16.251.194)

port=8735

logfile=/var/log/rsync.log       #指定rsync的pid存放路径

pidfile=/var/run/rsyncd.pid      指定rsync的日志存放路径

 

[R8]                                #模块配置名称

path=/Data/public/Music            #同步的目录

usechroot=false

maxconnections=4

read only=no

list=no

uid=root

gid=root

auth users=R8            #认证此模块的用户名

secretsfile=/etc/rsyncd/rs.passwd      #指定存放“用户名:密码”格式的文件

hosts allow=172.16.150.150          #白名单,可以访问此模块的主机

注:不同的分布式更新web节点,只需更改模块名称和path路径

rsync --daemon                           #启动rsync守护进程

echo "rsync --daemon" >>/etc/rc.local     #将rsync服务加入到开机自启动文件

5-1、更新服务器(172.16.150.150)上创建同步目录

     mkdir -p /Data/public/Music

5-2、更新服务器上添加inotify脚本:实现数据实时同步到各web节点

 #!/bin/bash
src=/Data/public/Music/                        # 需要同步的源路径
des=R8                             # 目标服务器上 rsync --daemon 发布的模块名称。
rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
ip1=172.16.251.194               # 目标服务器1
ip2=172.16.251.93                # 目标服务器2
user=R8                           # rsync --daemon定义的验证用户名
cd${src}    
/usr/bin/inotifywait-mrq --format  '%Xe %w%f' -emodify,create,delete,attrib,close_write,move ./ | while read file         
do
INO_EVENT=$(echo $file | awk '{print$1}')      
        INO_FILE=$(echo $file | awk '{print$2}')      
        echo"-------------------------------$(date)------------------------------------"
        echo $file
if [[$INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         
then
echo 'CREATEor MODIFY or CLOSE_WRITE or MOVED_TO'
 rsync -avzcR --port 8735--password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} &&        
rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des}
fi
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[$INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} &&   
rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des}
  fi
  if [[ $INO_EVENT =~ 'ATTRIB' ]]
  then
       echo'ATTRIB'
       if [ ! -d "$INO_FILE" ]                
       then
rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} &&   
rsync -avzcR --port 8735--password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des}
     fi
        fi
done


5-3、设置inotify脚本执行权限:

chmod a+x /rsync.sh

5-4、把脚本加入到开机自动启动文件

echo "/root/rsync.sh &">> /etc/rc.local

5-5、inotifywait 参数说明

inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;

inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息

从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

语法格式:inotifywait[-hcmrq][-e][-t][--format][-timefmt][...]

-m: 即“--monitor”   表示始终保持事件监听状态。

-r: 即“--recursive” 表示递归查询目录

-q: 即“--quiet”     表示打印出监控事件

-o: 即“--outfile”   输出事情到一个文件而不是标准输出

-s:  即“--syslog”    输入错误信息到系统日志

-e: 即“--event”,   通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等,监控系统事件:创建,移动,删除,修改

-format: 指定输出格式;常用的格式符如:%w:表示发生事件的目录  %f:表示发生事件的文件  %e:表示发生的事件  %T:使用由-timefmt定义的时间格式

-timefmt:指定时间格式,用于-format选项中的%T格式

inotifywatch是收集数据的指令,它的相关参数:

语法格式:inotifywatch[-hvzrqf][-e][-t][-a][-d][...]

-fromfile:从文件中读取需要监控的文件或排除的文件,一个文件一行,排除的文件以"@"开头

-z:  即“-zero”          输出表格的行和列,即使元素为空

-r:  即“-recursive”     监视一个目录下的所有子目录

-t:  即“-timeout”       设置超时时间

-e:   即“-event”         只监听指定的事件

参考资料:http://www.ttlsa.com/web/let-infotify-rsync-fast/

          http://www.it165.net/admin/html/201307/1556.html