• Inotify


    实时复制说明

    1.实时复制软件会监控磁盘文件系统的变化,比如指定的/data目录,实时复制软件进程会实时监控这个/data

    目录中对应文件系统数据的变化。

    2. 一旦/data目录文件发生变法,就会执行rsync命令,将变化的数据推送到备份服务器对应的备份目录中。 

    实时复制软件介绍

    企业常用实时复制软件有如下两款

    软件 依赖程序 部署难点 说明
    Inotify-tools Rsync守护进程 复制脚本 监控目录数据变化
    Sersync* Rsync守护进程 配置文件 监控目录数据变化

    Inotify机制

    Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加,删除,修改等事件,利用这个

    内核接口,第三方软件可以监控文件系统下的情况变化。

    那么Inotify-tools就是该类技术的实现,是一个监控指定目录数据实时变化的软件。

    实现了Inotify的软件还有Sersync,Inotify-tools

    【Inotify机制的优点】、

      1. 监控文件系统的事件变化,通过复制工具实现实时数据复制

      2. 支持多线程实时复制

    【Inotify的缺点】

      1. 实测当文件数量大于200(10-100kb),复制存在延迟

    Inotify+Rsync实施复制实战

    无论是Inotify-tools还是Sersync,本身的核心功能都是监控指定目录内的数据变化,具体的复制当远程

    服务器的功能还是借助Rsync工具配合,Inotify机制软件工作流程如下。

      1. 备份源客户端开机运行Inotify软件,检测指定目录的文件系统变化。

      2. 一旦获取到指定监控目录的数据发生变化,即刻执行Rsync命令复制数据。

      3. 将变化的数据发送到Rsync服务端的备份目录。

    项目部署实施

    【1.确保远程数据传输服务部署完成】

    前提配置好Rsync Daemon模式

    也就是可以在客户端机器,推送、拉取数据到BACKUP服务器,才能配置Inofity-tools
    
    将rsync守护进程模式部署完毕
    rsync服务端部署
    a 检查rsync软件是否已经安装
    b 编写rsync软件主配置文件
    c 创建备份目录管理用户
    d 创建备份目录,并进行授权
    e 创建认证文件,编写认证用户和密码信息,设置文件权限为600
    f 启动rsync守护进程服务
    

       

    【在NFS01机器配置】

    rsync客户端部署
    a 检查rsync软件是否已经安装    
    b 创建认证文件,编写认证用户密码信息即可,设置文件权限为600
    c 利用客户端进行数据同步测试
    
    当前也就是rsync客户端机器,配置如下部署
    1.设置密码环境变量,方便的使用rsync命令
    [root@nfs01 ~]# echo "export RSYNC_PASSWORD=chaoge"  >> /etc/bashrc
    
    2.加载配置文件
    source /etc/bashrc
    
    3.检查环境变量
    [root@nfs01 ~]# echo $RSYNC_PASSWORD
    chaoge
    
    4.作为Rsync客户端,测试推送和拉取数据是否正常
    #推送本地数据给Rsync服务端
    [root@nfs01 ~]# rsync -avz /data/ rsync_backup@192.168.178.110::backup
    
    5.拉取服务端资料
    [root@nfs01 ~]# rsync -avz rsync_backup@192.168.178.110::backup  /tmp
    

      

    【检查Linux版本是否支持Inotify机制】

    只有Linux内核版本在2.6.13起才支持,以及是否存在三个系统文件,存在则支持

    1.检查linux内核版本
    [root@nfs01 ~]# uname -r
    3.10.0-1062.9.1.el7.x86_64
    
    2.检查Inotify相关文件
    [root@nfs01 ~]# ls -l /proc/sys/fs/inotify/
    总用量 0
    
    
    [root@nfs01 ~]# cd /proc/sys/fs/inotify/
    [root@nfs01 inotify]# ll
    总用量 0
    -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_queued_events    
    -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_instances
    -rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_watches
    max_user_watches:    设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
    默认只能监控8192个文件
    
    max_user_instances:    设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
    默认每个用户可以开启inotify服务128个进程
    
    max_queued_events:    设置inotify实例事件(event)队列可容纳的事件数量
    默认监控事件队列长度为16384
    

      

    【Inotify-tools工具安装】

    1.yum安装,需配置epel源
    [root@nfs01 ~]# yum install inotify-tools -y
    
    2.检查软件
    [root@nfs01 ~]# rpm -ql inotify-tools|head -2
    /usr/bin/inotifywait        # 重要软件命令
    /usr/bin/inotifywatch        # 重用软件命令
    

      

     【Inotify命令工具】

    上述操作我们安装好了Inotify-tools软件,生成2个重要的命令

      1. inotifywait:在被监控的目录等待特定文件系统事件(open,close,delete等事件),执行后处于

              阻塞状态,适合在shell脚本中使用,是实现监控的关键。

      2. inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)

    【inotifywait命令解释】

    inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;
    
    inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息
    
    从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:
    
    语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]
    
    -m: 即“–monitor” 表示始终保持事件监听状态。
    
    -d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数
    
    -r: 即“–recursive” 表示递归查询目录
    
    -q: 即“–quiet” 表示打印出监控事件
    
    -o: 即“–outfile” 输出事情到一个文件而不是标准输出
    
    -s: 即“–syslog” 输入错误信息到系统日志
    
    -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等
    
    -format: 指定输出格式;常用的格式符如:
    
    %w:表示发生事件的目录
    
    %f:表示发生事件的文件
    
    %e:表示发生的事件
    
    %Xe:事件以“X”分隔
    
    %T:使用由-timefmt定义的时间格式
    
    -timefmt:指定时间格式,用于-format选项中的%T格式
    

      利用 inotify 软件监控的事件主要是如下

    Events    含义
    access    文件或目录被读取
    modify    文件或目录内容被修改
    attrib    文件或目录属性被改变
    close    文件或目录封闭,无论读/写模式
    open    文件或目录被打开
    moved_to    文件或目录被移动至另外一个目录
    move    文件或目录被移动到另一个目录或从另一个目录移动至当前目录
    create    文件或目录被创建在当前目录
    delete    文件或目录被删除
    umount    文件系统被卸载
    

      Inotify 可监控的事件

    可监控的事件
    有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。
    
    IN_ACCESS
    被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
    IN_MODIFY
    被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
    IN_ATTRIB
    被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
    IN_CLOSE_WRITE
    一个打开的,等待写入的文件或目录被关闭。
    IN_CLOSE_NOWRITE
    一个以只读方式打开的文件或目录被关闭。
    IN_CLOSE
    一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
    IN_OPEN
    文件或目录被打开。
    IN_MOVED_FROM
    被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
    IN_MOVED_TO
    文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
    IN_MOVE
    可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
    IN_CREATE
    在被监控目录中创建了子目录或文件。
    IN_DELETE
    被监控目录中有子目录或文件被删除。
    IN_DELETE_SELF
    被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
    IN_MOVE_SELF
    监控项目本身被移动。
    

      测试create事件

    # 语法
    inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data  <-- 相对完整的命令应用
    
    # 指定事件监控
    inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data  
    
    # 实际案例,监控/data目录的创建
    [root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T%w%f' -e create /data
    # 参数解释
    -m: 即“–monitor” 表示始终保持事件监听状态。
    -r: 即“–recursive” 表示递归查询目录
    -q: 即“–quiet” 表示打印出监控事件
    --timefmt:指定时间格式
    %m  月份(以01-12来表示)。
    %d  日期(以01-31来表示)。
     %y  年份(以00-99来表示)。
    
    %w:表示发生事件的目录
    %f:表示发生事件的文件
    %T:使用由-timefmt定义的时间格式
    %e:表示发生的事件
    
    #日志检测
    16/03/20 09:26/data/超哥带你学inotify.txt
    16/03/20 09:26/data/嗨起来
    16/03/20 09:27/data/今天是个好日子.txt
    
    -e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等
    

      

     

     

       测试delete事件

    1.在NFS01客户端机器上检测inotify功能,检测delete事件,只有在该目录下的删除动作,才会触发监控
    [root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e delete /data
    
    2.再开一个终端,进行删除动作
    [root@nfs01 data]# rm -rf 爱的魔力转圈圈.txt
    

      close_write事件

    检测不同的时间,其实就是-e参数指定的不同,其实很简单
    [root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e close_write /data
    

      

    Inotify增删改事件

    重要事件 包含事件 说明
    close close_write,close_nowrite 文件或目录关闭,不管是读还是写都包含关闭操作
    close_write create 含创建文件事件,不含创建目录事件,自身有修改事件
    move moved_to,moved_from 文件或目录无论是移动,移除监控目录,都被监控

    扩展:sed命令触发器

    在NFS01上开启Inotify监控功能

    1.监控所有事件,且格式化输出
    [root@nfs01 ~]# inotifywait -mrq /data --format "%w%f 事件:%e"
    

      

    利用sed修改文件内容

    # 替换chaoge.txt的内容,且进行备份,旧内容在chaoge.txt.bak  ,替换后内容在chaoge.txt
    [root@nfs01 data]# sed -i.bak  's/默认监控所有事件/超哥带你学inotify事件/g' /data/chaoge.txt
    
    # sed修改文件事件如下
    1. 创建临时文件
    2. 把源文件内容放入临时文件中
    3. 修改临时文件内容
    4. 对源文件进行备份 -i.bak ---- chaoge.txt.bak
    5. 对临时文件重命名为chaoge.txt
    

      

    Inotify-tools软件部署实战

    手工配置inotify的监控事件,增删改查

    # 检测目录的增删改事件
    [root@nfs01 ~]# inotifywait -mrq --timefmt "%y-%m-%d %T"   --format "%T  %w%f 当前事件有:%e" -e close_write,delete  /data/
    

      

    再开一个终端,修改数据

    [root@nfs01 data]# touch /data/超哥带你学inotify.txt
    [root@nfs01 data]# echo "超哥带你飞" >> /data/超哥带你学inotify.txt.bak
    [root@nfs01 data]#
    [root@nfs01 data]# rm -rf /data/*
    
    #Inotify能够检测到如下信息
    /data/超哥带你学inotify.txt
    /data/超哥带你学inotify.txt.bak
    /data/chaoge.txt
    /data/chaoge.txt.bak
    /data/超哥带你学inotify.txt.bak
    /data/嗨起来
    

      

    编写实时监控和复制脚本

    1.生成一个数字1,2,3的文件
    seq 3 > /tmp/chaoge.txt
    
    2.编写一个脚本,能够循环读取文件内容
    [root@nfs01 tmp]# cat test.sh
    cat ./chaoge.txt | 
    while read line
    do
      echo $line
    done
    
    3.检查文件
    [root@nfs01 tmp]# ls
    chaoge.txt  test.sh
    
    4.执行该脚本,-x参数执行脚本,输出执行过程,调试利器,也可以不加
    [root@nfs01 tmp]# sh -x test.sh
    + read line                    #按行读取
    + cat ./chaoge.txt  #读取文件
    + echo 1    #输出1
    1
    + read line                #按行读取
    + echo 2                    #输出2
    2
    + read line
    + echo 3
    3
    + read line
    

      【操作实时同步的脚本】

    1.创建统一管理脚本的文件夹
    [root@nfs01 tmp]# mkdir -p /MyInotify/scripts
    
    2.创建针对事件变化完整复制的脚本 monitor.sh
    [root@nfs01 scripts]# cat monitor.sh
    #!/bin/bash
    cmd="/usr/bin/inotifywait"
    $cmd -mrq --timefmt "%y-%m-%d %T"   --format "%T  %w%f 当前事件有:%e"  -e close_write,delete /data | 
    while read line
    do
            cd /data && 
            rsync -az --delete ./ rsync_backup@192.168.178.139::backup
    done
    
    
    --------------------------------------------------------------------------------------------
    

      【在nfs01机器上执行脚本】

    [root@nfs01 scripts]# sh -x  monitor.sh
    

      

    测试脚本没问题后,可以将脚本运行在后台,实时监听文件变化,进行同步,保证数据备份安全
    1.脚本放置后台运行,在前台运行会占用终端,且终端关了,任务会断
    [root@nfs01 scripts]# /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
    [1] 3004
    [root@nfs01 scripts]# jobs
    [1]+  运行中               /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
    [root@nfs01 scripts]#
    
    2.该任务添加至开机启动文件
    [root@nfs01 scripts]# tail -2 /etc/rc.local
    # inotify + rsync  script by chaoge
    /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
    

      

    Inotify优化参数

    有关inotify的内核参数文件,可以针对企业需求进行优化,修改如下
    [root@nfs01 scripts]# cat /proc/sys/fs/inotify/max_*
    16384
    128
    8192
    
    [root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
    [root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_queued_events
    

      

  • 相关阅读:
    Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
    2014年你不用担心的10件事
    Android菜鸟的成长笔记(4)——你真的理解了吗?
    3. MariaDB设置主从复制
    2. MariaDB激活二进制日志
    如何在CSDN博客自定义栏目中添加“给我写信”
    告别码农,成为真正的程序员
    微信公众平台开发(75)自定义菜单
    大文件分片上传,断点续传,秒传 实现
    大文件上传-大视频上传,T级别的,求解决方案
  • 原文地址:https://www.cnblogs.com/abc1234567/p/14191210.html
Copyright © 2020-2023  润新知