zoukankan      html  css  js  c++  java
  • 文件触发式实时同步 Rsync+Sersync Rsync+Inotify-tools

    一、概述

     1、Rsync+Sersync 是什么?

      1)Sersync使用c++编写基于inotify开发的触发机制;

      2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。 

      3)自带crontab功能,只需在 xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

      4)使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状 态。

      5)有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则 每10个小时对同步失败的文件重新同步。

    2、Rsync+Inotify-tools  与 Rsync+Sersync 区别

    1)Inotify-tools只能记录被监控的目录发生的变化(包括新建、修改、删除),并不能监控是哪个文件或目录发生了改变;

         rsync同步的时候会把整个监控的目录整个同步过去,但数据量很大的时候,同步的时间就会很久(rsync同步要遍历整个目录进行文件对比)

    2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。

         rsync同步的时候之同步发生改变的文件或目录(因为每次发生变化的数据很小,所以速度很快)效率很高。

    3、小结

     当同步的目录下的数据量很小时,可以使用Rsync+Inotify;当数据很大(几个G甚至更大的时候)、文件数很多时使用Rsync+Sersync。

    二、服务部署

    1、环境介绍

     系统:centos7.2  默认支持了inotify  内核:3.10.0-514.el7.x86_64   版本: jdk-8u111-linux-x64.tar、sersync2.5.4_64bit_binary_stable_final.tar.gz、rsync-3.0.9-17.el7.x86_64

    linux内核从2.6.13开始支持inotify。

    2、安装

    #yum -y install rsync

    配置文件

    #cat /etc/rsyncd.conf

    uid = root
    gid = root
    use chroot = yes
    address = 192.168.1.202
    port 873
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid

    lock file = /var/log/rsync.lock
    max connections = 5
    motd file = /etc/rsyncd.motd
    transfer logging = yes
    log format = %t %a %m %f %b
    syslog facility = local3
    timeout = 300
    [config]
            path = /data/mongodb/conf
            comment = copy  config for cluster every node
            read only = no
            dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
            auth users = root            #用户必须为系统用户
            secrets file = /etc/rsyncd.pas
            list = no
            ignore errors

            exclude = logs/;slaves;master 

           hosts allow = 192.168.1.201

           hosts deny = *

    保存退出;

    创建密码文件

    #echo "root:666666"  > /etc/rsyncd.pas

    root是用户名,666666是密码,用户名与密码之间使用冒号分割,每个用户单独一行。

    #chmod 600  /etc/rsyncd.pas

    欢迎输出的提示信息:

    # cat /etc/rsyncd.motd
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    It's  config  copy!
    amazing man!
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    3、启动服务

    #rsync --daemon

    4、客户端

    #yum  -y  install  rsync

    rsync同步源的资源表示方式:
    用户名@主机地址::共享模块名

    rsync://用户名@主机地址/共享模块名

    需要创建密码文件:

    #echo "666666" >/root/rsyncd.pas

    #chmod  600  /root/rsyncd.pas

    注意这个密码文件rsync服务的密码文件不一样,这个密码文件只有同步用户的密码!!

    #rsync -avzH --delete --password-file=/root/rsyncd.pas root@10.0.0.200::config /myweb

    #rsync -avzH --delete --password-file=/root/rsyncd.pas rsync://root@10.0.0.200/config  /myweb

    rsync常用参数:

    基本格式: rsync [选项] 原始位置 目标位置
    -r:递归模式,包含目录及子目录中的所有文件
    -l:对于符号链接文件仍然复制为链接文件
    -v:显示同步过程的详细信息
    -a:递归模式,保留文件的权限、属性信息
    -z:在传输文件时进行压缩
    -p:保留文件的权限标记
    -t:保留文件的时间标记
    -g:保留文件的属组标记(仅超级用户)
    -o:保留文件的属主标记(仅超级用户)
    -H:保留硬连接
    -A:保留ACL属性信息
    -D:保留设备文件及其他特殊文件
    --delete:删除目标位置有而原始位置没有的文件
    --checksum:根据校验和来决定是否跳过文件

    在需要同步的服务器上面执行相同的操作,将ip换成对应的即可。

    三、部署sersync

     1、 首先要确定服务器已经部署好了rsync,并且测试能成功同步文件,因为sersync依赖于rsync。

     去官网下载包,下载需要翻墙。

    https://code.google.com/archive/p/sersync/downloads

    解压后的目录为GNU-Linux-x86。

    #tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

    #mv GNU-Linux-x86/ sersync

    #cd sersync;ls

    confxml.xml  sersync2

    confxml.xml是他的配置文件,sersync2是可执行的bin文件。

    2、复制一份配置文件,做个备份再修改。

    #cp confxml.xml confxml.xml.bak

    #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="true"/>
        <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/mongodata">
         <remote ip="192.168.1.202" name="config"/>
         <!--<remote ip="192.168.8.39" name="tongbu"/>-->
         <!--<remote ip="192.168.8.40" name="tongbu"/>-->
     </localpath>
     <rsync>
         <commonParams params="-artuz"/>
         <auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
         <userDefinedPort start="true" port="873"/><!-- port=874 -->
         <timeout start="true" time="300"/><!-- timeout=100 -->
         <ssh start="false"/>
     </rsync>
     <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
     <crontab start="true" 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>

     

    红色字体为修改项,参数解释:

    1)fileSystem xfs="true" :开启xfs文件系统支持

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

    这段配置是监控的操作,根据需要定制即可。我这里选择全部行为。

    3)<localpath watch="/data/mongodata">             本地监控的目录
         <remote ip="192.168.1.202" name="config"/>   需要同步数据的服务器ip、name是rsync里面配置的module。

    4)<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>      同步的用户和密码文件,这个文件内容只有密码。部署rsync时就创建好了
         <userDefinedPort start="true" port="873"/><!-- port=874 -->               rsync服务监听的端口。

    3、启动服务

    首先要修改linux内核参数:

    #sysctl -p

    fs.inotify.max_queued_events = 66666666
    fs.inotify.max_user_instances = 65535
    fs.inotify.max_user_watches = 66666666

     queued_events:如果设置的值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

     user_watches:必须保证这个值要远大于所监控目录下的文件数。

    #cd  /data/sersync

    #./sersync2 -d -r -o ./confxml.xml

    另外一台服务器,只需要修改localpath  watch、remote ip、name根据rsync的配置修改即可。必须要与需要同步数据的服务器rsync里面的path、address、modulename[config]一致。

    重启服务:

    #killall sersync2 && rm  -rf  /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null

    参数解释:

    -d 实时同步

    -r 一次全量同步

    -o 指定配置文件

    4、将服务做成开机启动

    #echo "/data/sersync/sersync2 -d -o /data/sersync/confxml.xml  2>& 1 >>/dev/null"  >>/root/.bashrc

    #source  /root/.bashrc

    当然可以写一个启动脚本:

    # cat /etc/init.d/sersync
    #!/bin/bash
    # chkconfig: 90 89 70
    # description:it's create by cuishuai useed to start or stop sersync
    sersync="/data/sersync/sersync2"
    conf="/data/sersync/confxml.xml"

    case $1 in

    start)
    /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
    num=`ps -ef | grep sersync2 | grep -v grep | wc -l`
    if [ $num -ne 0 ];then
    echo "sersync start  success!"
    fi
    ;;

    stop)
    killall sersync2 && rm -rf /var/run/rsyncd.pid
    ;;

    restart)
    killall sersync2 && rm -rf /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
    ;;

    *)
    echo "Usage $0 start|stop|restart"

    esac

    5、如果要监控多个目录,同步到多主机,需要创建多个sersync的配置文件,由于需要启动多个进程,注意修改监听端口!!,默认是8008:

    # cat spark.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="true"/>
    <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/spark-2.2.0-bin-hadoop2.7/conf">
    <remote ip="10.10.2.13" name="spark_conf"/>
    <remote ip="10.10.6.8" name="spark_conf"/>
    </localpath>
    <rsync>
    <commonParams params="-artuz"/>
    <auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
    <userDefinedPort start="true" port="873"/><!-- port=874 -->
    <timeout start="true" time="300"/><!-- timeout=100 -->
    <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <crontab start="true" schedule="600"><!--600mins-->

    # cat hadoop.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <head version="2.5">
    <host hostip="localhost" port="8009"></host>
    <debug start="false"/>
    <fileSystem xfs="true"/>
    <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/hadoop-2.7.3/etc/hadoop">
    <remote ip="10.10.2.13" name="hadoop_conf"/>
    <remote ip="10.10.5.8" name="hadoop_conf"/>
    </localpath>
    <rsync>
    <commonParams params="-artuz"/>
    <auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
    <userDefinedPort start="true" port="873"/><!-- port=874 -->
    <timeout start="true" time="300"/><!-- timeout=100 -->
    <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <crontab start="true" schedule="600"><!--600mins-->

    启动多个进程:

    #/data/sersync2 -d -o  /data/sersync/spark.xml

    #/data/sersync2 -d -o  /data/sersync/hadoop.xml

    至此,整个的rsync+sersync同步机制就完成了。

    附上rsync+inotify搭建:

    rsync远程同步:

    可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前进行压缩因此非常适用于异地备份、镜像服务器等。官网:http://rsync.samba.org/

    1、在远程同步任务中,负责发起rsync同步操作的客户机称为发起端。
    2、负责相应来自客户机的rsync同步操作的服务器称为同步源
    3、在同步过程中,同步源负责提供文档的原始位置,发起端应对该位置具有读取权限

    下行同步案例:

    配置rsync源服务器
    ip:10.0.0.200
    1、以源目录/var/www/html、备份账号backuper为例
       [root@localhost ~]# yum -y install rsync
       [root@localhost ~]# yum -y install httpd
       [root@localhost ~]# ls /var/www/html/
      
    2、建立/etc/rsync.conf配置文件
      uid = nobody
    gid = nobody
    use chroot = yes
    address = 10.0.0.200
    port 873
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    max connections = 5
    motd file = /etc/rsyncd.motd
    transfer logging = yes
    log format = %t %a %m %f %b
    syslog facility = local3
    timeout = 300
    [wwwroot]
            path = /var/www/html
            comment = document root of www.azui.com
            read only = yes
            dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
            auth users = backuper            #用户必须为系统用户
            secrets file = /etc/rsyncd.secrets
            list = no

           exclude = logs/;slaves;master 

            hosts allow = 10.0.0.250

            hosts deny = *
            ignore errors


      
    3、为备份账户创建数据文件
      [root@localhost ~]# useradd backuper
      [root@localhost ~]# echo '123' | passwd --stdin backuper >/dev/null
      [root@localhost ~]# vim /etc/rsyncd.secrets
      baackuper:123
      [root@localhost ~]# chmod 600 /etc/rsyncd.secrets   #必须改否则客户端同步时会报错
      [root@localhost ~]# vim /etc/rsyncd.motd
       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
           wellcom to www.azui.com
          2016-09-12  15:32
          2017-09-18
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    4、启动与关闭rsync服务
      [root@localhost ~]# rsync --daemon  
    5、rsync命令的使用

    基本格式: rsync [选项] 原始位置 目标位置
    -r:递归模式,包含目录及子目录中的所有文件
    -l:对于符号链接文件仍然复制为链接文件
    -v:显示同步过程的详细信息
    -a:递归模式,保留文件的权限、属性信息
    -z:在传输文件时进行压缩
    -p:保留文件的权限标记
    -t:保留文件的时间标记
    -g:保留文件的属组标记(仅超级用户)
    -o:保留文件的属主标记(仅超级用户)
    -H:保留硬连接
    -A:保留ACL属性信息
    -D:保留设备文件及其他特殊文件
    --delete:删除目标位置有而原始位置没有的文件
    --checksum:根据校验和来决定是否跳过文件


    !!!客户端使用rsync服务
    ip:10.0.0.250

    rsync同步源的资源表示方式:
    用户名@主机地址::共享模块名

    rsync://用户名@主机地址/共享模块名

    执行以下操作访问rsync同步源,下载到本地/tmp目录下进行备份
    rsync -avz backuper@10.0.0.200::/wwwroot  /tmp

    rsync -avz rsync://backuper@10.0.0.200/wwwroot  /tmp

    --delete的使用:
    [root@localhost myweb]# rsync -avz --delete --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb


    由于在客户端需要设置crontab周期计划任务,所以也要建立密码文件
    [root@localhost tmp]# vim /tmp/rsyncd.secrets
    123  #服务器上设置的密码。只写密码前面什么都不能有
    [root@localhost tmp]# chmod 600 /tmp/rsyncd.secrets
    [root@localhost myweb]# crontab -e
    0 22 * * * /usr/bin/rsync -avz --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb.$(date +%F/%R)
    [root@localhost myweb]# chkconfig crond on


    配置rsync+inotify实时同步:上行同步

    Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便的实现文件异动警告、增量备份
    rsync工具与inotify机制组合相结合,实现实时同步-只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静默等待状态。这样就避免了按固定周期备份是存在的延迟性、周期过密等问题。

    发起端:配置
    10.0.0.250

    1、调整inotify内核参数
     [root@localhost ~]# vim /etc/sysctl.conf
      fs.inotify.max_queued_events = 16384
      fs.inotify.max_user_instances = 1024
      fs.inotify.max_user_watches = 1048576
    [root@localhost ~]# sysctl -p
    2、安装inotify-tools
     [root@localhost ~]# tar xf inotify-tools-3.14.tar.gz
     [root@localhost ~]# cd inotify-tools-3.14
     [root@localhost ~]# ./configure && make && make install
    [root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/   监控
    3、编写触发式同步脚本
      [root@localhost ~]# vim /opt/inotify_rsync.sh
    #!/bin/bash
    INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete,attrib /var/www/html"
    RSYNC_CMD="rsync -azH --delete  /var/www/html/ backuper@10.0.0.200:/var/www/html"
    $INOTIFY_CMD | while read DIRECTORY EVENT FILE
            do
              if [ $(pgrep rsync |wc -l) -le 0 ] ;then
                    $RSYNC_CMD
              fi
           done
    [root@localhost ~]# chmod +x /opt/inotify_rsync.sh
    [root@localhost ~]# yum -y install openssh-clients
    [root@localhost ~]# ssh-keygen
    [root@localhost ~]# ssh-copy-id backuper@10.0.0.200

    另外一端服务器:10.0.0.200
    [root@localhost ~]# vim /etc/rsyncd.conf
     把read only = yes 注释掉。
    [root@localhost ~]# rm -rf /var/run/rsyncd.pid
    [root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf
    [root@localhost ~]# chown -R backuper:backuper /var/www/html/

    4、验证

    在发起端的/var/www/html下新建文件,然后去10.0.0.200服务器上的/var/www/html下查看。

  • 相关阅读:
    bzoj2599
    在Linux下配置jdk的环境变量
    liunx 命令大全
    Liunx下如何使用kettle
    Liunx 解压篇
    Linux下安装MySQL-5.7
    Linux文件权限查看及修改命令chmod,chown
    spring 驱动模式
    Struts2标签之Checkbox
    spring 注解的优点缺点
  • 原文地址:https://www.cnblogs.com/cuishuai/p/7874676.html
Copyright © 2011-2022 走看看