MSTP专线由于是光纤通过光猫转换器转换成RJ45的电口到路由器,会导致一个问题,当链路上的光纤有中断时,接到路由器上的电口状态还是UP的,路由器对此无感知,这对我们的监控带来了困扰,因为通常对专线的监控都是监控接口的状态。

根据查询相关资料,监控的方式有以下几种:

  1. 光猫转换器换成光电联动的光猫转换器,这种光猫转换器,光口down后,电口也会down,相应的路由器上的电口也就down了。据说有这种,我没有用过
  2. 思科snmp协议有一个支持远程ping的OID,但是整个过程会很烦锁,当监控多条专线时,需要编程来处理。对这方面有兴趣的可参考:http://www.cnblogs.com/cunshen/articles/163987.html 以及 http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/13383-21.html#examp
  3. 使用路由器的ip sla与eem联动,原理是使用ip sla定时ping对方的接口地址,当发现对方的IP不通后,强制shutdown相应的专线接口。这种方式有一个问题,就是接口shutdown后,在运营商修复线路后,需要人工在设备上启动相应接口,不能自动总是不太好的,特别是节假日无人值班时。可参考http://www.zhaocs.info/sla_eem_1.html

继续阅读

最近收到zabbix的监控报警,是一个交换机重启的误报,提示交换机重启了,但查看后发现实际并没有重启。

我们发现监控是否重启是监控交换同的引导时间,使用的是如下OID:

[root@vm-new-2 ~]# snmpwalk -v 2c -c public 10.99.88.25 1.3.6.1.2.1.1.3.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2073092193) 239 days, 22:35:21.93

继续阅读

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

上面的介绍有点绕,我是这么简单粗暴地理解的:JMX之于JVM或JAVA,相当于SNMP之于OS。只是JMX比SNMP更强大,除了监控外,还可以通过JMX对JAVA程序进行管理,如更改一些配置等。

Zabbix已经集成JMX,可以用Zabbix通过JMX监控JVM,TOMCAT,Weblogic,Jboss等。要使用Zabbix监控Weblogic,我们先要了解Zabbix的JMX监控架构,Weblogic的JMX信息,最后才能去实现怎么去配置监控和报警。

继续阅读

以前使用nagios比较多,zabbix用得相对少一些。 发现zabbix对比nagios+cacti还是有些区别的:

1. zabbix的监控结果和数据全是存在数据库内,cacti是用一种rrd的文件DB。

2.zabbix有触发器,写监控脚本时只要把数据抓过来就行了,然后再去zabbix内配置触发器,做不同的报警。而nagios一般是直接写在脚本内了。

3.其它…以后再补充

 

zabbix的内置了很多key,如:

1、监控进程
/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “net.tcp.service[http]”

2、监控端口
/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “net.tcp.port[,80]” 结果:1存在,0不存在;

3、进程数量
/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “proc.num[]”
/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “proc.num[httpd]”

4、执行命令

