zoukankan      html  css  js  c++  java
  • rsync+inotify实时同步

    !!!在安装前要先确保,rsync daemon服务配置成功,在安装inotify-tools前先确认你的linux内核是否达到了2.6.13,并且在编译时开启CONFIG_INOTIFY选项,也可以通过以下命令检测。

    一、rsync + inotify 组合的起源

    Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。

    客户端

    rsync版本:3.0.6,inotify版本:inotify-tools-3.14.tar

    二、编译安装

    1)确认内核版本

    [root@weiwei ~]# uname -r
    2.6.32-573.el6.x86_64
    [root@weiwei ~]# ls -l /proc/sys/fs/inotify/
    total 0
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_queued_events
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_user_instances
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_user_watches
    显示这三项就说明支持
    

    2)编译安装inotify

    [root@weiwei inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14
    [root@weiwei inotify-tools-3.14]# make && make install
    [root@weiwei local]# ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify
    

    3)本地测试

    测试create
    [root@weiwei ~]# /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /backup
    16/08/17 19:01 /backup/a.txt
    16/08/17 19:02 /backup/test_dir
    
    测试delete
    [root@weiwei ~]# /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /backup
    16/08/17 19:04 /backup/a.txt
    16/08/17 19:04 /backup/nini.txt
    
    测试close_write
    [root@weiwei ~]# /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write  /backup
    16/08/17 19:06 /backup/nima
    16/08/17 19:06 /backup/nima
    上面的create,close_write如果是创建文件则会重复了监控,如果仅仅写入则只会有close_write的监控
    
    没有时间的监控,简化事件的输出
    [root@weiwei ~]# /usr/local/inotify/bin/inotifywait -mrq  --format ' %w%f' -e create /backup
     /backup/jij.txt
    

    三、下面用列表详细解释一下各个参数的含义

    inotifywait参数 含义说明
    -r --recursive 递归查询目录
    -q --quiet 打印很少的信息,仅仅打印监控事件的信息
    -m,--monitor 始终保持事件监听状态
    --exclude 排除文件或目录时,不区分大小写
    --timefmt 指定时间输出的格式
    --format 打印使用指定的输出类似格式字符串
    -e,--event 通过此参数可以指定需要监控的事件,如下一个列表所示

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

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

    四、实时监控的脚本

    #!/bin/sh
    
    path="/backup"
    cmd="/usr/local/inotify/bin/inotifywait"
    $cmd -mrq  --format ' %w%f' -e create,close_write,delete  /backup |
    while read line
    do
    	if [ ! -e "$line" ];then      如果此时执行了删除操作,则推送整个目录
    		cd $path &&
    		rsync -az --delete  ./ --delete rsync_backup@192.168.222.140::oldboy --password-file=/etc/rsync.password
    	else 						  如果只是创建文件或者目录,则只需要推送文件或目录
    		rsync -az --delete  $line rsync_backup@192.168.222.140::oldboy --password-file=/etc/rsync.password
    	fi
    done
    

    五、参数优化

    [root@weiwei ~]# cd /proc/sys/fs/inotify/
    [root@weiwei inotify]# ll
    total 0
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_queued_events   ===关键参数,可以搞大点,5000000
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_user_instances
    -rw-r--r-- 1 root root 0 Aug 16 15:13 max_user_watches    ===关键参数,327679
    [root@weiwei inotify]# cat *
    16384
    128
    8192
    

    在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
    max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
    max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
    max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

    修改参数:

    [root@weiwei data]# cat /proc/sys/fs/inotify/max_
    max_queued_events   max_user_instances  max_user_watches
    [root@weiwei data]# cat /proc/sys/fs/inotify/max_user_watches 
    8192
    [root@weiwei data]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
    [root@weiwei data]# cat /proc/sys/fs/inotify/max_user_watches 
    50000000
    [root@weiwei data]# cat /proc/sys/fs/inotify/max_queued_events 
    16384
    [root@weiwei data]# echo "326790" > /proc/sys/fs/inotify/max_queued_events
    [root@weiwei data]# cat /proc/sys/fs/inotify/max_queued_events 
    326790
    [root@weiwei data]# sysctl -p
    

    六、inotify优缺点

    优点:监控文件系统事件变化,通过同步工具实现实时数据同步。

    缺点:

    1)并发如果大于200个文件(10-100k),同步就会有延迟
    2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
    3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?

    七、参考文档

    https://github.com/rvoicilas/inotify-tools/wiki

  • 相关阅读:
    [swustoj 1021] Submissions of online judge
    [swustoj 404] 最小代价树
    [swustoj 917] K-lucky-number
    [swustoj 183] 种树
    [LA 3887] Slim Span
    [ahu 1248] NBA Finals
    用js获取当前月份的天数
    WampServer
    jquery checkbox选中、改变状态、change和click事件
    为什么排版引擎解析 CSS 选择器时一定要从右往左解析?
  • 原文地址:https://www.cnblogs.com/bill2014/p/7411711.html
Copyright © 2011-2022 走看看