前面的文章中,我介绍到 rsync + inotify 可以实现文件实时同步功能,rsync + inotify 有优点,也有一些弊端。

  • 需要编写脚本调用 inotifywait来实现,所有的逻辑控制都要编写脚本来实现,使用门槛高
  • 单线程同步,效率低
  • 使用 vi 编辑文件时,将会触发非常多的冗余事件
  • 删除目录时,会同时产生删除文件夹里的文件的事件,这些都是冗余事件
  • 使用脚本也是其优点,使得运维人员可以轻易地编写出满足条件的同步逻辑
  • 可以灵活控制同步选项

sersync 介绍

sersync 是由金山所开源的一款基于 rsync + inotify 的实现,它使用 C++ 语言进行编写,提供了比原生 rsync + inotify 更为强大的功能。

  • 过滤临时文件和不需要的事件,比如在write的时候只产生一个事件,这样就之需要rsync一次
  • 删除文件夹的时候,inotify就会同事产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹时间产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹事件
  • 当rsync失败的时候,会进行稍后重新执行,如果仍旧失败,10小时候再次执行,确保服务器同步准确
  • 对于本地没有的文件,我也会对远程文件路径进行删除,同时不会比较其他文件,那些使用 rsync --include=/ --include=xxx.php$ --exclude= 的用户注意了,那种执行方式,效率很低,会递归比较所有目录
  • 支持主机到多个分机的同步,别且使用多线程同时执行,使文件在所有服务器上保持一致。并且同时同步inotiy产生的多个文件
  • 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能
  • 多线程同步
  • 支持socket与http扩展插件

rsync.png

sersync 配置

默认配置

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <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="false"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="false"/>
        <modify start="false"/>
    </inotify>

    <sersync>
        <localpath watch="/opt/tongbu">
            <remote ip="127.0.0.1" name="tongbu1"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
            <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="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <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>

定义过滤器

sersync默认过滤系统的临时文件(以"."开头,以"~"结尾),除了这些文件意外,可以自定义其他需要过滤的文件。

修改:<filter start="true">

<filter start="true">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
</filter>

<exclude expression="(.*)\.svn"></exclude> 为一个过滤规则,可以有多个。

过滤规则示例:

功能表达式
过滤.log结尾的文件(.*)\.log
过滤tmp目录^tmp\/*
过滤以temp开头、jpg结尾的文件(.*/temp.*)\.jpg

定义监听事件

sersync 支持定义对哪些事件进行监听.

 <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="/opt/tongbu">
    <remote ip="127.0.0.1" name="tongbu1"/>
    <!--<remote ip="192.168.8.39" name="tongbu"/>-->
    <!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath

3.5、定义 rsync 参数

sersync 支持定义 rsync 参数。

  • commonParams:同步参数
  • auth:账号密码验证
  • userDefinedPort:端口
  • timeout:超时
  • ssh:是否启用ssh
<rsync>
    <commonParams params="-artuz"/>
    <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
    <userDefinedPort start="false" port="874"/><!-- port=874 -->
    <timeout start="false" time="100"/><!-- timeout=100 -->
    <ssh start="false"/>
</rsync>

要想启用,修改:<xxx start="true">

3.6、定义定时任

sersync 自带定时任务功能,该功能为一段时间内进行一次全量同步。全量同步也支持过滤规则。

<crontab start="false" schedule="600"><!--600mins-->
    <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
    </crontabfilter>
</crontab>

要想启用,修改:<xxx start="true">

过滤规则示例:

功能规则示例
过滤.log结尾的文件*.log
过滤tmp目录tmp
过滤以temp开头、jpg结尾的文件temp*.jpg

标签: rsync, sersync

添加新评论