/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “system.run[curl -s  “http://127.0.0.1/php-fpm-uuzu-status”  | grep ‘idle processes’ | awk ‘{print $3;}’]”

/usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -k “system.run[ps auxw | grep ‘httpd’ | grep -v ‘grep’ -c]”

继续阅读

#!/usr/bin/perl -w
#
######################################################################################################
#requirement:
#rpm -ivh http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
#yum -y install perl-Authen-SASL perl-MIME-Base64 perl-Net-SMTP_auth perl-Net-SMTP-TLS perl-Net-SMTP-SSL
#
#脚本功能: 邮件发送脚本,支持中文
#
#作    者: Luo Hui(farmer.luo at gmail.com)
#最后时间: 2010.05.09
#版    本:Ver 0.4
#
#
#######################################################################################################

use strict;
use warnings;
use DBI();
use File::Basename;
use MIME::Base64;
use Net::SMTP;
use Net::SMTP::TLS;
use vars qw($opt_t); # 邮件主题
use vars qw($opt_m); # 发送的邮件地址
use vars qw($opt_c); # 邮件内容
use vars qw($opt_b); # 邮件编码  
use vars qw($opt_h); # 帮助
use Getopt::Std;

#smtp服务器
my $smtp_server = ‘smtp.gmail.com’;
#smtp服务器类型
my $smtp_type = ‘SMTP_TLS’;
#smtp服务器端口
my $smtp_port = 587;
#smtp认证用户名
my $username = ‘test@test.com’;
#smtp认证密码
my $password = ‘test’;
#smtp发件人
my $from_mail = ‘test@test.com’;

$opt_t = "";
$opt_c = "";
$opt_m = "";
$opt_b = "UTF-8";

getopt(‘htcmb’);

if ( $opt_t eq "" || $opt_c eq "" ) {
    print "Usage:n" , basename( $0 ) , " -b ‘UTF-8 | GB2312′  -m ’email address’ -t ‘mail title’ -c ‘mail content’ n";
    exit(1);
}

#$opt_c = encode_base64( $opt_c );
#print $opt_c;
$opt_c =~ s/n/<br>/g;
$opt_c =~ s/ /&nbsp;/g;
#print $opt_c;

#邮件主题
my $subject = encode_base64( $opt_t, "" );

if ( $smtp_type eq ‘SMTP_TLS’ ) {

    my $smtp = new Net::SMTP::TLS(
        $smtp_server,
        Hello   =>      $smtp_server,
        Port    =>      $smtp_port,
        User    =>      $username,
        Password=>      $password);
    $smtp->mail($from_mail);
    $smtp->to($opt_m);
    $smtp->data;

    # send mail head
    $smtp -> datasend( "From: $from_mailn" );
    $smtp -> datasend( "To: $opt_mn" );
    #$smtp -> datasend( "MIME-Version: 1.0 n" );
    $smtp -> datasend( "Content-Type: text/html; charset=${opt_b}; n" );
    #$smtp -> datasend( "Content-Transfer-Encoding: base64n" );
    $smtp -> datasend( "Subject: =?${opt_b}?B?$subject?=nn");

    # send mail body
    $smtp -> datasend( $opt_c );
    $smtp -> dataend();

    #print "send mail to:$opt_mn";

    $smtp -> quit();
} elsif ( $smtp_type eq ‘SMTP’ ) {

    my $smtp = Net::SMTP -> new( Host => $smtp_server,
    #            Debug => 1,
                Hello => $smtp_server,
                ) || die "Can’t connect $smtp_server $!n";

    $smtp -> auth( $username, $password ) || die "Can’t authenticate: $!n";

    $smtp -> mail( $from_mail );
    $smtp -> to( $opt_m );
    $smtp -> data( );

    # send mail head
    $smtp -> datasend( "From: $from_mailn" );
    $smtp -> datasend( "To: $opt_mn" );
    #$smtp -> datasend( "MIME-Version: 1.0 n" );
    $smtp -> datasend( "Content-Type: text/html; charset=${opt_b}; n" );
    #$smtp -> datasend( "Content-Transfer-Encoding: base64n" );
    $smtp -> datasend( "Subject: =?${opt_b}?B?$subject?=nn");

    # send mail body
    $smtp -> datasend( $opt_c );
    $smtp -> dataend();

    #print "send mail to:$opt_mn";

    $smtp -> quit();

} else {
    #print "smtp type error!n";
    exit(2);
}

因为需要从linux命令行发送邮件,所以稍微研究了一下mail工具(环境Debian 5.0  64bit MTA由EXIM4 提供,使用zh_cn.utf-8语言环境,bash命令行环境)。

开始使用

》mail -s <主题><xxx@emailhost><<emailtextfile>

形式发送,英文很正常,但中文有乱码,后研究mail的手册,采用
 

》mail -a "Content-Type:text/plain;charset=utf-8"-s <主题><xxx@emailhost><<emailtextfile>

形式来发送,则文件具体内容正常了,但如果邮件主题中有中文,则还是显示乱码,看来"Content-Type:text/plain;charset=utf-8" 不影响邮件主题解析。
后查到要在标题中正常显示也是需要指定主题部分编码,形式是
 =?<编码名称>?<B/Q>?<主题内容的B/Q编码>?=
  其中编码名称可以是utf-8或者gb2312等等
     B/Q 分别代表base64或quoted_printable 编码
在Debian下有base64转码命令工具 base64,它的使用很简单
   

》base64 [OPTION][FILE]

OPTION主要有
           -d 表示解码
           -i 和-d配合使用,表示忽略非字符
      而不加参数就是对文件编码。
所以最后的命令成了

》mail -a "Content-Type:text/plain;charset=utf-8"-s "=?utf-8?B?`echo <主题> | base64`?="<xxx@emailhost><<emailtextfile>

注意命令中的反引号,根据bash命令行特性,还可以改为

》mail -a "Content-Type:text/plain;charset=utf-8"-s "=?utf-8?B?$(echo <主题> | base64)?="<xxx@emailhost><<emailtextfile>

现在apache用得越来越少了,大家都改用nginx。但有些东西还是比较依赖apache,如nagios。

想让nagios在nginx上运行,必需先让nginx支持perl和cgi解析的功能,需要用到fcgi-perl,安装方式参见我的上一篇blog:

在nginx上配置使用bugzilla

在这里就不多说了。

现在帖上perl的fast-cgi起来后,nginx的配置:

   server {
        listen       80;
        server_name  monitor.xxxx.com;

        root   /data1/www/monitor.xxxx.com;
        index  index.php index.html index.htm;

        access_log /data1/app/log/nginx/monitor.xxxx.com.log  combined;
        error_log  /data1/app/log/nginx/error-monitor.xxxx.com.log notice;

        allow 10.0.0.0/8;
        deny all;

        location ~ .php$ {

            root  /data1/www/monitor.xxxx.com;

            fastcgi_pass   unix:/data1/app/tmp/php-cgi.sock;
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }

        location /nagios/ {

            alias /usr/share/nagios/;
            index index.html index.htm index.php;

            auth_basic "Nagios Access";
            auth_basic_user_file htpasswd.users;

            location ~ .php$ {
                root /usr/share;
                fastcgi_pass   unix:/data1/app/tmp/php-cgi.sock;
                fastcgi_index  index.php;
                include        fastcgi.conf;
            }

        }

        location ~ .*.(pl|cgi)$ {
            rewrite ^/nagios/cgi-bin/(.*).cgi /$1.cgi break;

            auth_basic "Nagios Access";
            auth_basic_user_file htpasswd.users;

            gzip off;
            include fastcgi_params;
            fastcgi_pass  127.0.0.1:8999;
            fastcgi_index index.cgi;
            fastcgi_param SCRIPT_FILENAME  /usr/lib64/nagios/cgi$fastcgi_script_name;
            fastcgi_param AUTH_USER $remote_user;
            fastcgi_param REMOTE_USER $remote_user;

        }

   }

 

然后重新生成认证文件htpasswd.users放在nginx的conf目录。重启nginx服务便可。

生成认证文件使用:

htpasswd -c htpasswd.users nagiosadmin

特别注意下面两个参数,一定要加上:

            fastcgi_param AUTH_USER $remote_user;
            fastcgi_param REMOTE_USER $remote_user;

否则进入nagios会提示没有认证。

 

 

Dell有一套监控硬件的软件,Linux/windows都可以监控。

官方网址:http://linux.dell.com/repo/hardware/

安装方法(centos linux 5.7 x64):

被监控服务器:

1) 增加dell的yum库

