IT運維之Linux服務器監控方案

IT運維之Linux服務器監控方案

隨着Linux應用日益廣泛,絕大部分的網絡服務器都使用Linux操作系統。爲了全面掌握網絡服務器的運行狀況和趨勢,需要對服務器進行全面的監控。

利用Linux發 行版搭建一個網絡服務器可能對於許多人都是一件很容易的事情,但網絡服務器正式上線後,服務器數據流動、連接數、網絡流量、系統負荷等各方面都會增加,安 全問題也隨之而來,再考慮到日誌、數據庫的重要性,我想無論是哪一位系統管理員,都應該迫不及待地想把服務器上線的前期工作做好吧。

那 我們究竟需要做好哪些工作準備呢?之前有看過一篇文章說到系統管理員應該定期完成的九件事情,我分析過後,認爲有幾件事情是必須得做的。首先是備份,做好 定時備份策略,備份所有你認爲重要的數據,並且定期檢查你的備份是否有效、全面;日誌輪換,無論你想用哪種輪換方式,控制日誌增長避免驅動器已滿是你的目 的;做一定的安全措施,如防火牆iptables的訪問控制,用denyhosts防止***遠程暴力破解,mysql遠程登錄權限等等;最後就是服務器監控,也是我主要想講述的內容。

對 於服務器的硬件資源、性能、帶寬、端口、進程、服務等都必須有一個可靠和持續的監測,統計分析每天的各種數據,從而能及時反映出服務器哪裏存在性能瓶頸、 安全隱患等。另外是要有危機意識,就是了解服務器有可能出現哪些嚴重的問題,出現這些問題後該如何去迅速處理。比如數據庫的數據丟失,日誌容量過大,被黑 客***等等。說到底,預防是關鍵。

監控,是預防的其中的一項重要工作。這裏先說說我需要監控的內容。系統負載、cpu使用率、內存佔用、磁盤空間、網絡流量、端口、進程、apachetomcat的連接數、mysql的運行狀態這些都是我想要監控的東西,但又能做到多少呢,我只能盡力而爲了。要了解服務器每時每刻的整體運行狀態,單靠幾個Linux自帶的性能監測命令是很難實現的。所以,利用shell腳本和開源監控工具進行服務器監控成爲了我的兩個主要的選擇。

利用shell腳本監控能夠很好把握的監控的內容,時間,警告峯值,以及方便地進行告警通知,自定義監控日誌內容等等;而許多開源的監控工具都十分方便和實用,比如有zabbixcactinagios等,而且能夠針對不同的監控內容,生成好看的便於觀察的曲線圖,多數的開源監控工具都比較成熟,至於哪個好用就得用過才知道。由於這些監控工具都有許多熱血人士寫了安裝和使用的文檔,我這裏就不寫進來了。想了解下的朋友也可以到我的博客上走走,在這裏我主要是把自己寫的一些shell監控腳本分享一下,希望大家能給點意見。

我這裏寫了四個腳本(performance.sh 性能監控,process.sh 進程監控,network.sh 流量監控,tongji.sh流量分析統計),並使用crontab定時執行腳本進行監控數據的記錄,形成每天的監控日誌放在如下相應的文件夾,並且超過自己設定的告警值後發郵件通知,如果是騰訊企業郵箱,163郵箱那些有免費短信通知功能的可以嘗試一下,收到郵件告警後很快就能收到短信了,十分方便。

 

性能監控腳本

##############################################################################

#!/bin/bash

 

#監控cpu系統負載

IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 

cpu_num=`grep -c 'model name' /proc/cpuinfo`

count_uptime=`uptime |wc -w`

load_15=`uptime | awk '{print $'$count_uptime'}'`

average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`  

average_int=`echo $average_load | cut -f 1 -d "."`  

load_warn=0.70  

if [ $average_int -gt 0 ]

then

echo "$IP 服務器單個核心15分鐘的平均負載爲$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M: %S)" >>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP服務器單個核心15分鐘的平均負載爲$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M:%S)" | mail -s "$IP服務器系統負載嚴重告警" [email protected]

else

echo "$IP 服務器單個核心15分鐘的平均負載值爲$average_load,負載正常   $(date +%Y%m%d/%H:%M:%S)">> /usr/monitor/performance/performance_$(date +%Y%m%d).log

fi

 

#監控cpu使用率

cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`  

