原文:http://www.ningoo.net/html/2008/using_perl_monitor_database.html
对于DBA来说,有准确稳定的监控系统是再好不过了。而几十上百套数据库系统,如果每天都靠人工来检查,工作量之大无法想象,而且人工也无法做到实时捕获错误。每个库承载的压力不一样,对于整个系统的重要度也不一样,负责的DBA也不可能是同一个人。如果都按同样的KPI同样的门限来做监控,则有些重要的系统可能无法准确的告警,有些不重要的系统却又会频繁误报。
举例说下系统的load,不同的库必须设置不同的检查门限。有些核心库由于采用了比较高端的硬件,即使一直在20~30左右都是正常的,而一些边缘的库则可能超过5就很危险了。
如果要通过shell脚本来实现这个需求,可能需要写一堆的if或者case判断,一旦要做配置变更就十分的头疼。不过用perl的hash数组可以很好的解决这个问题。
该perl代码如下:
#!/usr/bin/perl -w # creator: NinGoo ############################################################ use strict;
# 配置各主机各KPI的检查门限 # 这里配置了两个门限值,达到第一个值发IM提醒,达到第二个值发手机短信 # server, load1 load2 my %cutoff=("db1", [ 30, 40 ], "db2", [ 20, 35 ], "db3", [ 10, 18 ] );
# 配置各个门限值的数组中的位置,这样在以后即使修改门限的位置,也不需要修改功能代码 # 将配置和功能分开,将极大的简化后续维护工作 my ($load1,$load2)=(0,1); ############################################################ # 检查load的函数 sub check_load{ my($server)=@_; my $load=get_server_load(); #获得数据库主机当前load,具体实现这里就不赘述了 my $cutoff1=$cutoff{$server}[$load1]; my $cutoff2=$cutoff{$server}[$load2]; if ( $load > $cutoff2){ my $mesg=$server." load more than ".$cutoff2.",now is ".$load."\n"; send_mobile($server,$mesg); # 大于load2,发送手机告警 } elsif( $load > $cutoff1){ my $mesg=$server." load more than ".$cutoff1.",now is ".$load."\n"; send_wangwang($server,$mesg); # 大于load1,发送旺旺告警 } } ############################################################ #循环检查所有主机的load foreach my $server(keys(%cutoff)){ print "---- ".$server." -----\n"; check_load($server); } |