用inotify监控文件系统事件备份海量小文件

| 评论(1) | 暂无引用通告

-->

    inotify是Linux内核的新功能,用于监控文件系统的事件,此功能对于海量小文件的备份很有帮助。

    我手头管理着一组服务器,每台服务器上存放大量小文件,一天之中,更新的文件数量达到30万左右(这个数据是从rsync的日志中得到的,每天我们会运行一组rsync脚本,用于备份数据。完成同步需要6个小时左右,每天的同一文件的多次变动还未计算在内),为了将在发生意外时,数据的损失减少到尽可能的小,我们通过linux的inotify功能,监控数据文件的目录,对创建,更改操作进行监控,并将文件的路径记入到日志文件中,每一分钟备份一次更新的文件。

整个脚本的部署分为以下几个步骤:

1、升级Linux内核,使其支持inotify功能

2、安装脚本所需的Perl模块。

3、生成监控数据,运行脚本

4、定制并运行日志外理命令。

5、管理inotify脚本。


具体过程如下:

1、升级Linux内核,使其支持inotify功能

    使用inotify功能需要采用新的内核,我们以2.6.26的内核为例,编译内核的步骤如下:

[root@supersun.biz linux-2.6.26]# KERNEL_DIR=$(pwd)

[root@supersun.biz linux-2.6.26]# make mrproper

[root@supersun.biz linux-2.6.26]# make menuconfig

[root@supersun.biz linux-2.6.26]# make dep

[root@supersun.biz linux-2.6.26]# make clean

[root@supersun.biz linux-2.6.26]# make bzImage

[root@supersun.biz linux-2.6.26]# cp arch/x86_64/boot/bzImage /boot/vmlinuz-2.6.26

[root@supersun.biz linux-2.6.26]# make modules

[root@supersun.biz linux-2.6.26]# make modules_install

[root@supersun.biz linux-2.6.26]# cd /boot

[root@supersun.biz boot]# mkinitrd initrd-2.6.26 2.6.26

[root@supersun.biz boot]# cd $KERNEL_DIR

[root@supersun.biz linux-2.6.26]# cp System.map /boot/System.map-2.6.26

[root@supersun.biz linux-2.6.26]# cd /boot

[root@supersun.biz linux-2.6.26]# ln -s System.map-2.6.26 System.map

重启系统使用新内核。

 

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针对大量小文件数据环境的备份策略

http://blog.chinaunix.net/u/10516/showart_469541.html

暂无引用通告

发送引用通告网址: http://supersun.info/mt/mt-tb.cgi/904
如果您想引用这篇日记到您的Blog,请复制上面的链接,放置到您发表文章时的相应界面中。

评论(1)

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

发表评论

最新资源

  • IMG_1437.JPG
  • line.png
  • bar.png
  • perl_calander.jpg

关于此日记

此日记由 supersun 发表于 2008年12月 9日 15:11

此Blog上的上一篇日记Perl中检测文件编码

此Blog上的下一篇日记如何获取进程的启动时间

首页归档页可以看到最新的日记和所有日记。