测试环境介绍
  Server :192.168.1.147    
  Client :192.168.1.190
  服务器和客户端的对应的同步目录都是 /data/test/
  目标:在客户端上指定目录下操作,数据会及时同步到服务器上对应模块的指定目录下

版本1.0:单纯使用rsync实现主机间的数据同步
    一:Rsync简介
     rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
     
:服务器端和客户端都需要安装rsync
  1:系统包安装(系统默认已经安装,推荐这种方式,本例采用系统包)
    yum install rsync
  2:源码安装
    tar  zxvf  rsync-3.0.7.tar.gz
    cd rsync-3.0.7 
    ./configure --prefix=/usr/local/rsync  
    &make &&make install
三:服务器端配置(客户端无需配置文件)
 1:编写配置文件。/etc下没有rsyncd.conf这个文件,不过我们可以新建               
   Vim  /etc/rsyncd.conf 
[global]                               #全局配置
uid = nobody
gid = nobody
use chroot = no
timeout = 300                     
port = 873                                 #默认就是873端口,可不写
max connections = 30                       #最大连接数
pid file = /var/log/rsyncd.pid              #运行进程的ID写在那里,可不要
     lock file = /var/run/rsyncd.lock             #这个可以不要     
log file = /var/log/rsyncd.log            #日志文件写在那里,这个得要
log format = %t %a %m %f %b    #日志的格式    %t 当前时间 %a 远程IP地址 %m 模块名 %f 文件名 %b 实际传输的字节数 %u用户名
[backup]                                  # 要同步的模块名 
path = /data/test                         #要同步的目录
comment =test                             #这个名名称无所谓
read only = no                            # no客户端可上传文件,yes只读
write only = no                           # no客户端可下载文件,yes不能下载
list = no                                 #是否提供资源列表
ignore errors                             #忽略一些无关的IO错误
hosts allow = 192.168.1.0/24               #本模块允许通过的IP地址    
     hosts deny =  *                            #禁止主机IP
      auth users = www                    #登陆系统使用的用户名,没有默认为匿名。
secrets file=/etc//rsyncd.secret           #密码文件存放的位置
2、设置rsync服务器端同步密钥和同步目录权限;
vi    /etc//rsyncd.secret
www:123456                       #用户名www:密码123456)
chmod 600  /etc/rsyncd.secret    #更改权限,否则报错
chmod 777  /data/test  -R        #修改同步目录权限,否则报错
3:启动与关闭
  A:daemon方式启动
     /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
        Linux上Rsync数据同步三部曲_Linux rsync
     关闭:  kill pid  或者  pkill rsync
  B:利用xinetd控制rsync启动
       vim /etc/xinetd.d/rsync  (yes改为no)
              Linux上Rsync数据同步三部曲_Linux rsync _02
    /etc/init.d/xinetd start
 
:linux客户端配置和测试
 1:客户端环境配置
  A:客户端只需要安装并启动rsync,无需配置文件      
    /usr/bin/rsync --daemon 或者  /etc/init.d/xinetd start
  B:建一个密码文件,只需要些和服务器一样的密码   
    echo 123456 > /etc/rsyncd.secret
     chmod 600  /etc/rsyncd.secret
 2:客户端同步命令
   rsync -vzrtopg --delete /data/test/ www@192.168.1.147::backup   --password-file=/etc/rsyncd.secret  
 
    需要解释的参数:
  -vzrtopg    -v 详细模式输出 -z对文件在传输中压缩 -r 对子目录递归模式处理 -t保持文件时间 -p保留权限 -o保留属主 -g保留属组
  --delete    删除服务器上以前存在客户端没有的数据
      --exclude-from=文件名   排除文件中指定模式的文件,不传送
 /data/test/   客户端上需要同步的目录
 www          服务器上backup模块定义的用户名
 backup       指定服务器上要接受同步的模块名称
 
3:最后不妨编写个脚本,在后台执行
  cat  /root/rsync.sh
 
nohup sh /root/rsync.sh &
   五:总结
      1:遇到的问题
      在配置rsync时,对客户端和服务器端的角色定位不清晰。到底是客户端把数据同步到服务器端,还是把服务器端的数据同步到客户端。按照我的理解是把客户端提交的内容同步到服务器上,但是我在客户端执行同步命令时却发现把服务器端的数据同步到了客户端。我执行的命令如下  
  rsync -vzrtopg --delete  www@192.168.1.147::backup  /data/test/ --password-file=/etc/rsyncd.secret  
而我理想中的方式应该是:
  rsync -vzrtopg --delete /data/test/ www@192.168.1.147::backup   --password-file=/etc/rsyncd.secret  
显而易见。rsync与scp的上传下载方式类似,无所谓客户端,服务器端,一台机器可以把本机数据同步到另一台,也可以把另一台指定目录下的数据同步到本地。为了方便就把配置复杂一点(需要编写配置文件)的哪台机器当做服务器端
   2:思考
 
      上面的两种方式,个人认为在不同的场景有不同的应用
   A:服务器端作为备份使用
     当服务器端做备份时,需要将多个客户端的数据同步到服务器的对应目录中,这时为了减少工作量,把备份服务器作为服务器端,客户端只需要在本地安装rsync,建立密码文件,写个同步脚本
 把客户端的/data/test/ 同步到服务器端的backup模块下对应的目录  
