使用monit搭建一個監控系統
使用monit搭建一個監控系統
2014-05-01 13:29 by MikeZhou, 677 閱讀, 0 評論, 收藏, 編輯
上週用monit搭建或者說定製了一個監控系統,來監控伺服器發生事情。當然了主要是監控異常,因為我們的產品屬於伺服器型別,很多程序都daemon,要不停的執行。我們搭建監控目的不過是出現問題能夠及時的知道,平時可從web UI上看到整個系統的狀況,同時它本身要輕量級,不要影響效能。當然了類似的產品很多了,比如Ganglia,我在老科長波哥曾經搭建過一個Ganglia系統監控科室十幾臺伺服器,讓我很是崇拜。本文重點介紹monit。
monit是一個可以監控系統,程序,檔案系統,目錄,裝置的監控軟體,可以自動喚起那些異常退出的程序,還可定製你想監控的東西。同時monit提供了內建的WEB UI的功能,可以一目瞭然地瞭解監控項的情況。其中正常項為綠色,異常項為紅色,很方便的告警,另外,monit還提供了發郵件通知的功能,對於緊急的異常情況可以傳送郵件到指定郵箱。比如發生了coredump,發生了DB corrupt,daemon程序異常重啟,可以第一時間郵件通知到管理員,呵呵很強大吧。片湯話我們不多講,講講怎麼用monit搭建一個監控系統。
monit是一個很輕量級的程式,只需要一個可執行程式monit,一個配置檔案monitrc即可工作,當然了我們還是要講講安裝過程:
Ubuntu系統下,安裝一如既往的方便:
- sudo agt-get install monit
CentOS系統下也是一樣:
- yum install monit
我比較喜歡原始碼安裝,原因是我喜歡看下原始碼:
- wget http://mmonit.com/monit/dist/monit-5.5.tar.gz
- tar zxvf monit-5.5.tar.gz
- cd monit-5.5
- ./configure --prefix=/usr
- make
- make install
注意configure的時候可能會報錯:
- checking for pam_start in -lpam... no
- configure: error: PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam
當然了你可以加上--without-pam這個選項繞過這個問題,這個問題在Ubuntu下的解決辦法是:
- apt-get install libpam0g-dev
這個問題過後,再次執行./configure又會出現SSL的報錯:
- checking for SSL library directory... Not found
Couldn't find your SSL library files.
Use --with-ssl-lib-dir option to fix this problem or disable the
SSL support with --without-ssl
解決辦法是:
- sudo apt-get install libssl-dev
安裝了libssl之後,configure仍然報錯,原因是它找不到libssl.so,你可以手工搜尋libssl.so的位置,然後用 --with-ssl-lib-dir告知configure。
比如在我的ubuntu下:
- root@manu:/usr/lib/i386-linux-gnu# find / -name libssl.so
- /usr/lib/i386-linux-gnu/libssl.so
那麼可以執行:
- ./configure --prefix=/usr --with-ssl-lib-dir=/usr/lib/i386-linux-gnu/
OK,configure之後,可以執行make 和 make install 了。make install之後,將原始碼路徑下的配置檔案monitrc拷貝到/etc目錄下:
- mv monitrc /etc/monitrc
- chown root:root /etc/monitrc
- chmod 0700 /etc/monitrc
這些事情做好之後,monit就安裝完畢了。我們嘗試啟動monit
- root@manu:~/code/c/classical/monit-5.5# monit
- monit: generated unique Monit id 66c0021758d07ecffedadfa0bf5f768d and stored to '/root/.monit.id'
- Starting monit daemon with http interface at [localhost:2812]
前文講過,monit內建了一個http,可以通過browser檢視,我們先看下monitrc配置檔案的http相關配置:
- set httpd port 2812 and
- use address localhost # only accept connection from localhost
- allow localhost # allow localhost to connect to the server and
- allow admin:monit # require user 'admin' with password 'monit'
- allow @monit # allow users of group 'monit' to connect (rw)
- allow @users readonly # allow users of group 'users' to connect readonly
這部分內容是http相關的配置,port 2812是埠號,localhost是訪問IP,allow localhost表示只允許本機訪問,使用者名稱密碼是:admin/monit。這不太符合我們的需求,比如我們不可能每次都在伺服器上用瀏覽器檢視伺服器的狀態,這太假了,如果我們有閒情逸致登上伺服器,何必要我們的監控系統。我們將此處的配置改為:
- set httpd port 2812 and
- use address 10.64.74.99
- allow 0.0.0.0/0.0.0.0
- allow manu:manu
我們可以用chrome瀏覽器輸入 http://10.64.74.99:2812去檢視輸出。第三行的意思是我們允許任何機器登入我們UI,訪問我們monit的資料,第四行表示登入需要使用者名稱和密碼:manu/manu。此時我們的monit監控系統如下所示:
此時還比較單薄,啥東西也沒有,我們繼續講如何配置monitrc。
- set daemon 60
這個比較簡單,多久檢測一次。我們監控條目有若干,我們不能時時刻刻都做一遍檢查,那就成了死迴圈了,對系統性能損耗太大了。60秒錶示每60秒檢查一次配置檔案裡面配置的監控項。這個好理解不多說。
- set logfile /var/log/monit.log
這個配置項表示monit程序本身的log記錄在/var/log/monit.log。
在web UI上也可以檢視monit的log。點選monit首頁的runnning,
進入monit running status頁面,然後點選最右下角的的view log。這個也不多說了。
我們講述發mail的配置:
- set mailserver xxx.xx.xxx.xxx port 25
- with timeout 15 seconds
set mail-format {
from: [email protected]
subject: monit alert -- $EVENT $SERVICE
message: $EVENT Service $SERVICE
Date: $DATE
Action: $ACTION
Host: $HOST
Description: $DESCRIPTION
Your faithful employee,
bean
}
set alert [email protected] # receive all alerts 設定收件人
有很多人發不出郵件的關鍵不在monit程式,而在於沒有一個SMTP Server,幫助你轉發Mail,用所謂的163 或者google的SMTP Server始終沒有成功過。我開始也是發不出Mail,後來有了一個不需要使用者名稱密碼的SMTP Server之後,自然就能發出郵件通知了。如何搭建一個SMTP Server這是另外一個話題了,我按下不表。我用的是我們公司內部的一個SMTP Server。收到的Mail如下圖所示:
發Mail問題解決之後,我們就能專注於定製我們自己需要的監控項了。
============================華麗的分割線=========================================
1 監控程序
比如我們伺服器上有Apache,我們要監控Apache的情況,如果Apache異常重啟,需要Mail通知。
- check process apache with pidfile /var/run/httpd.pid
- start program = "/etc/init.d/rcWebServer.sh start https"
- stop program = "/etc/init.d/rcWebServer.sh stop https"
- if changed pid then alert
所有程序類的監控是一類,以check process abc打頭,其中with pidfile是指程序的PID記錄在/var/run/httpd.pid。我們知道apache的PID記錄在/var/run/httpd.pid之中,monit通過這個pid檔案就可以明白,我們要求它監控那個程序了。
沒有PID檔案的程序咋辦?
這是個好問題,畢竟大多數的程序都是沒有PID檔案的。比如你的程序叫做test_abc,是你通過./test_abc叫起的程序,如何告訴monit我要監控這個程序。monit提供了新的方法。MATCHING,就是程序cmdline匹配到了test_abc,我就監控這個程序,監控項叫test_abc
- check process test_abc with MATCHING test_abc
- if changed pid then alert
我們新增了監控程序,看下WEB UI的變化:
點選apache,可以看詳細情形,這裡就不贅述了。
2 監控檔案系統或者監控裝置
我們一般有存放資料的分割槽,也有存放日誌的分割槽,如果日誌分割槽使用空間到了90%,我們認為這是出了問題了,我們要注意這種事件的發生:
- check device VAR_LOG with path /var/log
- if space usage > 85% then alert
check filesystem tmpfs with path /var
if space usage > 80% then alert
上述語句表明tmpfs 掛載在/var目錄下,如果空間使用了80%,表明出現了異常,需要發mail通知到管理員。
新增了檔案系統監控項後,UI上會增加如下顯示:
點選tmpfs 或者VAR_LOG可以進入二層頁面看下檔案系統的詳細資訊,我也不贅述了。
3 監控檔案
monit也可監控某個檔案,監控檔案的屬性,比如我們的檔案permission 是700,如果發生變化則發郵件通知:
- check file monit_target with path /var/log/monit_target
- if failed permission 700 then alert
- if size > 1000 MB then exec "/usr/local/bin/rotate /var/log/monit_target
假如我們關注的事情發生了,我們需要執行自己的指令碼,可以用 then exec “your_action”的方式處理。
4 監控program
有很多的情況,不好歸類,比如,我的系統裡面如果產生coredump,我希望可以檢測到,同時在WEB UI上顯示並且給我發Mail。我可以自己寫個檢視有沒有coredump的指令碼,告訴monit系統,我期待的結果,如果執行指令碼與我期待的結果不同,那麼表示本監控項出了異常
- check program COREDUMP_EXIST with path "/var/log/tool/coredump_exist.sh"
- if status != 0 then alert #告訴monit 我們期待結果是0 ,如果返回值不是 0 ,那麼表示出了異常
- #!/bin/sh
- corefile_num=`ls /home/manu/core/core* 2>/dev/null| wc -l`
- if [ $corefile_num -eq 0 ]
- then
- exit 0
- else
- exit 1
- fi
我們前面一直沒提到,如果監控項為異常,WEB UI該項為紅色,否則,該項為綠色。我們現在看下監控program之COREDUMP_EXIST:
因為我們有coredump檔案,所以該項為紅色。
5 監控主機
我們還可以監控其他host,比如我們可見ping某臺host,如果多次沒有迴應,那麼郵件通知我
- check host my_brother with address XX.XX.XX.XX
- if failed icmp type echo count 3 with timeout 3 seconds then alert
介紹了很多用法,但是掛一漏萬,終極的學習方法還是看手冊 http://mmonit.com/monit/documentation/monit.html#connection_testing。這個基本介紹的很詳細,我遇到的一些問題,也是從這裡找的答案。
技術改變世