路漫漫其修远兮
吾将上下而求索

rsync+inotify配置

1、rsync不足

与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过crontab方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

2、什么是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可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

3、inotify-tools

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

安装

[root@localhost /tmp/etc]#yi inotify-tools
# rpm -qa|grep inotify
inotify-tools-3.14-1.el5.x86_64

4、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

5、rsync组合inotify-tools完成实时同步

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

5.1、创建排除在外不同步的文件列表

排除不需要同步的文件或目录有两种做法,第一种是inotify监控整个目录,在rsync中加入排除选项,简单;第二种是inotify排除部分不监控的目录,同时rsync中也要加入排除选项,可以减少不必要的网络带宽和CPU消耗。我们选择第二种。

5.2、inotifywait排除

这个操作在客户端进行,假设/tmp/etc/mail/2014/以及/tmp/etc/mail/2015/cache/目录下的所有文件不用同步,所以不需要监控,/tmp/etc/下的其他文件和目录都同步。(其实对于打开的临时文件,可以不监听modify时间而改成监听close_write)

inotifywait排除监控目录有–exclude <pattern>,通过正则表达式匹配 –fromfile <file>通过排除具体的目录或文件。

使用fromfile格式只能用绝对路径,不能使用诸如*正则表达式去匹配,@表示排除。

# vi /etc/inotify_exclude.lst:
/tmp/etc/pdf
@/tmp/etc/2014

如果要排除的格式比较复杂,必须使用正则,那只能在inotifywait中加入选项,如–exclude '(.*/*\.log|.*/*\.swp)$|^/tmp/etc/mail/(2014|201.*/cache.*)',表示排除/tmp/etc/mail/以下的2014目录,和所有201*目录下的带cache的文件或目录,以及/tmp/etc目录下所有的以.log或.swp结尾的文件。

5.3、rsync排除

使用inotifywait排除监控目录的情况下,必须同时使用rsync排除对应的目录,否则只要有触发同步操作,必然会导致不该同步的目录也会同步。与inotifywait类似,rsync的同步也有–exclude和–exclude-from两种写法。

个人还是习惯将要排除同步的目录卸载单独的文件列表里,便于管理。使用–include-from=FILE时,排除文件列表用绝对路径,但FILE里面的内容请用相对路径,排除同步的内容包括,mail下的2014目录,类似2015/201501/20150101/下的临时或隐藏文件,等:

#vi /etc/rsync_exclude.lst
mail/2014/
mail/201*/201*/201*/.??*
mail??*
src/*.html*
src/js/
src/ext3/
src/2014/20140[1-9]/
src/201*/201*/201*/.??*
membermail/
membermail??*
membermail/201*/201*/201*/.??*

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

在客户端安装工具:inotify-tools

在命令行测试是否能够正常运行

[root@localhost /tmp]#/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' -e modify,delete,create,move,attrib /tmp/etc \
 | while read file;do /usr/bin/rsync -auvrtzopgP  --stats --delete --bwlimit=200   \
 --password-file=/etc/rsyncd.passwd /tmp/etc/ admin1@192.168.175.12::mydata; done

下面是一个完整的同步脚本,请根据需要进行裁剪,rsync.sh:

[root@localhost /tmp]#cat rsync.sh 
#!/bin/bash
#rsync auto sync script with inotify
#someone
#variables
current_date=$(date +%Y%m%d_%H%M%S)
source_path="/tmp/etc/"
log_file=/var/log/rsync_inotify.log

#rsync
rsync_server=192.168.175.12
rsync_user=admin1
rsync_pwd=/etc/rsyncd.passwd		#rsync的密码文件目录
rsync_module=mydata		#服务端定义的文件模块名
INOTIFY_EXCLUDE='(.*/*\.conf|.*/*\.swp)$|^/tmp/etc/mail/(2014|20.*/.*che.*)'
RSYNC_EXCLUDE='/etc/rsync_exclude.lst'

#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' \
       			--exclude ${INOTIFY_EXCLUDE}  \
			-e modify,delete,create,move,attrib ${source_path} \
			| while read file; do
				/usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --delete --bwlimit=200 \
				--password-file=${rsync_pwd} ${source_path} ${rsync_user}@${rsync_server}::${rsync_module} 
			done
}

inotify_fun >> ${log_file} 2>&1 &

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

在客户端运行脚本# ./rsync.sh即可实时同步目录。也可以设置开机启动,或者制作service脚本文件

echo "/tmp/rsync.sh" >> /etc/rc.local

我也不知道为什么有两个进程

[root@localhost /tmp]#bash rsync.sh 
[root@localhost /tmp]#ps aux | grep rsync
root       8045  0.0  0.0 106108   600 pts/1    S    19:35   0:00 bash rsync.sh
root       8047  0.0  0.0 106108   492 pts/1    S    19:35   0:00 bash rsync.sh
root       8049  0.0  0.1 103316   844 pts/1    S+   19:35   0:00 grep rsync

正常工作了,在客户端创建删除文件,会立即同步到远程的服务器上面

7、理想情况下的系统框架图

备份服务器端有三个目录,分别接受三个不同的用户来进行推送文件到这里备份,三个目录的属主用户名分别为三台服务器创建,

rsync+inotify.zip

image.png

参考文档1

未经允许不得转载:江哥架构师笔记 » rsync+inotify配置

分享到:更多 ()

评论 抢沙发

评论前必须登录!