在做网站或者文件服务集群时,通常会用rsync + inotify的方式实现各服务器间的文件同步,而使用脚本实现同步的效率较为低下,因此,这里我将使用sersync实现这一功能。

1.Inotify简介

Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能,内核要求2.6.13以上,inotify能监控非常多的文件系统事件,通过监控这些事件来监控文件是否发生变更,然后通过rsync来更新发生变更的文件,Inotify 可以监视的文件系统事件包括:

IN_ACCESS,即文件被访问

IN_MODIFY,文件被 write

IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等

IN_CLOSE_WRITE,可写文件被 close

IN_CLOSE_NOWRITE,不可写文件被 close

IN_OPEN,文件被 open

IN_MOVED_FROM,文件被移走,如 mv

IN_MOVED_TO,文件被移来,如 mv、cp

IN_CREATE,创建新文件

IN_DELETE,文件被删除,如 rm

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

IN_UNMOUNT,宿主文件系统被 umount

IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)

IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

备注:上面的文件也包括目录。

2.rsync简介

rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。

rsync 包括如下的一些特性:

  能更新整个目录和树和文件系统;

  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;

  对于安装来说,无任何特殊权限要求;

  对于多个文件来说,内部流水线减少文件等待的延时;

  能用rsh、ssh 或直接端口做为传输入端口;

  支持匿名rsync 同步文件,是理想的镜像工具;

3.sersync简介

sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:

  sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;

  安装方便、配置简单;

  使用多线程进行同步,能够保证多个服务器实时保持同步状态;

  自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;

  自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;

  自带socket与http协议扩展,你可以方便的进行二次开发;

4.使用sersync实现触发式文件同步实例:

实验环境:

主服务器:192.168.1.60

从服务器:192.168.1.66

操作系统版本:Redhat5.8-32bit

(1)从服务器配置:

  (a)安装rsync服务

yum install rsync -y

  (b)编辑/etc/rsyncd.conf文件,(配置文件通常需要手动创建)

# Rsync configuration fileuid = rootgid = rootport = 873max connections = 20000use chroot = yestimeout = 200log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock file = /var/run/rsyncd.locklog format = %t %a %m %f %bauth users = rootsecrets file = /etc/rsyncd.secrets[webfile] #设置模板path = /web/test/ #同步文件的目录comment = "test directory file"list = yes #是否允许列出文件read only = noignore errors = yeshosts allow = 192.168.1.60/24 #访问权限hosts deny = *

  (c)rsync密码文件创建

echo "root:redhat" > /etc/rsync.secretchmod 600 /etc/rsync.secret #更改密码文件的权限

  (d)启动rsync服务

rsync --daemon --config=/etc/rsyncd.conf

 (e)验证服务是否启动

[root@mail test]# netstat -lntup | grep rsynctcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      7541/rsync          tcp        0      0 :::873                      :::*                        LISTEN      7541/rsync

(2)主服务器配置

  (a)安装rsync

yum install -y rsync

  (b)安装sersync

下载sersync

解压并移动至相应目录

tar xf sersync_32bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ /usr/local/sersync/

  (c)配置sersync

  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             
 37                 
 38                 
 39              40          41         
 42     
 43  44     
 45         
  
 46         
 47             
 48             
 49          50      51  52     
 53         
 54             
 55          56      57     
 58         
 59             
 60             
 61             
 62          63      64 

  (d)创建密码文件

echo "redhat" > /etc/rsync.secret

只需要密码即可,否则会报错

  (e)启动sersync

/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml

在主服务器上进行文件更新,检测从服务器是否能够同步成功。

至此,基于sersync实现触发式文件同步的实验完成。

附:

为防止sersync意外关闭,可使用如下脚本

#!/bin/bash#Purpose: Check sersync whether it is aliveSERSYNC="/usr/local/sersync/sersync2"CONF_FILE="/usr/local/sersync/confxml.xml"STATUS=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)if [ $STATUS -eq 0 ]; then        $SERSYNC -d -r -o $CONF_FILE &fi

添加至任务计划中

*/5 * * * * /root/script/check_sersync.sh &> /dev/null