【江楓】用Perl的hash陣列實現個性化監控

idba發表於2008-06-07

對於DBA來說,一個準確穩定的監控系統,不啻於一柄尚方寶劍。幾十上百套系統,如果每天都靠人工來檢查,工作量之大無法想象,而且人工也無法做到實時捕獲錯誤。

但是這麼多資料庫系統,每個庫承載的壓力不一樣,對於整個系統的重要度也不一樣,負責的DBA也不可能是同一個人。如果都按同樣的KPI同樣的門限來做監控,則有些重要的系統可能無法準確的告警,有些不重要的系統卻又會頻繁誤報。

比如系統的load,有些核心庫由於採用了比較高階的硬體,即使一直在20~30左右都是正常的,而一些邊緣的庫則可能超過5就比較危險了,所以對於load,不同的庫必須設定不同的檢查門限。

如果要通過shell指令碼來實現這個需求,可能需要寫一堆的if或者case判斷,一旦要做配置變更就十分的頭疼。不過perl的hash陣列可以很好的解決這個問題。

#!/usr/bin/perl -w
# creator: jiangfeng
############################################################
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);                     
}

在send_mobile和send_wangwang實現告警傳送的函式中,傳入了$server引數,同樣可以使用hash陣列配置傳送給不同的責任人,基本思想和這裡沒有大的差別,就不重複貼程式碼了。

<!--

--EOF--

Trackback:http://rdc.taobao.com/blog/dba/html/149_using_perl_monitor_database.html/trackback

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-342873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章