rsync/rsync+inotify-tools/rsync+sersync

rsync要想实现自动同步,必须配合脚本以及定时事务来完成


rsync+inotify-tools可以通过inotify这一个工作在内核空间的进程,来时刻监控着指定目录下面的文件,当发生变动时,通知客户端来完成rsync,当然也需要脚本来实现。只是不需要定时任务了,因为,有inotify在实时监控着指定的目录,这样看来inotify的实时性可靠性与完整性都要好过仅仅通过rsync和cron的组合。


rsync+sersync


一、RSYNC

    1、概念

    rsync(remote synchronize)它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,在CentOS6.5中系统已经提供了该服务。

 

        2、安装

            setenforce 0

            iptable -F

           在CenOS6.5中仅仅需要安装xinetd就可以提供rsync服务

             yum -y install xinetd 

        vim /etc/xinetd.d/rsync

        更改disable = no 即可启动rsync功能,当然你的xinetd必须是已经启动的服务,谁让他是超级服务进程呢

        server xinetd start 即可启动xinetd


        或者通过chkconfig rsync on 也可以启动rsync服务


    3、配置rsync

    

    必须手动在/etc目录下创建rsyncd.conf

    然后加入如下配置,即可完成rsync的基础服务配置  

uid = nobody 

gid = nobody

use chroot = no

max connections = 10

strict modes = yes

[web2]             #web2的模块配置,上面是全局配置,默认情况下模块配置会继承全局配置,如

                   果配置相同以模块配置为准,模块可以根据你同步的目录进行添加

path = /www/web02  #允许同步数据的目录

comment = web2 file #目录描述

ignore errors        #忽略I/O错误

read only = no        #可以上传文件到/www/web02目录下

write only = no        #可以修改/www/web02下的文件和目录

hosts allow =192.168.10.55 #仅允许该IP访问/www/web02目录

hosts deny = *            #其他任何主机不允许访问

list = false                #不允许查看主机的目录列表

auth users = user2            #只允许以user2用户登录主机

secrets file = /etc/rsyncd.secrets #在该文件下保存着user2的用户和密码的对应格式为(user2:1)



    4、rsync命令的使用


        rsync -arv [email protected]:/www/web02 /root

        rsync -auv 

        -r 同步目录以及目录下的子目录

        -u 仅仅同步变化的数据

        -v 显示同步过程

        -a all        

rsync有六种不同的工作模式:

  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
  -a 以archive模式操作、复制目录、符号连接 相当于-rlptgoD

  rsync中的参数

  -r 是递归 
  -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
  -z 传输时压缩;
  -P 传输进度;
  -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
  -e ssh的参数建立起加密的连接。
  -u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  --progress是指显示出详细的进度情况
  --delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
  --password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。



二、rsync+inotify

    

    1、下载inotify-tools源码包并安装

    

    yum -y install gcc*

    tar zxvf inotify-tools-3.14.tar.gz 

    cd inotify-tools-3.14

    ./configure 

    make && make install

    

    

    此脚本来源于南非蚂蚁http://ixdba.blog.51cto.com/2895551/580280/

    只要添加完此脚本,当然你得根据你自己的情况加以修改,其余的就如上面配置rsync一样,

        这样就可以实现通过inotify-toosl中的inotifywait来完成自动数据同步了

    inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可

        以递归地监控整个目录树。
    inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

#!/bin/bash
host1=192.168.12.131
host2=192.168.12.132
host3=192.168.12.133

src=/web/wwwroot/
dst1=web1
dst2=web2
dst3=web3
user1=web1user
user2=web3user
user3=web3user

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib  $src \
| while read files
        do
        /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src
$user1@$host1::$dst1
  /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src$user2@$host2::$dst2
  /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src$user3@$host3::$dst3
                echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
         done
