inotify与rsync对服务器进行实时文件同步之sersync的安装与配置

发布时间:2020-07-03编辑:脚本学堂
inotify与rsync对服务器进行实时文件同步之sersync的安装与配置

一、系统环境:
  REHL AS 5.4 32bit
  rsync 3.0.7

# wget http://sersync.googlecode.com/files/sersync2.5beta1_32bit_binary.tar.gz
如果用其他较低版本OS,内核在2.6.18以下,则需要自己安装inotify-tools.

参照:
http://www.jb200.com/article/4111.html
http://www.jb200.com/article/4112.html
http://www.jb200.com/article/4113.html
http://www.jb200.com/article/4114.html

REHL AS 5.4 64bit的环境也可以,有相应的sersync2.5_64bit_binary_stable_final.tar.gz 。

服务器:2台,分别标识为A,B,其中A为客户端,B为服务端,sersync安装在A机,监视文件变化,实时推送到B服务器上。
  A机地址:192.168.200.252
  B机地址:192.168.200.251
  同步目录:/opt/software

二、配置说明
  1、A、B分别更新rsync至3.0.7版本,B机以守护进程的方式。
  2、B机安装并开启rsync服务,端口默认为TCP 873。
  3、A机上安装sersync,但也是以rsync能正常工作为前提

三、安装步骤
1、分别为A,B两机安装 rsync

在B机上安装rsync。
 

复制代码 代码如下:

cat  /etc/rsyncd.conf
uid=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock

[rsync_test]
path=/a8root/rsync_test
comment  = rsync inotify files
ignore errors = yes
auth users = rsync
secrets file = /etc/rsync.pass
read only = no
hosts allow =  192.168.200.0/24
hosts deny = *

cat  /etc/rsync.pass
rsync:rsync123
chmod 600  /etc/rsync.pass

启动rsync
rsync --daemon --config=/etc/rsync.conf

2、安装sersync
在A机上安装sersync
如果使用linux 系统,一般情况下,不需要编译,直接使用bin目录下的可执行文件和xml配置文件即可。当然已可以编译安装,src目录下放的是源码,lib目录下是需要的静态库,bin目录是最后生成的二进制文件,在sersync 目录下执行make命令,就会将生成的2进制文件放入bin目录下。
只要配置文件和sersync命令属于同一目录下,那么直接执行./sersync 即可,如果不在同一目录下,那么要用-o参数指定xml配置文件所在位置。

四、配置文件详解
[root@A8test252 sersync]# cat confxml.xml
 

复制代码 代码如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>        #本地主机地址
    <debug start="false"/>    #是否打开调试信息
    <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="/a8root/rsync_test">                        #本地需要监视的目录
            <remote ip="192.168.200.251" name="rsync_test"/>  #目的端的ip和rsync同步的子项的模块名
            <!--<remote ip="192.168.200.251" name="rsync_test"/>--> #如果有多个目的端,可以一一列出
        </localpath>
        <rsync>     #sersync调用rsync时的参数配置
            <commonParams params="-artuz"/>
            <auth start="true" users="rsync" passwordfile="/etc/rsync.pass"/>
            <userDefinedPort start="true" port="873"/><!-- port=874 -->
            <timeout start="true" 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/www.linuxidc.com/site/">
            <cdninfo domainname="www.linuxidc.net" port="80" username="xxxx" passwd="xxxx"/>
            <sendurl base="http://pic.xoyo.com/cms"/>
            <regexurl regex="false" match="www.linuxidc.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
        </localpath>
    </plugin>
</head>

启动sersync
 

复制代码 代码如下:
/usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml

最后测试

在A机上
cd /a8root/rsync_test/
[root@A8test252 rsync_test]# ll
total 16
-rw-r--r-- 1 root root    2 Feb 10 15:04 1
drwxr-xr-x 2 root root 4096 Feb 10 15:04 10
-rw-r--r-- 1 root root    2 Feb 10 15:04 2
-rw-r--r-- 1 root root    2 Feb 10 15:04 3
-rw-r--r-- 1 root root    0 Feb 10 15:07 4

[root@A8test252 rsync_test]# echo ok  >ok
[root@A8test252 rsync_test]# ll
total 20
-rw-r--r-- 1 root root    2 Feb 10 15:04 1
drwxr-xr-x 2 root root 4096 Feb 10 15:04 10
-rw-r--r-- 1 root root    2 Feb 10 15:04 2
-rw-r--r-- 1 root root    2 Feb 10 15:04 3
-rw-r--r-- 1 root root    0 Feb 10 15:07 4
-rw-r--r-- 1 root root    3 Feb 10 16:36 ok

在B机上
[root@test251 ~]# cd /a8root/rsync_test/
[root@test251 rsync_test]# ll
total 20
-rw-r--r-- 1 root root    2 Feb 10 15:04 1
drwxr-xr-x 2 root root 4096 Feb 10 15:04 10
-rw-r--r-- 1 root root    2 Feb 10 15:04 2
-rw-r--r-- 1 root root    2 Feb 10 15:04 3
-rw-r--r-- 1 root root    0 Feb 10 15:07 4
-rw-r--r-- 1 root root    3 Feb 10 16:36 ok

要注意的有这么几个地方:              
1,本地IP和端口              
2,本地同步路径            
3,远程主机的IP            
4,是否开启密码认证
5,重试间隔
6,如果有多个目录需要监视和同步,则建立多个xml配置文件,用sersync -o file.xml分别执行。

五、运行
1、执行命令:./sersync2  -r -d 启动sersync
 r是先执行一遍完整同步,d是后台运行,稍后介绍所有启动参数。
2、加入sersync开机自动启动,老办法: /etc/rc.local,或者写一个service脚本加入chkconfig
注意:sersync调用rsync执行任务,所以他依赖系统的PATH变量来找到rsync命令,而在linux中,初始化的PATH变量是不含有/usr/local/bin目录的(很不幸,如果你升级了rsync的话,他会默认装到这个目录),所以,你需要在/usr/bin/中给rsync创建一个link,符号的就可以:
cd /usr/bin
ln -s /usr/local/bin/rsync rsync
还有一个要注意的地方是:如果你的服务器网卡需要与交换机进行端口协商,不是立即接通,那么,最好在sersync启动以前,sleep一会儿,比如十秒,否则,rsync会因为找不到同步目的方而不工作。

六、启动参数举例
1、/usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/config.xml
#通常情况下使用这种方式,对本地到远程整体同步一遍后,在后台运行实时同步。

2、/usr/local/sersync/sersync2 -d -o  /usr/local/sersync/config.xml
#在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。

3、/usr/local/sersync/sersync2 -r -o  /usr/local/sersync/config.xml
#在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步
  (如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效)

4、/usr/local/sersync/sersync2  -n 5 -d -o /usr/local/sersync/config.xml
#指定默认的线程池的线程总数,如果不指定,默认启动线程池数量是10(适用于四核服务器)
#如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n跳高线程总数。

也可以不进行同步,只运行插件:./sersync -m pluginName
例如./sersync -m command,则在监控到文件事件后,不对远程目标服务器进行同步,而是直接运行command插件。

多个参数可以配合使用
./sersync -n 8 -o abc.xml -r -d
表示,设置线程池工作线程为8个,指定abc.xml作为配置文件,在实时监控前作一次整体同步,以守护进程方式在后台运行。

修改可监控的最大目录数量
echo 50000000 > /proc/sys/fs/inotify/max_user_watches