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

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

测试环境如下:

系统:Centos 6.5 64位

wKiom1bBcwexij-PAAE4gbASIuQ054.jpg

软件安装

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节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  #!/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



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

测试环境如下:

系统:Centos 6.5 64位

wKiom1bBcwexij-PAAE4gbASIuQ054.jpg

软件安装

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节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  #!/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



本文转自 boy461205160 51CTO博客,原文链接:http://blog.51cto.com/461205160/1742110


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值