最近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)"> | |||||||||||||||||||||||||||||||
|