wget -q -O – http://linux.dell.com/repo/hardware/OMSA_6.5.2/bootstrap.cgi | bash

 

2) 安装srvadmin
Installing OpenManage Server Administrator
yum install srvadmin-all

 

3)安装firmware-tools,这个也可以不装,升级bios这类的用的。
Installing firmware-tools to manage BIOS and firmware updates
yum install dell_ft_install

 

4) 启动srvadmin:

/opt/dell/srvadmin/sbin/srvadmin-services.sh start

可以把上面的命令加入/etc/rc.local内开机启动。

 

5) 重启snmpd(假定您已经配置好了snmpd):

service snmpd restart

 

监控端:

1)安装perl的库:
yum install perl-Net-SNMP perl-Config-Tiny perl-Crypt-Rijndael

 

2) 安装nagios插件openmanage(需先配置好nagios server):
wget http://folk.uio.no/trondham/software/files/nagios-plugins-openmanage-3.7.3-1.el5.x86_64.rpm

 

3) 修改配置文件:
vim /etc/nagios/objects/commands.cfg
define command {
        command_name    check_openmanage
        command_line    /usr/lib64/nagios/plugins/check_openmanage -H $HOSTADDRESS$
}

vim /etc/nagios/objects/hosts.cfg
define service{
    use                             generic-service         ; Name of service template to use
    hostgroup_name                  all_servers
    service_description             Dell OMSA
    check_command                   check_openmanage
    normal_check_interval           10
    }

 