脚本相关解释如下:
--timefmt:指定时间的输出格式。
--format:指定变化文件的详细信息。
这两个参数一般配合使用,通过指定输出格式,输出类似与:
15/04/10 00:29 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced
15/04/10 00:30 /web/wwwroot/index.htmlMODIFY was rsynced
15/04/10 00:31 /web/wwwroot/pcre-8.02.tar.gzCREATE was rsynced
这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作,由于这个过程是一种主动触发操作,通过系统内核完成的,所以,比起那些遍历整个目录的扫描方式,效率要高很多。
有时会遇到这样的情况:向inotify监控的目录(这里是/web/wwwroot/)写入一个很大文件时,由于写入这个大文件需要一段时间,此时inotify就会持续不停的输出该文件被更新的信息, 这样就会持续不停的触发rsync去执行同步操作,占用了大量系统资源,那么针对这种情况,最理想的做法是等待文件写完后再去触发rsync同步。 在这种情况下,可以修改inotify的监控事件,即:“-e close_write,delete,create,attrib”。
接着,将这个脚本命名为inotifyrsync.sh,放到/web/wwwroot目录下,然后给定可执行权限,放到后台运行:
chmod 755 /web/wwwroot/inotifyrsync.sh
/web/wwwroot/inotifyrsync.sh &

三、rsync+sersync


    1、安装sersync

    yum -y install gcc*

    tar -zxf sersync2.5_source.tar.gz

    cd sersync2.5_source

    make && make install 



    

2.配置confxml.xml

 cd /usr/local/sersync/conf

 vi confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<head version="2.5">

   # 设置本地IP和端口

   <host hostip="localhost" port="8008"></host>

   # 开启DUBUG模式  

   <debug start="false"/>

   # 开启xfs文件系统

   <fileSystem xfs="false"/>

   # 同步时忽略推送的文件(正则表达式),默认关闭

   <filter start="false">

       <exclude expression="(.*)\.svn"></exclude>

       <exclude expression="(.*)\.gz"></exclude>

       <exclude expression="^info/*"></exclude>

       <exclude expression="^static/*"></exclude>

   </filter>

   <inotify>

   # 设置要监控的事件

       <delete start="true"/>

       <createFolder start="true"/>

       <createFile start="true"/>

       <closeWrite start="true"/>

       <moveFrom start="true"/>

       <moveTo start="true"/>

       <attrib start="true"/>

       <modify start="true"/>

</inotify>


   <sersync>

   # 本地同步的目录路径

       <localpath watch="/data">

   # 远程IP和rsync模块名  

           <remote ip="192.168.100.29" name="data"/>  

           <!--<remote ip="192.168.8.39" name="tongbu"/>-->

           <!--<remote ip="192.168.8.40" name="tongbu"/>-->

       </localpath>

       <rsync>

   # rsync指令参数

           <commonParams params="-auvzP"/>

   # rsync同步认证

           <auth start="true" users="user" passwordfile="/etc/rsync.pas"/>

   # 设置rsync远程服务端口,远程非默认端口则需打开自定义

           <userDefinedPort start="false" port="874"/><!-- port=874 -->

   # 设置超时时间

           <timeout start="true" time="100"/><!-- timeout=100 -->

   # 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书

           <ssh start="false"/>

       </rsync>

    # sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。

       <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

    # 设置rsync+crontab定时传输,默认关闭

       <crontab start="false" schedule="600"><!--600mins-->

           <crontabfilter start="false">

               <exclude expression="*.php"></exclude>

               <exclude expression="info/*"></exclude>

           </crontabfilter>

       </crontab>

   # 设置sersync传输后调用name指定的插件脚本,默认关闭

       <plugin start="false" name="command"/>

   </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>

   # 插件脚本范例

   <plugin name="socket">

       <localpath watch="/opt/tongbu">

           <deshost ip="192.168.138.20" port="8009"/>

       </localpath>

   </plugin>

   <plugin name="refreshCDN">

       <localpath watch="/data0/htdocs/cms.xoyo.com/site/">

           <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>

           <sendurl base="http://pic.xoyo.com/cms"/>

           <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>

       </localpath>

   </plugin>

</head>

你可能感兴趣的:(tool,rsync,inotify)