环境描述:现有两台服务器,要实现mp3文件的实时同步。可以使用rsync来做同步,但不能实现实时,为了实现实时同步,我们使用inotify来监控需要同步的目录发生的改变,inotify只是内核中的一个监控文件变化的模块,提供了监控文件变化的API,而要连接这个API,需要安装inotify-tools工具。可以实现文件的新增,删除,修改,改变属性等,功能很强大。现在需要一台服务器做为内容发布端,来把改变的文件,通过rsync实时的同步到内容服务器。

==========================================

内容服务器:1.1.1.1(Ubuntu 12.04 x86-64)
发布服务器:1.1.1.2(Ubuntu 12.04 x86-64)
 
==========================================
 

一、配置内容服务器1.1.1.1

安装rsync
# sudo apt-get install rsync
提供rsync配置文件
# mkdir /etc/rsyncd/
# vim /etc/rsyncd/rsyncd.conf
 
 
  
  1. # Section 1: Global settings 
  2. port = 873 
  3. uid = root 
  4. gid = root 
  5. use chroot = yes 
  6. read only = no 
  7. max connections = 7 
  8. pid file = /var/run/rsyncd.pid 
  9. log file = /var/log/rsyncd.log 
  10. hosts allow = * 
  11. transfer logging = yes 
  12. log format = %t %a %m %f %b 
  13. syslog facility = local3 
  14. timeout = 300 
  15.  
  16. # Section 2: Directory to be synced 
  17. [mp3] 
  18. path = /data/mp3 
  19. list = false 
  20. ignore errors = yes 
  21. auth users = syncuser 
  22. secrets file = /etc/rsyncd/rsyncd.pass 
 
提供secrets file所指定的口令文件/etc/rsyncd/rsyncd.pass,其内容类似如下:
syncuser:IamOK
 
其中冒号前的是用户名,冒号后的是对应用户的密码。此文件不能为其他任意用户可访问,因此可用如下命令修改:
# chmod 600  /etc/rsyncd/rsyncd.pass
 
启动rsync服务
# /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
 
验证服务是否开户
root@node1:/etc/rsyncd# netstat -nutlp | grep :873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2357/rsync
 
加入开机启动
# echo "/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf" >>/etc/rc.local
 

二、配置发布服务器1.1.1.2

安装rsync及inotify-tools
# sudo apt-get install rsync inotify-tools
# mkdir /etc/rsyncd/
# vim /etc/rsyncd/rsyncd.pass
IamOK
 
 
建立自动同步的脚本,使用inotifywait监控目录,当监控目录改变的时候,调用rsync同步改变的文件
# vim /var/tmp/auto_sync.sh
 
 
  
  1. #!/bin/bash 
  2. DESTHOST=1.1.1.1 
  3. DESTHOSTDIR=/data/mp3/ 
  4. SRCDIR=/data/mp3/ 
  5.  
  6. inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR |  while read DATE TIME DIR FILE; do 
  7.  
  8.        FILECHANGE=${DIR}${FILE} 
  9.  
  10.        rsync -avz --password-file=/etc/rsyncd/rsyncd.pass $FILECHANGE syncuser@${DESTHOST}::mp3 &>/dev/null && \ 
  11.        echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/mp3sync.log 
  12. done 
 
# chmod u+x /var/tmp/auto_sync.sh
# /var/tmp/auto_sync.sh &
 
开机自动运行
# echo '/var/tmp/auto_sync.sh &' >> /etc/rc.local
 
     

总结:以上可以实现文件的实时同步,如果两端本来文件不一致,建议先使用rsync做一次完全的同步,因为本文章所写的方法,只对改变的文件进行同步,而不会去扫描整个目录。
 
如果要监控多个同一台机器上的多个目录的改变,inotifywait也是支持的,多个目录之间,用空格隔开即可。同步的时候,也是可以同步到多台服务器的,脚本里多写一个rsync就可以了。