4) 重启nagios

service nagios reload

 

完成。

 

也可以手工用脚本调试:

[root@web ~]# /usr/lib64/nagios/plugins/check_openmanage -H 192.168.2.4
OK – System: ‘PowerEdge R510 II’, SN: ‘XXXXXXX’, 48 GB ram (6 dimms), 2 logical drives, 8 physical drives

 

如果报错:

 SNMP CRITICAL: No response from remote host ‘10.1.2.3’

或:

 ERROR: (SNMP) OpenManage is not installed or is not working correctly

 

首先确认/etc/snmpd.conf内是否有以下这行:

# Allow Systems Management Data Engine SNMP to connect to snmpd using SMUX
smuxpeer .1.3.6.1.4.1.674.10892.1

一般安装srvadmin的时候会自动加上的,如果没找到手工加上。

再检查被监控端的服务器上是否有启动snmpd和srvadmin,没有的话启动起来:

service snmpd restart

/opt/dell/srvadmin/sbin/srvadmin-services.sh restart

 

参考:http://folk.uio.no/trondham/software/check_openmanage.html

监控mysql server的性能,在cacti上内估计很多人都是用mysql-cacti-templates模板吧,但是它默认的配置只支持标准mysql 3306端口的监控。

其实它的脚本是已经支持多端口的,只是模板内的配置默认不支持而已。脚本的参数如下:

Usage: php ss_get_mysql_stats.php –host <host> –items <item,…> [OPTION]

   –host      Hostname to connect to; use host:port syntax to specify a port
               Use :/path/to/socket if you want to connect via a UNIX socket
   –items     Comma-separated list of the items whose data you want
   –user      MySQL username; defaults to root if not given
   –pass      MySQL password; defaults to 5MebCCNrzdPYpx3L if not given
   –heartbeat MySQL heartbeat table; defaults to ” (see mk-heartbeat)
   –nocache   Do not cache results in a file
   –port      MySQL port; defaults to 3306 if not given
   –mysql_ssl Add the MYSQL_CLIENT_SSL flag to mysql_connect() call

 

今天花了几个小时的时间把它改成支持多端口的了。

改起来也简单,每个Data Input要改两个地方,但就是数量比较多,眼都花了,累死人

1. 在Console -> Data Templates 找到mysql-cacti-templates的mysql模板,编辑:


在这里面把Port的Use Per-Data Source Value (Ignore this Value)选中,意思是由用户输入这个参数的值,然后保存。

把所有有关mysql模板都按上面的方法更改。

 

2. 在Console->Data Input Methods内,把所有有关mysql数据项的Port都改成不请允许为空。


取消选中Allow Empty Input,保存。

 

3. 上面全部改完后,在创建图型的时候会提示输入端口:


输入你自己的mysql server端口。然后点create就好了。

 

今天改好的模板我已导出,下面有下载地址,以便给需要的人使用。

多端口mysql模板用法:

1. 导入模板的xml文件到cacti

2. 把mysql-cacti-templates带的ss_get_mysql_stats.php文件放到cacti/scripts目录下便可。

多端口mysql模板是在better-cacti-templates-1.1.8基础上做的更改。

 

多端口mysql模板:http://farmerluo.googlecode.com/files/cacti_host_template_x_mysql_server_ht.xml

mysql-cacti-templates:http://code.google.com/p/mysql-cacti-templates/