inotify+rsync实时同步

前言:linux


什么是Inotify:shell

    Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,经过Inotify能够监控文件系统中添加,删除,修改,移动等各类事件,利用这个内核接口,第三方软件就能够监控文件系统下文件的各类变化状况centos

inotify的实现:bash

    1)inotify-tools,服务器

    2)sersync(金山周洋)异步

    3)lsyncdide

inotify主要可控配置:工具

在/proc/sys/fs/inotify目录下有三个文件,可适当调整。测试

max_user_watches:设置inotifywait或inotifywatch命令能够监视的文件数量(单进程),默认8192ui

max_user_instances:设置每一个用户能够运行的inotifywait或inotifywatch命令的进程数。默认128

max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。默认16384


以inotify-tools为例实现inotify+rsync实时同步:


安装:

centos 7.4为例,配置epel源

yum install inotify-tools -y

安装后生成一下两个工具

inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。

inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。


inotifywait 参数说明

参数名称 参数说明
-m,–monitor 始终保持事件监听状态
-r,–recursive 递归查询目录
-q,–quiet 只打印监控事件的信息
–excludei 排除文件或目录时,不区分大小写
-t,–timeout 超时时间
–timefmt 指定时间输出格式
–format 指定输出格式,%T引用--timefmt中指定的时间格式,%Xe指明发生修改的类型,%w发生修改的文件路径,%f发生修改的文件名
-e,–event 后面指定删、增、改等事件


-e :--event的各类事件含义

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


命令行测试示例:

image.png

实现inotify+rsync实时同步脚本:

1.

#!/bin/bash
Path=/data
backup_Server=172.16.1.1


/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data  | while read line  do
    if [ -f $line ];then
        rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password       
    else
        cd $Path &&\
        rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password    
    fi
done

2.

#!/bin/bash
src=/data/                           # 须要同步的源路径
des=data                             # 目标服务器上 rsync --daemon 发布的模块名称
rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
ip1=192.168.0.18                 # 目标服务器1
ip2=192.168.0.19                 # 目标服务器2
user=root                            # rsync --daemon定义的验证用户名
cd ${src}                              # 此方法中,因为rsync同步的特性,这里必需要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致
/usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # 把监控到有发生更改的"文件路径列表"循环
do
        INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
        INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
        echo "-------------------------------$(date)------------------------------------"
        echo $file
        #增长、修改、写入完成、移动进事件
        #增、改放在同一个判断,由于他们都确定是针对文件的操做,即便是新建目录,要同步的也只是一个空目录,不会影响速度。
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&         # INO_FILE变量表明路径哦  -c校验文件内容
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                 #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 如今能够在不漏文件下也有不错的速度作到平衡) 而后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
        fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                #看rsync命令 若是直接同步已删除的路径${INO_FILE}会报no such or directory错误 因此这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能作到指定文件删除,若是删除的路径越靠近根,则同步的目录月多,同步删除的操做就越花时间。
        fi
        #修改属性事件 指 touch chgrp chmod chown等操做
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]                 # 若是修改属性的是目录 则不一样步,由于同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&            
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
                fi
        fi
done
相关文章
相关标签/搜索