Archive

Archive for the ‘操作系统’ Category

用Perl的hash数组实现个性化监控

May 26th, 2008 3 comments

对于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数组配置发送给不同的责任人,基本思想和这里没有大的差别,就不重复贴代码了。

Categories: 操作系统, 数据库 Tags: , ,

Taobao监控系统之改进——文件传输

April 22nd, 2008 7 comments

在早些的时候,也包括我的书《构建Oracle高可用环境》中的16章,关于监控体系的介绍中,所有的案例都是采用scp从被监控的客户端上拷贝文件到集中分析的Monitor上,类似这样的动作,如

scp $SOURCE_FILE $MONITOR:$TARGET_FILE

当客户端不多的情况下,这么做也是没有什么问题的,而且书写简单,一直在这么用。但是,当客户端的数量上去以后,在大量并发的情况下,有的时候就会出现这样的错误:

ssh_exchange_identification: Connection closed by remote host
lost connection

查看crontab的日志,也可以看到有部分crontab调度失败:

Cron Job with pid: 2859224 Successful
Cron Job with pid: 3154900 Failed
Cron Job with pid: 3027512 Successful

Read more…

Categories: 操作系统 Tags: , , ,

一则ORA-12500错误的解决案例

April 15th, 2008 2 comments

环境:

OS:AIX 5.3
$oslevel -s
5300-06-04-0748
DB:Oracle 9206

我们的一台生产环境,突然系统监测到大量的连接失败,通过监听的日志,可以发现部分连接是成功的,部分连接是失败的。如

成功的连接

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=shop48.cm2)(USER=admin))) * (ADDR
ESS=(PROTOCOL=tcp)(HOST=172.19.26.48)(PORT=49288)) * establish * feel * 0

失败的连接

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=app131)(USER=admin))) * (ADDRESS=
(PROTOCOL=tcp)(HOST=192.168.60.131)(PORT=55076)) * establish * feel * 12500
TNS-12500: TNS:listener failed to start a dedicated server process
TNS-12540: TNS:internal limit restriction exceeded
TNS-12560: TNS:protocol adapter error
TNS-00510: Internal limit restriction exceeded
IBM/AIX RISC System/6000 Error: 12: Not enough space

Read more…

Categories: 操作系统, 数据库 Tags: , , ,

解决xmanager无法启动AIX的CDE桌面一例

March 1st, 2008 2 comments

昨天在AIX上中安装oracle9i的时候,xmanager能连上服务器,也能登陆,但之后就一直停在starting CDE environment,桌面死活出不来。检查服务器,CDE是安装了的,执行/etc/rc.dt也能顺利启动,检查dtlogin也运行正常。

最后发现,问题出在/etc/hosts上,假设主机名为test,IP地址为192.168.168.1,/etc/hosts文件中存在如下记录

192.168.168.1 test1 test

也就是这个位于test之前的test1造成了问题,去掉后桌面正常出来了。还有一个小问题,在AIX上安装9i会要求指定JDK1.3.1的位置,大多数情况下,安装程序会在$ORACLE_BASE/jre上安装一个1.1.8和1.3.1的版本,但有时也可能碰到没有安装的情况,这时可以指定系统中其他版本的JDK,比如/usr/java14,系统中是否已经安装其他版本的jdk可以通过which java来查看。

记录一下备忘。

Categories: 操作系统 Tags: , ,