原创:如何让mrtg生成RRD格式的数据及图片

发表于:2007-07-04来源:作者:点击数: 标签:
最近1个月一直在做RRD相关的事情,有点小小的收获,与大家共享:) RRD的作者,也是MRTG的作者,RRD可以简单的说是MRTG的升级版,它比MRTG更灵活,更适合用shell、perl等程序来调用,成生所要的图片。而且从我个人角度来看,我觉得用RRD生成的图片比MRTG生成

最近1个月一直在做RRD相关的事情,有点小小的收获,与大家共享 :)
RRD的作者,也是MRTG的作者,RRD可以简单的说是MRTG的升级版,它比MRTG更灵活,更适合用shell、perl等程序来调用,成生所要的图片。而且从我个人角度来看,我觉得用RRD生成的图片比MRTG生成的更好看。当然,对使用者的要求也更高。
  引用一位我们CU上“台湾阿伯“的原话,看看MRTG与RRD相比有什么不足之处:
[quote:c57113dd2c]
1. 偵測時間不能小於5分鐘 ... 
2. 偵測 Target 過多,機器會跑不動,主因在 
2.1 mrtg 每次都會畫圖(最多一個target 會更動到4個圖),不實際, Broswer 時才畫才可能偵測上千上萬個 Target 
2.2 要更新 log file(絕不是什麼插入一行數據,而是N筆資料的修改) 
2.3 要更新每個 target 的 html page 
3. 不能表現三種以上資料 
如果 Scope 小, mrtg 再上述幾點狀況不會構成問題,若 Scpoe 大,例如,有 1000+ Target 要做,大概 100% 的機器都跑 
不動(可以把 mrtg.cfg 複製個 1000 份,每份改一個 filename & target name 即可測試).
[/quote:c57113dd2c]
    大家可以看一下他写的相关如何配置RRD的大作,http://www.study-area.net/tips/rrdtool/rrdtool.html ; 这想这是相关RRD的最好的中文实践指南了 :)
我要转化mrtg生成数据格式的原因,就是因为第2个原因:我们公司用一台DELL2650的服务器监控了200多台服务器的snmp数据,包括网卡、CPU、MEM、DISKIO、SWAPIO、线上人数等。Mrtg在每次更新数据(每5分钟一次)的时候都会去更新图片,这样它就要在5分中内更新4800多个图片。我们那台DELL2650的机器几乎已经满负运转了,想要再加一些新的监控项目进去几乎已经是不可能了。
但只要对mrtg的conf文件做一些更动,安装RRDtools,让MRTG生成RRD格式的数据,MRTG就在每次更新时只更新数据,而不会再去更新图片了。你可以写一个专门生成图片的程序,每1小时跑一次,或在要看那台机器图片的时候去更新那一台机器的RRD图片。这样就大大减低了监控服务器负载。
下面讲一下让mrtg生成RRD格式数据的配置方法:
1、安装RRDtool
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/download.html ;有rrdtoos的最新版本,可以去那下载
[code:1:c57113dd2c]
tar –zxvf rrdtool-1.0.49.tar.gz
cd rrdtool-1.0.49
configure && make && make install
cd /usr/local/
ln –s rrdtool-1.0.49 rrdtool
[/code:1:c57113dd2c]
OK,rrdtool安装完成 :)
2、更改mrtg的配置档
  在全局配置中加入下面三行(也就是WorkDir: xxxxxxxx  那一行前面)
  [code:1:c57113dd2c]
LogFormat: rrdtool
PathAdd: /usr/local/rrdtool/bin/
LibAdd: /usr/local/rrdtool/lib/perl/
[/code:1:c57113dd2c]
这样在mrtg下次运行的时候,就只会更新数据而不会去更新图片了。你会发现在你的Workdir目录中多了很多以.rrd结尾的文件,这就是rrd 的数据文件。很简单吧,下面的有点难了。
3、最后是要一个生成RRD图片的脚本,大家可以用http://my14all.sourceforge.net/ ;上的现成的工具,也可以自己写一个。我是自己用perl 写了一个,以満足我一些需要,下面是我写的生成图片的perl脚本,供大家参考之用:

