实时同步应用描述如下:

A机器为更新的文件,需要实时同步到线上环境上的应用服务器B上面,因此这里需要用inotify实时检查A机器上文件修改状态,如果有更新,则立刻触发rsync进行同步。

B机器作为rsync服务,A为rsync客户端,客户端向服务器传送最新数据。

A:192.168.0.201 数据文件目录为/root/web1

B:192.168.0.202

B机器的rsync配置如下:

   
   
   
   
  1. uid = nobody 
  2. gid = nobody 
  3.  
  4. use chroot = no 
  5. max connections = 10 
  6. strict modes = yes 
  7.  
  8. pid file = /var/run/rsyncd.pid 
  9. lock file = /var/run/rsync.lock 
  10. log file = /var/log/rsyncd.log 
  11.  
  12. [rhel02_web] 
  13. path = /var/www/html 
  14. comment = rhel02_web file 
  15. ignore errors 
  16. read only = no 
  17. write only = no 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = webuser 
  22. secrets file = /var/www/webuser.pass 

其中,rhel02_web为模块,为避免客户端同步文件的时候,输入密码验证,这里用auth users选项和secrets file分别制定模块的用户名和密码文件,其中用户名为自定义名字,和Linux操作系统的用户无关,密码文件则为用户名和密码,都为明文,格式如下:

user:password

密码文件其他用户不能有任何权限,因此这里需要把密码文件权限设置为600

A机器只需要安装了rsync即可用命令进行手动同步数据:

rsync -vzrtopg --delete --progress --password-file=/var/www/webuser.pass  /root/web1 [email protected]::rhel02_web

A机器的密码文件也为明文,内容仅仅是user的密码,权限也为600

如果要A机器更新文件时,自动实时同步文件到B,则需要使用inotify来实现,命令如下:

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %e %w%f' -e close_write,delete,create,attrib /root/web1/

命令执行后会挂起,如果/root/web1目录下有文件修改更新,则会输出--format制定格式的输出信息:

14/09/12 22:41 CLOSE_WRITE,CLOSE /root/web1/index.html

这里使用一个脚本auto_rsync.sh,来联合inotifywait和rsync来达到自动同步文件的目的:

 

   
   
   
   
  1. #! /bin/sh 
  2.  
  3. webserver_host=192.168.0.202 
  4. src=/root/web1 
  5. user_pass=/var/www/webuser.pass 
  6.  
  7. dst_mod=rhel02_web 
  8. user=webuser 
  9.  
  10. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %e %w%f' -e close_write,delete,create,attrib $src | 
  11. while read files_format 
  12. do 
  13.   /usr/bin/rsync -vzrtopg --delete --progress --password-file=${user_pass}  $src ${user}@${webserver_host}::${dst_mod} 
  14.   echo "${files_format} rsyncd ok" >> /tmp/rsync.log 2>&1 
  15. done 

以上脚步的功能为inotifywait检查文件更新状态,如果有更新,则打印一条消息,并把消息送给while循环,从而执行循环里面的rsync同步操作。

整个环境配置完毕后,启动B机器的rsync服务,后台执行脚本即可

nohup ./auto_rsync.sh &

测试:更新A机器的文件,B机器的文件也被更新。

参考链接:http://ixdba.blog.51cto.com/2895551/580280