Rsync + sersync 实现文件实时同步
前面的文章中,我介绍到 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扩展插件
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 |