天天看点

Linux集群和自动化维2.6.3 监控类脚本

<b>2.6.3 监控类脚本</b>

在生产环境下,服务器的稳定情况会直接影响公司的生意和信誉,可见其有多重要。所以,我们需要即时掌握服务器的状态,我们一般会在机房部署nagios-server作为监控程序,然后用shell和python根据业务需求开发监控插件,实时监控线上业务。

1. nginx负载均衡服务器上监控nginx进程的脚本

由于笔者公司电子商务业务网站前端的load balance用到了nginx+keepalived架构,而keepalived无法进行nginx服务的实时切换,所以设置了一个监控脚本nginx_pid.sh,每隔5秒钟就监控一次nginx的运行状态(也可以由superviored守护进程托管),如果发现有问题就关闭本机的keepalived程序,让vip切换到从nginx负载均衡器上。在对线上环境进行操作的时候,人为地重启主master的nginx机器,从nginx机器在很短的时间内就接管了vip地址,即网站的实际内网地址(此内网地址可以通过防火墙映射为公网ip),进一步证实了此脚本的有效性,脚本内容如下(此脚本在centos 5.8/6.4 x86_64下均已测试通过):

#!/bin/bash

while :

do

    nginxpid=`ps -c nginx --no-header | wc -l`

    if [ $nginxpid -eq 0 ];then

        ulimit -shn 65535

        /usr/local/nginx/sbin/nginx

        sleep 5

        if [ $nginxpid -eq 0 ];then

        /etc/init.d/keepalived stop

    fi

 fi

 sleep 5

done

2.系统文件打开数监测脚本

这个脚本比较方便,可用来查看nginx进程下最大文件打开数,脚本代码如下(此脚本在centos 5.8/6.4 x86_64、amazon linux ami x86_64下均已测试通过):

for pid in `ps

aux |grep nginx |grep -v grep|awk '{print $2}'`

cat

/proc/${pid}/limits | grep 'max open files'

脚本的运行结果如下所示:

max open

files            65535                65535                files    

files            65535                65535                files    

files            65535                65535                files    

3.监测mysql主从复制是否同步

笔者有不少基于公网类型的网站(没有硬件防火墙,直接置于idc机房)采用的都是mysql主从架构,从机主要起备份数据库和冷备份的作用,虽然从机宕机了问题不大,但也会影响到数据的备份工作;这样的网站有数十个,如果逐个手动检查,每天都要花费不少时间,所以也用了脚本监控。

脚本设计思路:

1)此脚本应该能适应各种各样不同的内外网环境,即ip不同的环境。

2)让脚本顺便也监控下mysql是否正常运行。

3)slave机器的io和sql状态都必须为yes,缺一不可,这里用到了多重条件判断-a。

脚本内容如下所示(此脚本在centos 5.8 x86_64下已测试通过):

#check

mysql_slave status

#crontab time

00:10

mysqlport=`netstat

-na|grep "listen"|grep "3306"|awk -f[:" "]+

'{print $4}'`

mysqlip=`ifconfig

eth0|grep "inet addr" | awk -f[:" "]+ '{print $4}'`

status=$(/usr/local/webserver/mysql/bin/mysql

-u yuhongchun -pyuhongchun101 -s /tmp/mysql.sock -e "show slave

status\g" | grep -i "running")

io_env=`echo  $status | grep io | awk  ' {print $2}'`

sql_env=`echo

$status | grep sql | awk  '{print $2}'`

if [

"$mysqlport" == "3306" ]

then

    echo "mysql is running"

else

    mail -s "warn!server: $mysqlip mysql

is down" [email protected]

fi

"$io_env" = "yes" -a "$sql_env" = "yes"

]

    echo "slave is running!"

    echo "#######  $date 

#########"&gt;&gt; /data/data/check_mysql_slave.log

    echo "slave is not running!"

&gt;&gt; /data/data/check_mysql_slave.log

    mail -s "warn!

$mysqlip_replicate_error" [email protected] &lt;&lt;

/data/data/check_mysql_slave.log

建议每10分钟运行一次,脚本如下:

*/10 * * * *

root /bin/sh /root/mysql_slave.sh

要记得在每台mysql从机上分配一个yuhongchun的用户,权限大些也没关系,只限定在本地运行,脚本如下所示:

grant all

privileges on *.* to "yuhongchun"@"127.0.0.1" identified by

"yuhongchun101";

privileges on *.* to "yuhongchun"@"localhost" identified by

4.监控python程序是否正常运行

需求比较简单,主要是监控业务进程rsync_redis.py是否正常运行,有没有发生crash的情况。另外,建议将类似于rsync_redis.py的重要业务进程交由superviored守护进程托管。此脚本内容如下所示(此脚本在amazon linux ami x86_64下已测试通过):

sync_redis_status=`ps

aux | grep sync_redis.py | grep -v grep | wc -l `

${sync_redis_status} != 1 ]; then

    echo "critical! sync_redis is

died"

    exit 2

    echo "ok! sync_redis is alive"

    exit 0

继续阅读