专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>perl>

利用Perl的hash数组实现数据库监控

百度收藏 QQ搜藏

原文: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);                     
}

上一篇:Perl下sort,map的特别用法 下一篇:perl中的->符号的主要用法解释

power by soyo123 2007-2008