• Centos7.5-rsync-inotify-VS-rsync--seysync实时同步配置


    一、rsync+inotify-tools与rsync+sersync架构解析

    ####用rsync+sersync架构原因?

    1、sersync是基于inotify开发的,类似于inotify-tools的工具

    2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录 

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

    1、rsync+inotify-tools

     a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

     b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低    

    2、rsync+sersync

     a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;

     b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。 

    同步过程:

    1.  在同步服务器上开启sersync服务,sersync负责监控配置路径中的文件系统事件变化;

    2.  调用rsync命令把更新的文件同步到目标服务器;

    3.  需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)

     同步过程和原理:

    1.  用户实时的往sersync服务器上写入更新文件数据;

    2.  此时需要在同步主服务器上配置sersync服务;

    3.  在另一台服务器开启rsync守护进程服务,以同步拉取来自sersync服务器上的数据;

    通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器

    本次配置参考服务器为:源服务器A 192.168.100.150       备份同步服务器B 192.168.100.151   均匀设置免密登陆用户均为root

      服务器A 免密通过ssh的秘钥对方式认证登陆 服务器B,免密配置参考如下:

      .ssh的密钥对方式验证登录:

       a.密钥对必须在客户端上生成,拷贝公钥到服务端对应的目录下。注:客户端用户必须要有私钥,服务端用户必须要有公钥;

       b.服务器A-150配置如下命令:

           ssh-keygen -t rsa                       ##客户端创建密钥对,一路回车,密钥对存放在~/.ssh目录中,id_rsa为私钥、 id_rsa.pub为公钥;

            ssh-copy-id root@192.168.100.151               ##上传公钥到目标主机中,切导入到目标主机的用户家目录中,~/.ssh/authorized_keys文件中,如若上传失败,使用scp进行拷贝并导入:                                       scp .ssh/id_rsa.pub 用户@目标主机ip地址;

            ssh root@192.168.100.151                             ##验证不需要密码可直接进行登陆

     注:同一台客户端实现无密码登陆服务器的多个用户时,只需将公钥上传至服务端的多个用户的家目录下即可;

    分别在服务器A和服务器B的terminal执行:yum install rsync  -y

     安装完毕后,会发现rsync的配置文件位于 etc/rsyncd.conf 。该文件使用daemon方式同步时需要使用,此处暂不介绍。

    二、Rsync本地、远程同步

    1.rsync的角色:

      发起端:使用rsync的主机就是发起端;

      备份源:响应发起端的主机就是备份源;

    2.rsync同步方向:

      上行同步:上传,数据在发起端,备份源提供目录,远程用户必须对备份源目录拥有写入权限,发起端登陆的用户必须要对数据拥有读取权限;

      下行同步:下载,数据在备份源上,发起端提供目录,发起端登陆的用户必须对目录拥有写入权限,远程用户必须对备份源的数据有读取权限;

    3.语法:rsync 选项 原始位置 目标位置

            常用选项:-a 归档模式、保留文件权限、时间、链接、归属、特殊文件

                              -v 输出详细信息

                              -z 压缩传输

                             -H 保持硬链接

                              -r 递归模式,递归子文件及子文件夹

                              --delete 删除目标目录有,原始位置没有的文件

            常用选项组合:-av      -avzH      --delete

    4.本地同步复制文件语法:rsync -av /源文件 /目标目录/

            注:当源文件为例/tmp时,那么将复制tmp整个目录及目录下的文件;

                    当源文件为例/tmp/时,那么将复制tmp目录下的所有文件,不包含tmp目录本身;

                     可同时复制多个文件,中间用空格隔开;

      示例:

      rsync -av /etc /data       #同步etc下所有文件到  /data目录下(包括etc目录本身)

      rsync -av /etc/ /data       #同步etc下所有文件到  /data目录下(不包括etc目录本身)

    5.清空本地目录语法:rsync -av --delete /空目录/ /目标目录/

            注:删除目标目录有,空目录中没有的目标目录中的文件,空目录可以自己创建,则此就达到了删除的目的;

    6.远程同步复制文件语法:

      上行同步(上传):rsync -avzH 本地数据 用户@备份源ip地址:备份目录

      示例:rsync -avzH /etc  root@192.168.100.151:/data/       ## #root用户免密登陆92.168.100.151服务器B同时同步当前etc下所有文件到  /data目录下(包括etc目录本身)

      示例:如果有端口    rsync -e 'ssh -p 2222' -avzH /etc  root@192.168.100.151:/data/       ###root用户通过端口2222免密登陆92.168.100.151服务器B同时同步当前etc下所有文件到  /data目录下(包括etc目录本身)

      下行同步(下载):rsync -avzH 用户@备份源ip地址:备份目录 本地备份目录

      示例:rsync -avzH   root@192.168.100.151:/data/   /etc/    ## #root用户免密登陆92.168.100.151服务器B同时/data目录下所有文件到  本机/etc目录下

    三、Rsync+inotify实时同步

    Rsync仅是一个文件复制工具,它无法对源端文件的增删改操作进行监听。在源端做出更改后,需要执行rsync命令才能将变更同步到目标端。

    Rsync在每次同步前需要扫描整个目录。如果源目录内的文件数量比较多,扫描可能需要耗费较多的时间。
    为了满足实时监听的要求,我们需要引入另一个工具:inotify。

    文件系统事件监听工具inotify

    inotify-tools为inotify提供一个简单接口。它是一个c语言编写的库,同时也包含命令行工具。

    inotify-tools的详细介绍请点击: https://github.com/rvoicilas/inotify-tools/wiki

    inotify-tools的安装

    对于centos7系统,依次执行:

    1
    2
    yum install -y epel-release
    yum --enablerepo=epel install inotify-tools

    使用inotifywait命令进行事件监听

    1.inotify作用:内核模块,监控文件和目录的变化,通过inotify-tools工具提供inotify-wait(持续监控)和inotify-watch(短期监控)两个模块进行监控;

    2.优化内核参数:

            max_queued_events                        ##最大的时间列队

            max_user_instances                         ##最大的实例

            max_user_watchs                            ##最大的监控文件数量

    注:实时同步是基于监控文件的,所以需要在文件所在端,并且rsync只能在发起端发出;

    总结:实时同步只能处理上行,不能实现下行;

    3.inotify+rsync实时同步案例:上行同步

    a.安装inotify-tools;发起端192.168.100.150

            tar  zxvf  inotify-tools-*.tar.gz  -C  /usr/src/

            cd  /usr/src/inotify-tools-*/

            ./configure  &&make &&make  install

            ls  /usr/local/bin/inotify*

    b.inotify的使用:发起端192.168.100.150

            vi  /etc/sysctl.conf

              fs.inotify.max_queued_events = 16384             ##监控事件队列数

              fs.inotify.max_user_instances = 1024                ##监控实例数

              fs.inotify.max_user_watches = 1048576             ##监控的文件数量

            :wq

            sysctl  -p

    c.测试inotify命令;发起端192.168.100.150

        mkdir /root/data

        inotifywait -mrq  -e  modify,create,attrib,move,delete  /root/data 

    选项注解:-m持续监控,r递归目录,q简化输出,-e指定监控事件:modify修改、create创建、attrib权限修改、move移动、delete删除;在其他终端操作文件,查看变化

    参数解析

    • -m 保持持续监听状态,如果不写该参数,inotifywait会在监听到一次事件之后退出。
    • -r 递归方式监听目录。
    • -q 安静模式,打印输出较少的内容。
    • --timefmt 指定时间的输出格式。
    • --format 指定事件输出的格式。
    • -e 设置监听的事件类型。这里监听增删改和metadata的变更。

    d.编写监听脚本1如下(inotifywait-rsync.sh):

    1
    2
    3
    4
    5
    6
    inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib /root/data/rsync/ | while read file
    do
    rsync -avPz --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
    rsync -avPz --delete /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
    echo "${file} was synchronized"
    done

    编写脚本2:发起端192.168.100.150

            vim  rsync_inotify.sh                                               ##实时同步脚本

              #!/bin/bash

              RSYNC="rsync -avzH /root/data/ root@192.168.100.151:/tmp/ --delete"

              INT_CMD="inotifywait -mrq -e modify,create,move,delete,attrib /root/data/"

              $INT_CMD |while read DIRECOTRY EVENT FILE;do

              $RSYNC

              done

            :wq

            chmod  +x  rsync_inotify.sh

            ./rsync_inotify.sh  &  ##启动脚本后台运行

    对于每次触发的监听时间,inotifywait会执行do和done之间的代码。在这里,我们调用之前所说的rsync命令进行文件同步。

    e.监听脚本加入crontab

    1
    2
    crontab -e
    * * * * * sh /root/data/inotifywait-rsync.sh

    f.测试验证,发起端创建测试文件。发起端192.168.100.150

            cd /root/data

            touch 1.txt

    g.备份源验证文件是否同步;备份端192.168.100.151

    ls /tmp/

    在服务器A运行下面命令详解:

    1
    2
    3
    4
    # (1)
    rsync -avPz --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/
    # (2)
    rsync -avPz --delete --progress /root/data/rsync/ root@192.168.100.151:/root/data/rsync/

    会发现在demo.txt也出现在了服务器B中/root/data/rsync/目录。

    上面两条命令解析:

    (1) 将服务器A中的/root/data/rsync目录内的文件复制到服务器B(192.168.100.151)的/root/data/rsync中。

    (2) 比较目标端和源端的文件,如果目标端的文件在源端不存在,在目标端删除该文件。

     四、Rsync+sersync实时同步

     sersync介绍

    sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发。目前使用的比较多的同步解决方案是inotify-tools+rsync ,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的。相比较上面两个项目,本项目优点是:

    •     sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
    •     相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。
    •     另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
    •     本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
    •     本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。
    •     本项目socket与http插件扩展,满足您二次开发的需要。

    下载sersync 

    安装sersync   # tar -xzvf sersync2.5.4_64bit_binary_stable_final.tar.gz  -C /usr/local/sersync

    配置sersync

    启动sersync

    在/root/data下创建、删除、修改文件都会实时同步到192.168.100.151服务器上

    演示rsyncd+sersync 实时同步
    1、下载sersync   在150上安装下面操作都是在150上 (  从150上往151上同步 所以在150安装)

    在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件

    wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(有时下载失败,所有要本地留存才行)这是我上传的zip的解压了一样的下载地址

    上传到服务器 

    cd  /usr/local/ 目录下

    tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz     解压后他的文件名是 GNU-Linux-x86 

    mv GNU-Linux-x86 sersync    名字改成serync 里面机两个文件一个是二进制文件 一个是配置文件

    2、配置sersync

     修改24--28行
    <sersync>
            <localpath watch="/root/data/">    #本地同步目录
                <remote ip="192.168.1.151" name="wwwroot"/>   #rsync模块名称
    修改31--34行,认证部分【rsync密码认证】
    <rsync>
                <commonParams params="-artuz"/>
                <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>
                <userDefinedPort start="false" port="874"/><!-- port=874 -->
                <timeout start="false" time="100"/><!-- timeout=100 -->
                <ssh start="false"/>

    注:红色的修改的内容

    保存退出

    3、配置sersync开启sersync守护进程同步数据

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

    测试  在150上添加文件   看151上有没有变化 可动态查看 watch ls -l

    4、设置sersync监控开机自动执行
      vim /etc/rc.d/rc.local    #编辑,在最后添加一行

      /usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml    #设置开机自动运行脚本

    5、添加脚本监控sersync是否正常运行

    vi  /usr/local/sersync/check_sersync.sh    #编辑,添加以下代码
    #!/bin/sh
    sersync="/usr/local/sersync/sersync2"
    confxml="/usr/local/sersync/confxml.xml"
    status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
    if [ $status -eq 0 ];
    then
    $sersync -d -r -o $confxml &
    else
    exit 0;
    fi
      chmod +x /usr/local/sersync/check_sersync.sh  #添加脚本执行权限  

    把这个脚本加到任务计划,定期执行检测

    6、补充: 多实例情况

     1、配置多个confxml.xml文件(比如:www、bbs、blog....等等)

     2、根据不同的需求同步对应的实例文件

    /usr/local/sersync/sersync2  -d -o /usr/local/sersync/www_confxml.xml

    /usr/local/sersync/sersync2  -d -o /usr/local/sersync/bbs_confxml.xml 

    修改配置之后需要重启

    systemctl restart xinetd  重启 xinetd

    systemctl restart rsyncd 重启 rsyncd

    ///////////************筛选 rsync 的传输目标*****************************/

     筛选 rsync 的传输目标

    使用 --exclude/--include 选项
    可以使用 ––exclude 选项排除源目录中要传输的文件;同样地,也可以使用 ––include 选项指定要传输的文件。
    例如:下面的 rsync 命令将 192.168.100.151 主机上的 /www 目录(不包含 /www/logs 和 /www/conf子目录)复制到本地的 /backup/www/ 。
    # rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/" --progress backup@192.168.100.151:/www/ /backup/www/
    又如:下面的 rsync 命令仅复制目录结构而忽略掉目录中的文件。
    # rsync -av --include '*/' --exclude '*'
    backup@1192.168.100.151:/www/ /backup/www-tree/
    选项 ––include 和 ––exclude 都不能使用间隔符。例如:
    --exclude "logs/" --exclude "conf/"
    不能写成 --exclude "logs/ conf/"
    使用 --exclude-from/--include-from 选项
    当 include/exclude 的规则较复杂时,可以将规则写入规则文件。使用规则文件可以灵活地选择传输哪些文件(include)以及忽略哪些文件(exclude)。
    若文件/目录在剔除列表中,则忽略传输
    若文件/目录在包含列表中,则传输之
    若文件/目录未被提及,也传输之
    在 rsync 的命令行中使用 ––exclude-from=FILE 或 ––include-from=FILE 读取规则文件。
    规则文件 FILE 的书写约定:
    每行书写一条规则 RULE
    以 # 或 ; 开始的行为注释行
    包含(include)和排除(exclude)规则的语法如下:
    include PATTERN 或简写为 + PATTERN
    exclude PATTERN 或简写为 - PATTERN
    PATTERN 的书写规则如下:
    以 / 开头:匹配被传输的根路径上的文件或目录
    以 / 结尾:匹配目录而非普通文件、链接文件或设备文件
    使用通配符
    *:匹配非空目录或文件(遇到 / 截止)
    **:匹配任何路径(包含 / )
    ?:匹配除了 / 的任意单个字符
    [:匹配字符集中的任意一个字符,如 [a-z] 或 [[:alpha:]]
    可以使用转义字符 将上述通配符还原为字符本身含义
    下面给出几个使用规则的例子:
    例1:
    # 不传输所有后缀为 .o 的文件
    - *.o
    # 不传输传输根目录下名为 foo 的文件或目录
    - /foo
    # 不传输名为 foo 的目录
    - foo/
    # 不传输 /foo 目录下的名为 bar 的文件或目录
    - /foo/bar
    例2:
    # 传输所有目录和C语言源文件并禁止传输其他文件
    + */
    + *.c
    - *
    例3:
    # 仅传输 foo 目录和其下的 bar.c 文件
    + foo/
    + foo/bar.c
    - *
    将规则写入规则文件之后,如何在命令行上使用它呢?下面给出一个例子:
    首先将下面的规则存入名为 www-rsync-rules 的文件
    # 不传输 logs 目录
    - logs/
    # 不传输后缀为 .tmp 的文件
    - *.tmp
    # 传输 Apache 虚拟主机文档目录(/*/ 匹配域名)
    + /srv/www/
    + /srv/www/*/
    + /srv/www/*/htdocs/
    + /srv/www/*/htdocs/**
    # 传输每个用户的 public_html 目录(/*/ 匹配用户名)
    + /home/
    + /home/*/
    + /home/*/public_html/
    + /home/*/public_html/**
    # 禁止传输其他
    - *
    然后即可使用类似如下的 rsync 命令:
    rsync -av --delete --exclude-from=www-rsync-rules / remotehost:/dest/dir

    /***************************************************/

  • 相关阅读:
    背景图
    PKUWC 2019~2020 游记
    前置内容2:复杂度分析
    前置内容1:算法与数据结构
    莫比乌斯反演学习笔记2
    莫比乌斯反演学习笔记1
    CSP-J&S-2019 游记
    最近面试的一些感触
    算法学习-整数反转
    入行九年,入园8年,突然想写一点东西.
  • 原文地址:https://www.cnblogs.com/vilenx/p/12734874.html
Copyright © 2020-2023  润新知