zoukankan      html  css  js  c++  java
  • rsync+inotify实现数据的实时备份

    1、 rsync概述

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


    2、 inotify概述(inotify监控+rsync触发同步)

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

    2.2、inotify安装,在WEB发布管理服务器安装即可,WEB节点无需安装
    # tar–xvf inotify-tools-3.14.tar.gz
    # ./configure
    # make&& make install
    # ll /usr/local/bin/inotifywa*(用ps -ef|grep inotify 可以看到下面的两个进程,以及相关的路径)
    -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内容版本发布管理

    3.1、环境描述
    随着企业的业务增多,为了维持所有WEB层的WEB程序保持一致。发版本的通过一台内容服务器向外进行分布和辐射所有的更新的WEB程序,模拟环境如下:
    WEB1 节点 IP:192.168.1.139(客户端)
    WEB2节点  IP:192.168.1.138(内容分发服务器)

    3.2、安装WEB1节点(客户端
    # yum–y install rsync  #安装rsync

    编写rsync配置文件

    # vim /etc/rsyncd.conf 
    uid = nobody #虚拟用户
    gid = nobody #虚拟用户
    usechroot = no
    max connections = 10
    strict modes = yes
    pid file = /var/run/rsyncd.pid  #定义pid文件位置
    lock file = /var/run/rsync.lock 
    log file = /var/log/rsyncd.log #定义日志文件

    [web1]  #节点名称
    path = /web/doc  #接收内容发布服务器文件夹
    comment = web1 file
    ignore errors
    read only = no
    write only = no
    hosts allow = 192.168.1.138 #内容发布服务器ip地址
    hosts deny = *
    list = false
    uid = root
    gid = root
    auth users = test #虚拟用户
    secrets file = /etc/web1.pass #虚拟用户密码文件

    3.3、创建接收web管理服务器的文件夹

    # mkdir /web/doc –p  #web1客户端节点,用来接收内容分发服务器发布的文件,路径为上一步配置文件夹路径

    3.4、创建用户和密码文件

    # vim/etc /web1.pass  #编辑虚拟用户和用户密码
    test:aixocm
    #chmod 600 /etc/web1.pass #权限设置很关键

    3.5、启动rsync服务
    # rsync --daemon


    4、安装WEB2内容管理节点

    4.1、# yum–y install rsync

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

    4.3、编写一个启动脚本
    # vim /opt/inotify-rsync.sh
    #!/bin/bash
    host1=192.168.1.139
    #==================
    src=/web/doc/
    dst1=web1
    user1=test
    /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
    #-m:monitor 持续监控,如果没有该选项,监控一次之后会退出监控
    #-r:recursive 递归的监控
    #-e:event 监听的动作,例如modify,delete,create,atrib(属性)
    #--timefmt:时间相关的格式,例如%F,完整的年月日,%T,完整的时分秒格式。
    do
    /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user1@$host1::$dst1
    echo "${files} was rsyncd" >>/tmp/rsync.log 2>&1
    done

    4.4、启动脚本
    #cd /opt
    #chmod +x inotify-rsync.sh
    # nohup bash –x inotify-rsync.sh & ;将启动的过程写入当前路径下的nohup.out文件里,方便查看。

    #重启服务需要杀死进程

    #ps -ef|grep inotify|awk '{print $2}'|xargs kill -9


    5、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定义的时间格式

    6、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 
    以指定事件降序排列。

    7、测试

    1、在内容管理节点创建测试文件


    2、在客户端查看文件是否及时同步

     

    8、常见错误

    问题一:
    @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。掠过软连接文件。

    更多linux、网络、shell、数据库等相关技术想和博主交流的,致信邮箱,大家互相学习alec1312linux@163.com
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/alec1312/p/5830917.html
Copyright © 2011-2022 走看看