if [ $cpu_idle -lt 20 ]

then

echo "$IP服務器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP服務器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理!!!" | mail -s "$IP服務器cpu告警" [email protected]

else

    echo "$IP服務器cpu剩餘$cpu_idle%,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

fi

 

 

#監控交換分區

swap_total=`free -m | grep Swap | awk '{print  $2}'`

swap_free=`free -m | grep Swap | awk '{print  $4}'`

 

swap_used=`free -m | grep Swap | awk '{print  $3}'`

 

if [ $swap_used -ne 0 ]

then

swap_per=0`echo "scale=2;$swap_free/$swap_total" | bc`

swap_warn=0.20

swap_now=`expr $swap_per \> $swap_warn`

if [ $swap_now -eq 0 ]

then

    echo "$IP服務器swap交換分區只剩下 $swap_free M 未使用,剩餘不足20%,使用率已經超過80%,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP服務器swap交換分區只剩下 $swap_free M 未使用,剩餘不足20%, 使用率已經超過80%, 請及時處理。" | mail -s "$IP服務器內存告警[email protected]

else

    echo "$IP服務器swap交換分區剩下 $swap_free M未使用,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

  fi

 

else

     echo "$IP服務器交換分區未使用"  >>/usr/monitor/performance/performance_$(date +%Y%m%d).log

fi

 

#監控磁盤空間

disk_sda1=`df -h | grep /dev/sda1 | awk '{print $5}' | cut -f 1 -d "%"`

if [ $disk_sda1 -gt 80 ]

then

   echo "$IP服務器 /根分區 使用率已經超過80%,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP服務器 /根分區 使用率已經超過80%,請及時處理。 " | mail -s "$IP服務器硬盤告警[email protected]

else

     echo "$IP服務器 /根分區 使用率爲$disk_sda1%,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

fi

 

#監控登錄用戶數

users=`uptime |awk '{print $6}'`

if [ $users -gt 2 ]

then

echo "$IP服務器用戶數已經達到$users個,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP服務器用戶數已經達到$users個,請及時處理。" | mail -s "$IP服務器用戶登錄數告警[email protected]

else

   echo "$IP服務器當前登錄用戶爲$users個,情況正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

fi

###############################################################################

 

 

性能監控日誌 /usr/monitor/performance/performance_%Y%m%d.log

 

 

 

進程監控腳本

###############################################################################

#!/bin/bash

IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`

 

tomcat_dir="/opt/apache-tomcat-7.0.8"

mysql_dir="/usr/local/mysql/bin/mysqld_safe"

vsftp_dir="/usr/sbin/vsftpd"

ssh_dir="/usr/sbin/sshd"

 

for dir in $tomcat_dir $mysql_dir $vsftp_dir  $ssh_dir 

do

process_count=$(ps -ef | grep "$dir" | grep -v grep | wc -l)

 

        for service in tomcat mysql vsftp ssh 

        do

                echo "$dir" |grep -q "$service"

                if [ $? -eq 0 ]

                then

                        if [ $process_count -eq 0 ]

                        then

                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log

                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" | mail -s "$IP服務器 $service服務關閉告警[email protected]

                        else

                            echo "$service is running at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log

                        fi

                else

                        continue

                fi

        done

done

###############################################################################

 

進程監控日誌 /usr/monitor//process/process_%Y%m%d.log

 

 

 

流量監控腳本

###############################################################################

#!/bin/bash

#

R1=`cat /sys/class/net/eth0/statistics/rx_bytes`

T1=`cat /sys/class/net/eth0/statistics/tx_bytes`

sleep 1

R2=`cat /sys/class/net/eth0/statistics/rx_bytes`

T2=`cat /sys/class/net/eth0/statistics/tx_bytes`

TBPS=`expr $T2 - $T1`

RBPS=`expr $R2 - $R1`

TKBPS=`expr $TBPS / 1024`

RKBPS=`expr $RBPS / 1024`

echo "上傳速率 eth0: $TKBPS kb/s 下載速率 eth0: $RKBPS kb/s at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/network/network_$(date +%Y%m%d).log

###############################################################################

 

流量監控日誌 /usr/monitor/network/network_$(date +%Y%m%d).log

 

 

 

 

 

 

流量分析腳本

###############################################################################

#!/bin/bash

#

TX=0;

RX=0;

MAX_TX=0;

MAX_RX=0;

while read line

do

        a=`echo $line | grep "eth0" |awk '{print $3}'`

if [ $a -ge 0 ]

then

        TX=$a

        if [ $TX -ge $MAX_TX ]

        then

                MAX_TX=$TX

        fi

fi

        b=`echo $line | grep "eth0" |awk '{print $7}'`

if [ $b -ge 0 ]

then

        RX=$b

        if [ $RX -ge $MAX_RX ]

        then

                MAX_RX=$RX

        fi

fi

done < /usr/monitor/network/network_$(date +%Y%m%d).log 

                                      echo "最高上傳速度爲 $MAX_TX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log

 

                                      echo "最高下載速度爲 $MAX_RX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log

###############################################################################

流量分析日誌 /usr/monitor/network/tongji.log

 

 

利用腳本進行系統監控是一個不錯的選擇,簡單實用。之後我還想到用shell腳本進行對myqsl的監控,對日誌增長的監控,對apache連接數監控等等,這個有待後面的研究了。
利用shell腳本進行監控當然是方便,可靠,但單靠一堆數據日誌,很難發現什麼趨勢變化,再加上當你維護的服務器量較多的時候,更是手忙腳亂的。這裏我推薦一些開源的監控工具來幫助大家更好地去做好系統監控。
Cacti,是一套基於PHP,MySQL,SNMP及RRDTool開發的網絡流量監測圖形分析工具。它通過snmpget來獲取數據,使用 RRDtool繪畫圖形。在衆多監測圖形分析工具中,RRDTool所畫的圖是最好看的,而且Cacti還能定製模板,按需增加插件,功能十分強大。想要實現異常通知功能的話,可以整合Nagios來一起使用。Nagios是一個監視系統運行狀態和網絡信息的監視系統。能監視所指定的本地或遠程主機以及服務,同時提供異常通知功能等同時提供一個WEB界面以方便系統管理人員查看網絡狀態,各種系統問題,以及日誌等等Cacti+Nagios這個組合很好用,但配置過程比較複雜,大家可以嘗試去搭建一個這樣的實用而方便的分佈式監控系統。
另外一個要介紹的監控工具叫Zabbix,除了能監視各種網絡參數,保證服務器系統的安全運營之外,還能提供如短信、郵件、jabber等通知機制以讓系統管理員快速定位/解決存在的各種問題。基本上能實現cacti+nagios的功能。安裝配置過程也比較簡單,我的博客上有在ubuntu環境和centos環境下搭建zabbix監控系統的文章,大家有空可以參考一下。

 

zabbix的性能監控分析圖

其實除了以上提到的shell 腳本和監控方案,要使服務器監控的效果更好,還有一項工作是必須做的,就是監控數據及運維操作的記錄,我這裏把它叫做運維日誌吧。每天有寫運維日誌的習慣 是很重要的,這可以有利於我們分析服務器的趨勢,比如增加哪些服務後,服務器的cpu佔用會有上升的趨勢;哪個時段是流量的高峯期;哪個時段服務器比較空 閒,可以進行數據庫備份的操作等等。更有好處的是,把我們日常的操作行爲通過日誌形式記錄下來,萬一除了什麼問題,可以通過查詢操作日誌,瞭解是否人爲操 作而引起的。最後一點,有幾個重要的性能監測工具可別忘記了,top、vmstat、w、uptime、ps、free、iostat、netstat、/proc等,這些是Linux系統內置或附件的工具,記住每個命令的詳細用法,有時候可以直接找出造成性能問題的原因

關 於服務器監控這個話題,很多專家給出了不同的意見,但無可否認的,監控工作必須做,至於監控什麼是重點,用怎樣的監控方式去實現,通過監控能達到多大的效 果,這個就視乎服務器應用需求及個人需求了,本文只是提出一些個人的見解,供大家參考。最後簡單總結一下本文的主要內容:監控的重要性;shell監控腳本;開源監控方案;記住寫運維日誌和常用Linux監控工具。希望大家都能夠找出適合自己的、適合企業的服務器監控方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章