天天看點

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

繼續閱讀