rsync -vzrtopg --delete /data/test/ www@192.168.1.147::backup   --password-file=/etc/rsyncd.secret    
 B:服务器端做分发时使用  

     当有一台服务器(svn服务器)需要把数据分发到不同项目对应的服务器上。此时可以吧svn服务器作为服务器端。客户端从服务器端同步对应的数据。    

    rsync -vzrtopg --delete  www@192.168.1.147::backup  /data/test/ --password- file=/etc/rsyncd.secret 
   把服务器端backup模块定义的目录内容同步到客户端的 /data/test/目录下
  3:rsync的优缺点(摘自抚琴煮酒《构建高可用linux服务器》)
    rsync在Linux/Unix下是一个比较重要和实用的服务.rsync具有安全性高,备份迅速,支持增量备份等优点,通过rsync可以解决对实时性不高的数据备份需求。但是随着应用系统规模的不断扩大,对数据的安全性和可靠性提出了更好的要求。rsync在高端业务系统中逐渐暴露出很多不足。首先rsync同步数据时需要扫描所有文件后进行对比,然后差量传输,大于大数据这是非常低效的。其次,rsync不能时时的去检测,同步数据。基于以上原因。基于以上原因考虑采用rsync+inotify解决这些问题
 
版本2.0:rsync+inotify实现主机间的数据同步
    一:inotify简介
     Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种事件
  二:服务器端客户端都需要安装rsync,inotify
rsync安装及配置参照版本1.0
#cd /usr/local/src/
#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
#tar xzvf inotify-tools-3.14.tar.gz
#cd inotify-tools-3.14
#./configure
#make
#make install
 
出现这个错误“/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0”可以采用以下办法解决:
ln -sv /usr/local/lib/libinotify* /usr/lib/
ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0
  三:在客户端编写同步脚本
      vim /root/rsync.sh
      #!/bin/bash
     src=/data/test/
     des=backup
     ip=192.168.1.147
   /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e   modify,delete,create,attrib $src | while read file
    do
    rsync -vzrtopg --delete --progress $src
www@$ip::$des --password-file=/etc/rsyncd.secret && echo "$src was rsyncd"
done
   nohup sh/root/rsync.sh& 

 本3.0:Sersync实现主机间的数据同步
   一:Sersync简介
     Sersync利用inotify与rsync对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。由金山的周洋开发完成,是目前使用较多的文件同步工具之一。该工具和其他的工具相比有如下优点:
· sersync是使用c++编写,由于只同步发生更改的文件,因此比其他同步工具更节约时间、带宽;
· 安装方便、配置简单;
· 使用多线程进行同步,能够保证多个服务器实时保持同步状态;
· 自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每10个小时对同步失败的文件重新同步;
· 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次;
· 自带socket与http协议扩展,你可以方便的进行二次开发;
  二:Sersync的安装配置(只需在客户端安装Sersync,)
        1:客户端和服务器端分别安装rsync,服务器端(1.147)编辑配置文件,参照 版本1.0 
        2:在客户端安装配置Sersyns
              tar xzvf sersync2.5_64bit_binary_stable_final.tar.gz
              mv GNU-Linux-x86 /usr/local/sersync 
       3: 配置文件分析
           vim /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>   #针对插件的保留字段,保留默认即可。
    <debug start="true"/>   #在sersync正在运行的控制台,打印inotify,rsync同步命令。
    <fileSystem xfs="false"/>    #对于xfs文件系统用户,需要将这个选项开启才正常工作.
    <filter start="false">   #过滤系统的临时文件,被过滤的文件不会被监控提高
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>             #inotify监控文件模块,   
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>        
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>
    <sersync>               #进行数据同步的模块
    <localpath watch="/data/test">                          #监控本地的目录
        <remote ip="192.168.1.147" name="backup"/>    #远程接受同步的IP和rsync模块名
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>
        <commonParams params="-artuz"/>
        <auth start="true" users="www" passwordfile="/etc/rsyncd.secret"/>    
         #开启用户认证,定义用户名密码
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <crontab start="true" schedule="600"><!--600mins-->     #每隔600s会做一次完全同步
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>   #调用name参数指定的插件。
    </sersync>
    <plugin name="command">      ##插件
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>
</head>
     4:Sersync的应用
       A:启动服务
          /usr/local/sersync/sersync2 -d -r -n 8 -o /usr/local/sersync/confxml.xml
            -d  后台启动  -r同步前将已存在的文件全部同步过去  -n开启的线程总数默认10   -o指定配置文件
      B:监控Sersync运行状态的脚本,如果服务停止了就重启服务
              vim /root/tool/sersync.sh
                  #!/bin/bash
SERSYNC="/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 
else
       exit 0;
fi
   三:测试
        在客户端监控的目录/data/test创建文件,然后查看服务器端backup模块对应的目录是否同步更新
 
参考资料
http://book.51cto.com/art/201111/300937.htm     煮酒抚琴
http://blog.johntechinfo.com/technology/96     Sersync开发者周洋博客