zoukankan      html  css  js  c++  java
  • rsync组合inotify-tools完成实时同步[转]

    一. 什么是inotify

    inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

    CentOS6自然已经支持:
    使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。

    total 0
    -rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events
    -rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances
    -rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches
    • /proc/sys/fs/inotify/max_queued_evnets表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

    • /proc/sys/fs/inotify/max_user_instances表示每一个real user ID可创建的inotify instatnces的数量上限。

    • /proc/sys/fs/inotify/max_user_watches表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

    inotify-tools:

    inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口库函数,同时还提供了一系列的命令行工具,这些工具 可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。

    下载inotify-tools-3.14-1.el6.x86_64.rpm,通过rpm包安装:

    # rpm -ivh /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm 
    warning: /apps/crm/soft_src/inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 4026433f: NOKEY
    Preparing...                ########################################### [100%]
       1:inotify-tools          ########################################### [100%]
    # rpm -qa|grep inotify
    inotify-tools-3.14-1.el5.x86_64

    二.inotifywait使用示例

    监控/root/tmp目录文件的变化:

    /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' 
     -e modify,delete,create,move,attrib /root/tmp/

    上面的命令表示,持续监听/root/tmp目录及其子目录的文件变化,监听事件包括文件被修改、删除、创建、移动、属性更改,显示到屏幕。执行完上面的命令后,在/root/tmp下创建或修改文件都会有信息输出:

    2014/12/11-15:40:04 /root/tmp/ new.txt
    2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
    2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
    2014/12/11-15:40:22 /root/tmp/ .new.txt.swx
    2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
    2014/12/11-15:40:22 /root/tmp/ .new.txt.swp
    2014/12/11-15:40:23 /root/tmp/ .new.txt.swp
    2014/12/11-15:40:31 /root/tmp/ .new.txt.swp
    2014/12/11-15:40:32 /root/tmp/ 4913
    2014/12/11-15:40:32 /root/tmp/ 4913
    2014/12/11-15:40:32 /root/tmp/ 4913
    2014/12/11-15:40:32 /root/tmp/ new.txt
    2014/12/11-15:40:32 /root/tmp/ new.txt~
    2014/12/11-15:40:32 /root/tmp/ new.txt
    ...

    三.组合rsync实现实时同步

    这一步的核心其实就是在客户端创建一个脚本rsync.sh,适用inotifywait监控本地目录的变化,触发rsync将变化的文件传输到远程备份服务器上。为了更接近实战,我们要求一部分子目录不同步,如/root/tmp/log和临时文件。

    1. 创建排除在外不同步的文件列表

    排除不需要同步的文件或目录有两种做法,第一种是inotify监控整个目录,在rsync中加入排除选项;第二种是inotify排除部分不监控的目录,rsync自然也不会触发。我们选择第二种。

    这个操作在客户端进行,/root/tmp/log以及/root/tmp/src目录下的js、css和一些临时文件不同步,所以不需要inotifywait,/root/tmp下的其他文件和目录都同步。(其实对于打开的临时文件,可以不监听modify时间而改成监听close_write)

    # vi /etc/inotify_rsync_exclude.lst:
    @/root/tmp/cache??*
    @/root/tmp/src/js
    @/root/tmp/src/css
    @/root/tmp/src
    @/root/tmp/src/20*/20*/20*/.??*
    @/root/tmp/log/

    目前测试看到只能用绝对路径。

    2.客户端同步到远程的脚本rsync.sh

    rsync.sh文件:

    #variables
    current_date=$(date +%Y%m%d_%H%M%S)
    source_path=/home/guotmp/
    log_file=/var/log/rsync_client.log

    #rsync
    rsync_server=192.168.1.84
    rsync_user=ant5
    rsync_pwd=/etc/rsync-84.pas
    rsync_module=tmp

    #rsync client pwd check
    if [ ! -e ${rsync_pwd} ];then
        echo -e "rsync client passwod file ${rsync_pwd} does not exist!"
        exit 0
    fi

    #inotify_function
    inotify_fun(){
        /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f'
              --fromfile /etc/inotify_rsync_exclude.lst -e modify,delete,create,move,attrib ${source_path}
              | while read file
          do
              /usr/bin/rsync -auvrtzopgP --progress --bwlimit=200 --password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}
          done
    }

    --bwlimit=200用于限制传输速率最大200kb,因为在实际应用中发现如果不做速率限制,会导致巨大的CPU消耗。

    在客户端运行脚本# ./rsync.sh即可实时同步目录。

    本文摘自:http://segmentfault.com/a/1190000002427568

  • 相关阅读:
    Git 最新版本2.20.1 安装及配置
    Python中:ModuleNotFoundError: No module named 'alipay'
    Python调用time模块设置当前时间-指定时间
    python 正则表达式
    pwntools出现的一些问题
    strace监视系统调用
    深入理解Linux内核 学习笔记(8)
    ubuntu 查看版本
    LSTM实现中文文本情感分析
    深入理解Linux内核 学习笔记(5)
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4429382.html
Copyright © 2011-2022 走看看