热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rsync+Inotify实现文件自动同步

1》rsync概述rsync的优点与不足rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数

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文件夹下。 


推荐阅读
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
author-avatar
雨雾1989_153
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有