-->
inotify是Linux内核的新功能,用于监控文件系统的事件,此功能对于海量小文件的备份很有帮助。
我手头管理着一组服务器,每台服务器上存放大量小文件,一天之中,更新的文件数量达到30万左右(这个数据是从rsync的日志中得到的,每天我们会运行一组rsync脚本,用于备份数据。完成同步需要6个小时左右,每天的同一文件的多次变动还未计算在内),为了将在发生意外时,数据的损失减少到尽可能的小,我们通过linux的inotify功能,监控数据文件的目录,对创建,更改操作进行监控,并将文件的路径记入到日志文件中,每一分钟备份一次更新的文件。
整个脚本的部署分为以下几个步骤:
1、升级Linux内核,使其支持inotify功能
2、安装脚本所需的Perl模块。
3、生成监控数据,运行脚本
4、定制并运行日志外理命令。
5、管理inotify脚本。
具体过程如下:
1、升级Linux内核,使其支持inotify功能
使用inotify功能需要采用新的内核,我们以
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz boot]# mkinitrd initrd-2.6.26
[root@supersun.biz boot]# cd $KERNEL_DIR
[root@supersun.biz linux-
[root@supersun.biz linux-
[root@supersun.biz linux-
重启系统使用新内核。
2、安装脚本所需的Perl模块
[root@supersun.biz ~]# cpan Event
[root@supersun.biz ~]# cpan Linux::Inotify2
3、生成监控数据,运行脚本
创建inotifyd.pl脚本,脚本内容如下:
#!/usr/bin/perl
#auther:supersun
#e-mail:supersun06@gmail.com
#blog:http://supersun.biz
use strict;
use Event;
use Linux::Inotify2;
use POSIX;
use IO::File;
#For Daemon
###################################################
sub daemonize {
chdir
"/";
open STDIN,
"</dev/null";
open
STDOUT, ">/dev/null";
open
STDERR, ">&STDOUT";
defined(my $pid=fork) or die "Can't fork:
$!\n";
exit
if($pid);
POSIX::setsid() or die "Can't start a new session: $!";
umask 0;
}
sub get_log {
my
($LOG_FILE,$LOGS)=@_;
my
$TIME=localtime;
open
LOG,'>>',$LOG_FILE;
print LOG
"$LOGS\n";
close LOG;
}
sub add_watch {
my
($inotify,$log_file)=@_;
open
FH,$log_file;
while(<FH>){
my
$file=$_;
chomp $file;
$inotify->watch ($file, IN_ALL_EVENTS,
\&mywatch)
}
close
FH;
}
####################################################
&daemonize;
our $CONF_FILE="/var/log/inotify.db";
our $LOG_FILE="/var/log/inotify.log";
our $INOTIFY_OBJECT=new Linux::Inotify2;
Event->io (fd => $INOTIFY_OBJECT->fileno, poll
=> 'r', repeat => 1, cb => sub { $INOTIFY_OBJECT->poll });
Event->signal (signal => 'HUP',cb =>
\&re_conf);
add_watch($INOTIFY_OBJECT,$CONF_FILE);
Event::loop;
sub re_conf{
add_watch($INOTIFY_OBJECT,$CONF_FILE);
Event::loop;
}
sub mywatch {
my $e =
shift;
my $PATH=
$e->fullname;
my $MASK=
$e->mask;
$INOTIFY_OBJECT->watch($PATH,IN_ALL_EVENTS, \&mywatch) if ($e->IN_CREATE);
if($e->IN_ISDIR && $e->IN_CREATE) {
get_log $LOG_FILE, "$PATH";
return;
}
if($e->IN_MODIFY || $e->IN_CREATE){
get_log $LOG_FILE, "$PATH";
return
}
}
添加执行权限,并copy至/usr/local/sbin/目录下.
创建监控目录列表,便例如:
find /home/data -type d >/var/log/inotify.db
启动inotifyd.pl脚本:
对于65万行的记录启动时间大约是一分半钟,至此,inotidyd.pl脚本已经开始监控,脚本分将发生IN_MODIFY和IN_CREATE事件的文件记入到/var/log/inotify.log中。
4、定制并运行日志外理命令。
对于日志文件的处理,自己可以定制相关的命令,我使用的是logrotate和ftp对文件进行备份,
logrotate的配置文件/etc/inotify.logrotate内容如下:
/var/log/inotify.log {
rotate 1
postrotate
sh
/usr/bin/backup_inotify.sh
endscript
}
/usr/bin/backup_inotify.sh的内容如下:
#!/bin/sh
lftp_cmd="/tmp/lftp.cmd.$$"
echo "open xxx.xxx.xxx.xxx" >$lftp_cmd
echo "user xxx xxx" >>$lftp_cmd
cat /var/log/inotify.log.1 |sort |uniq |sed
's|/home/data/|mput -dc |g' >>$lftp_cmd
echo "exit" >>$lftp_cmd
cd /home/data/
lftp -f $lftp_cmd >>/var/log/lftp.log 2>&1
rm $lftp_cmd
添加以下条目到cron中
*/1 * * * * /usr/sbin/logrotate -f /etc/inotify.logrotate
>/dev/null 2>&1
5、管理inotify脚本。
此处的管理脚本是指发送HUP信号给inotifyd.pl脚本,让其重新读取/var/log/inotify.db(PS:脚本对运行过程中新产生的目录会自动进行监控)。
相关资料:
TSM针对大量小文件数据环境的备份策略

这篇文章写的不错,能联系