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監控工具。希望大家都能夠找出適合自己的、適合企業的服務器監控方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章