對於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,發送WangWang警示
}
}
############################################################
#迴圈檢查所有主機的load
foreach my $server(keys(%cutoff)){
print "---- ".$server." -----/n";
check_load($server);
}
在send_mobile和send_wangwang實現警示發送的函數中,傳入了$server參數,同樣可以使用hash數組配置發送給不同的責任人,基本思想和這裡沒有大的差別,就不重複貼代碼了。
--EOF--