Rsync+实时监控同步软件

韦锦程
2023-12-01

参考链接

https://www.cnblogs.com/bill2014/p/7416289.html

rsync+inotify:https://www.cnblogs.com/bill2014/p/7411711.html
keepalive+rsync+inotify:https://www.fandenggui.com/post/keepalived-rsync-inotify.html#10-L40

rsync+inotify-tools与rsync+sersync架构的区别

1、rsync+inotify-tools
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低
2、rsync+sersync
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
总结:
当同步的目录数据量不大时,建议使用rsync+inotify
当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync

Rsync+sersync配置及使用

服务端:192.168.3.52 (rsync-server)
客户端:192.168.3.55 (rsync-client)
目标:将客户端/data/rsync目录下文件实时同步到服务端/data/rsync目录下

Rsync部署见: https://blog.csdn.net/martinlinux/article/details/114588852

服务端部署sersync

serync下载地址 goodle code: https://code.goodle.com/archive/psersync/downloads
Git Hub镜像地址: https://github.com/orangle/sersync

1. 安装

tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
cd /usr/local/
mv GNU-Linux-x86 sersync

2. 配置sersync(rsync-client端)

sersync配置文件详解

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>    #hostip与port是针对插件的保留字段,对于同步没有任何作用,保留默认即可。
    <debug start="false"/>                #开启debug模式,会在当前终端输出同步信息,建议开启之后运行命令时将日志2>&1放入日志文件中。
    <fileSystem xfs="false"/>             #对于xfs文件系统的用户,需要将这个选项开启,才能是sersync正常工作。
下边这段表示:对于sersync监控的文件,会默认过滤系统的临时文件(以"."开头,以"~"结尾),除了这些文件外,可以自定义其他需要过滤的文件。

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

以下:inotify监控参数,对于大多数应用,可以把createFile设置为false来提高性能,减少rsync通讯,因为拷贝文件到监控目录
会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝时结束的事件close_write,同样可以实现文件
完整同步。
(看情况开启)
注意:要将createFolder保持为true,如果将createFloder设置为false,则不会对产生的目录进行监控,该目录下的子文件与子目
录也不会被监控,所以除非特殊需要,请开启。默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不
需要删除远程目标服务器的文件(目录),则可以将delete参数设置为false,则不会删除事件监控。

<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">                   /opt/tongbu目录为sersync主服务器本地待同步的目录,
        ip为从服务器的ip地址,name="tongbu1",tongbu1为rsync.conf中模块的名字。
            <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"/>               rsync的同步参数
            <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>      设置为true的时候,认证
            模式开启      
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>                      如果开启就是使用 rsync -e ssh的方式进行传输
        </rsync>
         
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->         失败日志脚本配置
        如果文件同步失败,会重新传送,再次失败就会写入rsync_fail_log.sh,然后每隔一段时间(timetoexecute进行
        设置)执行该脚本再次重新传送,然后清空该脚本。
         
        <crontab start="false" schedule="600"><!--600mins-->        每隔一段时间整体同步,,如果文件量比较
        大,crontab的时间间隔要设的大一些,否则可能增加通讯开销。如果开启了filter文件过滤功能,那么crontab整体同步
        也需要设置过滤,否则虽然实时同步的时候文件被过滤了,但crontab整体同步的时候,如果不单独设置crontabfilter,
        还会将需要过滤的文件同步到远程服务器,crontab的过滤正则与fileter过滤的不同。
            <crontabfilter start="false">                         如果同时开启了filter与crontab,则要开
            启crontab的crontabfilter。
            <exclude expression="*.php"></exclude>
            <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
         
        <plugin start="false" name="command"/>                设置为true,将文件同步到远程服务器后会调
        用name参数指定的插件。如果需要使用插件则需要在启动实例的时候加上-m参数
    </sersync>
以下:当同步文件完成后,会调用command插件,如同步文件是test.php,则test.php文件再改动后,调用rsync同步到远程服务器
后,调用comand插件,执行/bin/sh test.php suffix >/dev/null 2>&1
如果suffix设置了,则会放在inotify事件test.php之后,如果ignoError为true,则会添加>/dev/null 2>&1,当然还可以设
置command的filter,当filter为true,include可以只对正则匹配到的文件调用command。

<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>
以下:向指定ip与端口发送inotify所产生的文件路径信息。
<plugin name="socket">   
        <localpath watch="/opt/tongbu">
            <deshost ip="192.168.138.20" port="8009"/>
        </localpath>
</plugin>

以下:在同步的过程中将文件发送到目的服务器后刷新cdn接口。改模块是根据chainaCDN的协议,进行设计,当有文件产生的时候,就
向cdn接口发送需要刷新的路径位置。
localpath是需要监控的目录,cdninfo标签制定了cdn接口的域名,端口号,以及用户名与密码。
sendurl标签是需要刷新的url的前缀。regexurl标签中的,regex属性为true时,使用match 属性的正则语句匹配inotify返回
的路径信息,并将正则匹配到的部分作为url一部分。

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

举例:
如果产生文件事件为:/data0/htdocs/cms.xoyo.com/site/jx3.xoyo.com/image/a/123.txt
经过上面的match正则匹配后,最后刷新的路径是:http://pic.xoyo.com/cms/jx3/a/123.txt
如果regex属性为false,最后刷新的路径是:http://pic.xoyo.com/cms/jx3.xoyo.com/images/a/123.txt

sersync配置

  1. 备份配置文件

cp sersync/confxml.xml sersync/confxml.xml-bak

  1. 开启同步日志记录
原文内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>                
    <fileSystem xfs="false"/> 

改为:
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="true"/>                
    <fileSystem xfs="false"/> 
注意:(变更记录)开启日志之后,启动sersync时,一定要日志重定向
sersync -r -d -o /usr/local/sersync/conf/confxml.xml 2>&1 /usr/local/sersync.log
  1. 更改优化sersync配置,24-28行,因为我只用了一个服务端一个客户端,所以只有一个同步服务器
原内容为:
    <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>
改为:
    <localpath watch="/data/rsync">
        <remote ip="192.168.3.52" name="rsync"/>
    </localpath>
  1. 更改31-34行,认证部分
<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>
        <commonParams params="-azvlHS"/>
        <auth start="true" users="tytt"
            passwordfile="/etc/rsync.passwd"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="true" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
 上面这个配置就是在拼接rsync -azvlHS --timeout=100 /data/rsync rsync_backup@192.168.3.52::rsync --password-file=/etc/rsync.password这个命令
  1. 修改36-37行
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
   
  改为:
<failLog path="/usr/local/sersync/logs/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
当同步失败时,日志记录到/usr/local/sersync/logs/rsync_fail_log.sh,并且每60分钟对失败的文件进行重新同步。
  1. 开启定期整个目录同步
原文内容:
        <crontab start="false" schedule="600"><!--600mins-->        
            <crontabfilter start="false">                         
            <exclude expression="*.php"></exclude>
            <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
改为:
        <crontab start="true" schedule="60"><!--600mins-->        
            <crontabfilter start="false">                         
            <exclude expression="*.php"></exclude>
            <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
 我这里设置的是60分钟整个目录同步一次(设置定期同步是因为:防止服务端新增或修改文件,导致服务端和客户端不一样;还可以同
 步.*隐藏文件)

启动sersync

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

选项:

参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍,如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步
参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序

开机自启

vim /etc/rc.loal
/usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
 类似资料: