inotify-rsync实时备份

Linux实时备份软件:inotify、sersync、lrsyncd。实时监控NFS目录文件系统事件变化,再通过crond+rsync来实现实时备份。
一、rsync + inotify 组合的起源
Rsync(remotesync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。
 
二、inotify简介
1、Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。还有国人周洋在金山公司开发的sersync。
2、Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。
3、inotify 的实现有几款软件
1)inotify-tools,
2)sersync(金山周洋)
3)lsyncd
 
三、安装与参数详解
1、yum安装inotify:
#wget -O/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y installinotify-tools
rpm -qa inotify-tools
2、关键参数说明:
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
3、inotifywait命令常用参数详解:inotifywait--help
inotifywait参数        含义说明
-r--recursive        递归查询目录
-q--quiet        打印很少的信息,仅仅打印监控事件的信息
-m,--monitor        始终保持事件监听状态
--exclude        排除文件或目录时,不区分大小写。
--timefmt        指定时间输出的格式  %y年 %m月 %d日 %H小时 %M分钟
--format        打印使用指定的输出类似格式字符串  %T时间 %w路径 %f文件名 %e状态
-e,--event        通过此参数可以指定需要监控的事件,如下一个列表所示
-e :--event的各种事件含义:
Events                含义
access                文件或目录被读取
modify                文件或目录内容被修改
attrib                文件或目录属性被改变
close                文件或目录封闭,无论读/写模式
open                文件或目录被打开
moved_to        文件或目录被移动至另外一个目录
move                文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create                文件或目录被创建在当前目录
delete                文件或目录被删除
umount                文件系统被卸载
 
四、使用与测试
1、测试create:打开两个虚拟终端ps/0ps/1
ps/0:
# ls /backup
# inotifywait -mrq--timefmt '%Y-%m-%d:%H:%M' --format '%T %w%f' -e create /backup
ps/1:
# cd /backup
# touch tang.txt
ps/0:会监测到:2018-11-24:11:52/backup/tang.txt
2、测试delte:
ps/0:# inotifywait -mrq--timefmt '%Y-%m-%d:%H:%M' --format '%T %w%f' -e delete /backup
ps/1:# rm tang.txt
ps/0: 2018-11-24:11:59/backup/tang.txt
3、测试close_write:
ps/0:# inotifywait -mrq--timefmt '%Y-%m-%d:%H:%M' --format '%T %w%f' -e close_write /backup
ps/1:# touchtang.txt;echo 123 > tang.txt
ps/0:   2018-11-24:12:03 /backup/tang.txt
          2018-11-24:12:03 /backup/tang.txt
4、测试move_to:
ps/0:# inotifywait -mrq--timefmt '%Y-%m-%d:%H:%M' --format '%T %w%f' -e moved_to /backup
ps/1:# mv tang.txtTANG.TXT;mkdir tang ;mv TANG.TXT tang
ps/0:     2018-11-24:12:06 /backup/TANG.TXT
            2018-11-24:12:06/backup/tang/TANG.TXT
5、编写inotify实时监控脚本
#!/bin/bash
BACKUP_SERVER=192.168.10.7
/usr/bin/inotifywait-mrq --format '%w%f' -e create,close_write,delete /data | while read line
do
    cd /data
    rsync -az ./ --deletersync_backup@$BACKUP_SERVER::backup --password-file=/etc/rsync.password
done
此脚本简单,但是效率低,效率低的原因在于只要目录出现变化就会导致整个目录下的所有文件都被推送一遍。
可更改脚本提高效率:
#!/bin/bash
#inotify rsync
Path=/backup
BACKUP_SERVER=192.168.10.7
/usr/bin/inotifywait-mrq --format '%w%f' -e create,close_write,modify,delete /backup  | while read line 
do
    if [ -f $line ];then
                relative_file=`echo $line | awk-F "$Path" '{print $2}'`
        cd $Path &&\
        rsync -azR ./$relative_file --deletersync_backup@$BACKUP_SERVER::backup --password-file=/etc/rsync.password &
    else
        cd $Path &&\
        rsync -az ./ --deletersync_backup@$BACKUP_SERVER::backup --password-file=/etc/rsync.password &
    fi
done
脚本可以加入开机启动:
echo "/bin/sh/server/scripts/inotify.sh &" >> /etc/rc.local
6、关键参数调整
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
实战调整:
# cat/proc/sys/fs/inotify/max_
max_queued_events   max_user_instances  max_user_watches
# echo"50000000" > /proc/sys/fs/inotify/max_user_watches
# cat/proc/sys/fs/inotify/max_queued_events
16384
# echo"326790" > /proc/sys/fs/inotify/max_queued_events
# sysctl -p
7、Rsync+inotify实时数据同步并发简单测试
Rsync+inotify实时数据同步并发简单测试
10K-100K
每秒100个并发
# cd /backup
# pasteinotify_100_server.log
inotify_100_backup_server.log> inotify_100.txt
# cat inotify_100.txt
23:05       34227  23:05   34227
23:05       34387  23:05   34387
23:05       35027  23:05   35027
23:05       35587  23:05   35587
23:05       36473  23:05   36473
23:05       36707  23:05   36707
23:05       37587  23:05   37587
以下省略...
8、小结
Inotify实时并发:经过测试,每秒200文件并发,数据同步几乎无延迟(小于1秒)
 inotify 优点:监控文件系统事件变化,通过同步工具实现实时数据同步。
inotify 缺点
1)并发如果大于200个文件(10-100k),同步就会有延迟
2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
3)监控到事件后,调用rsync同步是单进程的(末尾加&符多进程并发),而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?
serysync功能多:(inotify+rsync命令)
1)支持通过配置文件管理
2)真正的守护进程socket
3)可以对失败文件定时重传(定时任务功能)
4)第三方的HTTP接口(例如:更新cdn缓存)
5)默认多进程rsync同步
高并发数据实时同步方案小结:
1)inotify(sersync)+rsync,是文件级别的。
2)drbd文件系统级别,文件系统级别,基于block块同步,缺点:备节点数据不可用
3)第三方软件的同步功能:mysql同步(主从复制),oracle,mongodb
4)程序双写,直接写两台服务器。
5)利用产品业务逻辑解决(读写分离,备份读不到,读主)
6)NFS集群(1、4、5方案整合)(双写主存储,备存储用inotify(sersync)+rsync,备没有找主解决延迟问题)
 
五、使用start/stop启动或关闭脚本:vim/etc/init.d/syncd
#!/bin/bash
#chkconfig: 2345 38 46
#################################
. /etc/init.d/functions
start(){
   /bin/bash /server/scripts/inotify_rsync.sh &
    if[[ !-e /var/run/inotify.pid ]]; then
      cd /var/run && touch inotify.pid
    fi
    echo$$>/var/run/inotify.pid
    if[[ `ps-ef | grep inotify | wc -l` -gt 2 ]]; then
      action'inotify starting:' /bin/true
    else
      action'inotify starting:' /bin/false
    fi
}
stop(){
    kill-9 `cat /var/run/inotify.pid` &> /dev/null
   pkill inotifywait
   sleep 2
    if[[ `ps-ef | grep -v grep | grep inotifywait | wc -l` -eq 0 ]]; then
      action'inotify stopped' /bin/true
    else
      action'inotify stopped' /bin/false
    fi
}
case $1 in
   start )
      start
      ;;
    stop)
      stop
      ;;
   restart|reload)
      stop
      start
      ;;
    * )
      echo"usage:$0 {start|stop|restart|reload}"
      exit 1
      ;;
esac
# chmod -x/etc/init.d/syncd
# chkconfig --add syncd
# chkconfig syncd on