> CentOS > CentOS服务器 > 文件同步 >

CentOS下inotify+rsync实时同步文件

web数据同步方案中,NFS方案所有的数据保存到nfs服务器,无论用户访问哪台Web服务器,都是通过nfs服务器获取数据,这样势必会造成nfs服务器性能损耗,且客户端对nfs服务器的依赖性较大。inotify+rsync方案通过对文件系统实时监控同时使用rsync进行同步是一个不错的选择。

rsync

rsync是一个远程数据同步工具,它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。适用于同步,备份等多个场合。

安装

  1. yum install rsync

rsync可以作为两种模式进行运行,以daemon模式作为服务端运行,也可以作为客户端去连接服务器,甚至可以抛弃服务端,直接在本地文件系统上进行同步。
当rsync以daemon模式作为服务端运行,默认监听在873端口,等待客户端来连接,对应的模式是一个服务端,多个客户端,比如

  1. rsync -avz --delete 192.168.1.11::web/ /var/www/

在以上的代码中,服务端192.168.1.10是内容发布端。
在 inotify+rsync 场合中,工作模式是一个客户端,多个服务端,客户端掌握了权威内容,主动向服务端推送内容(服务端必须是可写的),例子如下:

  1. rsync -avz --delete /var/www/ 192.168.1.11::web/ 
  2. rsync -avz --delete /var/www/ 192.168.1.12::web/ 
  3. rsync -avz --delete /var/www/ 192.168.1.13::web/

上面的例子,客户端将/var/www里的网页内容,push到3个服务端。

inofity-tools

inotify是Linux下的一个文件系统事件监控机制,从2.6.13开始Linux内核已默认集成。其允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

安装

  1. yum install inotify-tools

在本次方案中,我们通过rsync客户端实时监控文件变动信息,将发布内容到服务端。

服务端配置

  1. pid file = /var/run/rsyncd.pid
  2. port = 873
  3. uid = root
  4. gid = root
  5. use chroot = yes
  6.  
  7. read only = no
  8. write only = no
  9.  
  10. hosts allow = 192.168.1.1/255.255.255.0
  11. hosts deny = *
  12. max connections = 5
  13.  
  14. log file = /var/log/rsyncd.log
  15. lock file= /var/log/rsync.lock
  16. timeout = 300
  17. [web]
  18. path=/var/www/
  19. list=yes
  20. ignore errors=yes
  21. auth users = www1
  22. secrets file=/etc/rsyncd.secrets

编辑授权信息/etc/rsyncd.secrets,并配置文件权限

  1. echo "www1:wwwpass" > /etc/rsyncd.secrets
  2. chmod 600 /etc/rsyncd.secrets

如果有多个服务端,同时配置多个服务端即可,启动服务端:

  1. rsync --daemon

将上面一句命令加入/etc/rc.local ,可以让rsync 随系统启动

  1. echo "rsync --daemon" >>/etc/rc.local

开放服务端监听端口防火墙

  1. /sbin/iptables -A INPUT -s 192.168.1.1/24 -p tcp --dport 873 -j ACCEPT

客户端配置

创建账号信息

  1. echo "wwwpass" > /root/client.pwd
  2. chmod 600 /root/client.pwd

脚本监控一旦 inotify 发现变化,立即触发rsync 将变化推送到服务端。同步脚本参考:

  1. #!/bin/bash
  2. set -e
  3. src=/var/www/
  4. web01=192.168.1.11
  5. web02=192.168.1.12
  6. /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
  7. do
  8.     /usr/bin/rsync -avzrtopg --delete --progress --password-file=/root/client.pwd $src www1@$web01::web/
  9.     /usr/bin/rsync -avzrtopg --delete --progress --password-file=/root/client.pwd $src www1@$web02::web/
  10.     echo "${files} have been pushed to all web servers."
  11. done

启动脚本,并在后台运行,或者让它开机启动

  1. chmod +x inotify-rsync.sh 
  2. ./inotify-rsync.sh& 
  3. echo "/opt/inotify-rsync.sh&" >>/etc/rc.local

(责任编辑:IT)