• Rsync+Inotify实现文件自动同步


    1》rsync概述

          rsync的优点与不足

                 rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的       备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务      系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输;如果文件数量达到了百万甚至千万量级,扫描所有文件将        是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方      式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因                     rsync+inotify组合出现了;

    2》inotify概述

         1>认识inotify     

                Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持通过Inotify可以监控文件系统中添加、删除,修改、        移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。在上面章节中,我        们讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当       文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题;

         2>inotify安装,在WEB发布管理服务器安装即可,WEB节点无需安装

               # tar–xvf inotify-tools-3.14.tar.gz
          # ./configure
       # make&& make install
         # ll /usr/local/bin/inotifywa*
        -rwxr-xr-x 1 root root 44319 4月 6 18:51 /usr/local/bin/inotifywait
        -rwxr-xr-x 1 root root 41409 4月 6 18:51 /usr/local/bin/inotifywatch
        inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树;inotifywatch用        于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息;

    3》企业案例WEB内容版本发布管理

         1>环境描述

              随着企业的业务增多,为了维持所有WEB层的WEB程序保持一致,发版本的通过一台内容服务器向外进行分布和辐射所有的更新的                WEB程序,

            模拟环境如下:
        WEB1 节点 IP:192.168.1.109
        WEB2节点内容发布Server IP:192.168.1.106
      2>
    安装WEB1节点

        # yum–y install rsync
        # vim/etc/web1.pass
           gongda:123
        #chmod 600 /etc/web1.pass
        # mkdir /web1/wwwroot –p
     3>配置文件:
      # vim /etc/rsyncd.conf #此配置文件没有。需要重新编辑一个

               

               uid = nobody
          gid = nobody
       usechroot = no
         max connections = 10
         strict modes = yes
         pid file = /var/run/rsyncd.pid
         lock file = /var/run/rsync.lock
         log file = /var/log/rsyncd.log

        [web1]
        path = /web1/wwwroot/
        comment = web1 file
        ignore errors
        read only = no
        write only = no
        hosts allow = 192.168.1.106
        hosts deny = *
        list = false
        uid = root
        gid = root
        auth users =gongda
        secrets file = /etc/web1.pass

           4> 启动rsync服务
        # rsync --daemon

    4》安装WEB2内容管理节点

      1> # yum –y install rsync
         yum -y install automake libtool

            同步的密码,注意此处只需要写密码,和web1.pass里面的密码要以致
        # vim /etc/server.pass
          
    123
        #chmod 600 /etc/server.pass

             2> 编写一个启动脚本

        # vim opt/inotify-rsync.sh
        #!/bin/bash
        host1=192.168.1.109
        #======================
        src=/web/wwwroot/
        dst1=web1
        user1=gongda
        /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src |     while read files
        do
        /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@
        $host1::$dst1
        echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
        done

          启动脚本
      #cd /opt
      #chmod +x inotify-rsync.sh
      # nohup bash –x inotify-rsync.sh&

    inotifywait


    语法:
    inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
    参数:
    -h,--help
    输出帮助信息
    @
    排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
    --fromfile
    从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -m, --monitor
    接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
    -d, --daemon
    跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了
    –syslog。
    -o, --outfile
    输出事情到一个文件而不是标准输出。
    -s, --syslog
    输出错误信息到系统日志
    -r,--recursive
    监视一个目录下的所有子目录。
    -q,--quiet
    指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
    --exclude
    正则匹配需要排除的文件,大小写敏感。
    --excludei
    正则匹配需要排除的文件,忽略大小写。
    -t , --timeout
    设置超时时间,如果为0,则无限期地执行下去。
    -e , --event
    指定监视的事件。
    -c, –csv
    输出csv格式。
    --timefmt
    指定时间格式,用于–format选项中的%T格式。
    --format
    指定输出格式。
    %w 表示发生事件的目录
    %f 表示发生事件的文件
    %e 表示发生的事件
    %Xe 事件以“X”分隔
    %T 使用由–timefmt定义的时间格式

    inotifywatch


    语法:
    inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
    参数:
    -h, –help
    输出帮助信息
    -v, –verbose
    输出详细信息
    @
    排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
    –fromfile
    从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -z, –zero
    输出表格的行和列,即使元素为空
    –exclude
    正则匹配需要排除的文件,大小写敏感。
    –excludei
    正则匹配需要排除的文件,忽略大小写。
    -r, –recursive
    监视一个目录下的所有子目录。
    -t , –timeout
    设置超时时间
    -e , –event
    只监听指定的事件。
    -a , –ascending
    以指定事件升序排列。
    -d , –descending
    以指定事件降序排列。


    4》
    常见错误问题一:  @ERROR: chroot failed

      rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
      原因:服务器端的目录不存在或无权限。创建目录并修正权限可解决问题。

    问题二:
      @ERROR: auth failed on module tee
      rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
      原因:服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。提供正确的用户名密码解                    决此问题。

    问题三:
      @ERROR: Unknown module ‘tee_nonexists’
      rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
      原因:服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题。

    问题四:
      password file must not be other-accessible
           continuing without password file
      Password:
      原因:这是因为rsyncd.pwd rsyncd.secrets的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd

    问题五:
      rsync: failed to connect to 218.107.243.2: No route to host (113)
      rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
      原因:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcpudp的873端口打开。
    问题六:
      rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.7]
      原因:/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件。

    问题七:
      rsync: chown "" failed: Invalid argument (22)
      原因:权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)
    问题八:
      @ERROR: daemon security issue -- contact admin
      rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]
      原因:同步的目录里面有软连接文件,需要服务器端的/etc/rsyncd.conf打开use chroot = yes。掠过软连接文件。

    5》相关测试:
      1>在服务端建立文件,客户端会自动产生:

               

              

             2>在服务端删除文件,客户端会自动删除:

                  

                    

             3>在服务端文件写入数据时,客户端文件自动同步:

                   

                   

      =================================================
    注意:
    1.两台主机都要将防火墙和SELINUX关闭;
    2.资源发布器启动报错后,注意创建不存在的文件夹。
    3.同步时的错误日志在/var/log文件夹下。 

  • 相关阅读:
    通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数
    通过游戏学python 3.6 第一季 第七章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号
    通过游戏学python 3.6 第一季 第六章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第五章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第四章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第二章 实例项目 猜数字游戏--核心代码--猜测次数 可复制直接使用 娱乐 可封装 函数
    C# Thread test demo
    Judicial review(征审系统)Architecture design of the system(系统架构设计)
    SqlServer全局变量是系统预定义的
  • 原文地址:https://www.cnblogs.com/xiaocheche/p/7604396.html
Copyright © 2020-2023  润新知