[code:1:c57113dd2c]
#!/use/bin/perl
#作者:eagerlinuxer
#作用:生成RRD格式的SNMP数据图片的perl脚本

###启用RRD模块
use RRDs;
use File::Basename;
###参数1,站点名
my $site_name=$ARGV[0];
print "====================== $site_name RRD Graph Update ================== \n";
my $path_name="/home/tans/www/cgsnmp/$site_name";
my $now=`date "+%Y/%m/%d %H:%M:%S"`;
chomp $now;
###要更新的日、周、月、年四种图片
my @time_interval=qw/ day week month year /;
###参数2,服务器名
my $update_filename=$ARGV[1] if $ARGV[1];
###在Mrtg的WorkDir中找出要生成图片的文件名 文件格式是: 服务器名.监控设备-时间.rrd
my @rrd_filenames=`find $path_name/html/$update_filename*.rrd`;
my $file_name;
###定义在RRD图上要显示的不同单位
my %unit=('cpu'=>'%%','mem'=>'KB','eth1'=>'KB/s','eth0'=>'KB/s','disk'=>'%%','diskio'=>'KB/s','swapio'=>'KB/s','numn'=>'user','numd'=>'user','numa'=>'user');
###定义的RRD图上要显示的下标
my %mark=('cpu'=>['Used','Idle'],'mem'=>['Free  ','Buffer'],'eth1'=>['In ','Out'],'eth0'=>['In ','Out'],'disk'=>['SwapFree','HomeUsed'],'diskio'=>['diskio','diskio'],'swapio'=>['swapin ','swapout'],'numn'=>['world1','world2'],'numd'=>['world1','world2'],'numa'=>['world1','world2']);
###每服务器生成循环
for $file_name (@rrd_filenames){
  chomp ($file_name);
  $file_name=basename($file_name);
  my ($server_name,$server_type,undef)=split(/\./,$file_name);
  print "$server_name : $server_type updated \n";
  my $each_interval;
  ###每种时间间隔循环(日、周、月、年)
  for $each_interval (@time_interval){
    my $start_time=`date -d "1 $each_interval ago" +%s`;
    my $start_time_man=`date -d "1 $each_interval ago" "+%Y/%m/%d %H:%M:%S"`;
    chomp $start_time;
    chomp $start_time_man;
    @args= ("${path_name}/html/${server_name}.${server_type}-${each_interval}.png",
    "--title", "${server_name} ${server_type} ${each_interval} RRD IMG",   
    "DEF:t1=${path_name}/html/${server_name}.${server_type}.rrd:ds0:AVERAGE", 
    "DEF:t2=${path_name}/html/${server_name}.${server_type}.rrd:ds1:AVERAGE", 
    "AREA:t1#00dd00:$mark{$server_type}[0]", 
    "GPRINT:t1:MAX:Max \\:%4.0lf %s$unit{$server_type}",  
    "GPRINT:t1:AVERAGE:Average \\:%4.0lf %s$unit{$server_type}",           
#    "GPRINT:t1:MIN:Min \\:%4.0lf %s",                
    "GPRINT:t1:LAST:Last \\:%4.0lf %s$unit{$server_type}\\n",              
   "LINE2:t2#0066ff:$mark{$server_type}[1]",        
    "GPRINT:t2:MAX:Max \\:%4.0lf %s$unit{$server_type}",  
    "GPRINT:t2:AVERAGE:Average \\:%4.0lf %s$unit{$server_type}",  
#    "GPRINT:t2:MIN:Min \\:%4.0lf %s",                
    "GPRINT:t2:LAST:Last \\:%4.0lf %s$unit{$server_type}\\n",
    "COMMENT:Update from   $start_time_man--$now",             
    "-v","Unit $unit{$server_type}", "--interlace", "-M", "-Y", "-X", "b", "-h", "100", "-w", "300", "-s", "$start_time"
      );
#    print "$_ \n" for (@args);
    RRDs::graph (@args);
    my $ERROR = RRDs::error;
    die "$0: unable to  graph $rrd_file : $ERROR\n" if $ERROR;
  }
}
[/code:1:c57113dd2c]

相关的RRDs::graph的参数请参考 “台湾阿伯“的大作 :) 及英文官方文档http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/manual/rrdgraph.html

最后是用RRD生成的图片,大家看看:[/quote]

javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">









 eagerlinuxer 回复于:2004-12-05 20:23:18
继续上面:)






 a3linux 回复于:2004-12-10 10:10:26
好东西,支持!

 bewhi 回复于:2005-01-21 22:41:55
请问楼主:在运行perl 脚本的时候出现:

Can't locate RRDs.pm in @INC 

我安装RRDTOOL的时候,指定了prefix=/usr/local/rrdtool

而且我也在 /usr/local/rrdtool 下面找到了 RRDs.pm 和 RRDp.pm 但是CP到相应目录下,还是不起作用,请问为什么呢?

期待楼主的帮忙。

 bst 回复于:2005-01-21 22:56:39
精华.
明天有时间试一试. 
支持楼主.

 dlcat 回复于:2005-01-22 21:26:39
很有大型机房实际应用价值,感谢

 eagerlinuxer 回复于:2005-01-22 22:07:08
[quote:7150e74189="bewhi"]请问楼主:在运行perl 脚本的时候出现:

Can't locate RRDs.pm in @INC 

我安装RRDTOOL的时候,指定了prefix=/usr/local/rrdtool

而且我也在 /usr/local/rrdtool 下面找到了 RRDs.pm 和 RRDp.pm 但是CP到相..........[/quote:7150e74189]

不知你把RRDs.pm模块放哪了,我是放在了/usr/lib/perl5/site_perl/5.6.1/i386-linux/RRDs.pm这儿。
应该就是没放对位置的原因 :)

 bewhi 回复于:2005-01-22 22:45:03
[quote:64c30f4891="eagerlinuxer"]

不知你把RRDs.pm模块放哪了,我是放在了/usr/lib/perl5/site_perl/5.6.1/i386-linux/RRDs.pm这儿。
应该就是没放对位置的原因 :)[/quote:64c30f4891]

首先感谢楼主的答复。

经过查阅主站资料,和自己努力。已经可以了谢谢。

 :em02:  :em02:  :em02:  :em02:  :em02:

 bjutline 回复于:2005-07-21 22:48:01
各位大虾,问些弱智的问题,请给与答复!
我按照上边的安装好了mrtg、rrdtool,也在收集数据的目录下生成了
*.rrd文件。然后怎么办?怎么配置一个脚本程序来生成观测页面和图片?
我用的是14all-1.1p25.tar.gz。
我不懂脚本编程的过程,所以主要想问的是怎么使用这个脚本程序或上边稳中提到的自己写的那个脚本?怎么看(在地址栏里输入什么样的url)产生的观测结果?
我的QQ 16897159
msn:bjutline@hotmail.com
E-mail:bjutline@126.com
拜托了!有哪位请给解答一下或留个联系方式,讨论一下

 风流涕淌 回复于:2005-07-21 23:56:56
先收藏下,有空看

 abel 回复于:2005-07-22 10:39:01
[quote:283db6aaab="bjutline"]各位大虾,问些弱智的问题,请给与答复!
我按照上边的安装好了mrtg、rrdtool,也在收集数据的目录下生成了
*.rrd文件。然后怎么办?怎么配置一个脚本程序来生成观测页面和图片?
我用的是14all-1.1p25.tar.gz。
..........[/quote:283db6aaab]
http://bbs.chinaunix.net/forum/viewtopic.php?t=552218
這個裏面有講,
不過以您的問題來看,可能你還有不少的障礙

原文转自:http://www.ltesting.net