使用zabbix對(duì)服務(wù)器主動(dòng)運(yùn)維已經(jīng)好幾個(gè)月,在幾個(gè)月的使用過程中,筆者發(fā)現(xiàn)了zabbix的很多優(yōu)點(diǎn),也看到了它的一些不足,這些不足甚至導(dǎo)致在一些極端情況下使運(yùn)維工作出現(xiàn)問題。下面我將遇到的問題及解決方法分享給大家,希望在你遇到相同問題時(shí)有一個(gè)解決方案。
監(jiān)控服務(wù)器down機(jī)不報(bào)警
當(dāng)監(jiān)控服務(wù)器突然down掉時(shí),在我對(duì)每臺(tái)服務(wù)器都設(shè)置了內(nèi)存、流量等報(bào)警閥值的情況下,zabbix并沒有觸發(fā)報(bào)警。

機(jī)器down是很嚴(yán)重的運(yùn)維問題,down了還不報(bào)警,如果沒及時(shí)發(fā)現(xiàn),這就上升到飯碗問題的高度。
定位問題
如果你了解zabbix的運(yùn)行機(jī)制,可以很快的定位問題原因。這是因?yàn)閦abbix使用的是c/s模式,每臺(tái)監(jiān)控目標(biāo)機(jī)都需要安裝agent,zabbix服務(wù)器采用輪詢的方式從監(jiān)控目標(biāo)機(jī)的agent獲取數(shù)據(jù)。但如果目標(biāo)機(jī)down了,目標(biāo)機(jī)的agent通常也無法工作,就導(dǎo)致了zabbix采集不到數(shù)據(jù)。而zabbix有個(gè)機(jī)制,對(duì)于自定義項(xiàng)(item),如果采集不到agent的值,就保留最后一次獲得的值。試想如果目標(biāo)機(jī)down之前的采集值是正常的,那不報(bào)警的情況就發(fā)生了,因?yàn)椴尚胖狄恢笔褂胐own機(jī)前的數(shù)據(jù),不會(huì)更新,直到再次成功采集到目標(biāo)機(jī)的值。
處理方法
解決問題的方法就是增加一個(gè)目標(biāo)機(jī)是否存活的檢測(cè),并且不能依賴于agent來檢測(cè),之前說過如果目標(biāo)機(jī)down掉,就再也采集不到agent的值。因?yàn)楣芾淼臋C(jī)器上百臺(tái),還是必須用zabbix來做這事,一番查找,zabbix提供了一個(gè)“簡(jiǎn)單檢查”(simple check)功能,該功能獨(dú)立于agent作業(yè),所以即使目標(biāo)機(jī)downb,依然可以進(jìn)行檢測(cè)。
判斷主機(jī)是否存活,最通常的方式是使用ping命令來檢測(cè),但這個(gè)方法有一定局限性,對(duì)于禁ping的機(jī)器無法檢測(cè),但在大多數(shù)場(chǎng)景還是適用的,我們先用用,看看效果。
具體操作
要實(shí)現(xiàn)這個(gè)功能,需要在zabbix服務(wù)器安裝一款名為fping的軟件.
#下載軟件
wget http://www.fping.org/dist/fping-3.10.tar.gz
#軟件解壓
tar xzvf fping-3.10.tar.gz
#進(jìn)入軟件目錄,配置安裝軟件
./configure --prefix=/usr/local/fping/
make && make install
#配置zabbix_server.conf
#在文件末尾增加一行配置
FpingLocation=/usr/local/fping/sbin/fping
#重啟zabbix agent
#centos 6
service zabbix_agentd restart
#centos 7
systemctl restart zabbix_agentd
#設(shè)置fping權(quán)限,fping命令是由zabbix進(jìn)程來調(diào)用。但fping安裝后默認(rèn)是root.root權(quán)限,需要調(diào)整。
cd /usr/local/fping/sbin/
chown root:zabbix fping
chmod 4710 fping
配置完成后,前端頁(yè)面會(huì)自動(dòng)增加fping相關(guān)的模板。

將其鏈接到你正在使用中的模板即可。

添加好以后,你可以在模板的監(jiān)控項(xiàng)中發(fā)現(xiàn)自動(dòng)添加了3個(gè)監(jiān)控項(xiàng)

顧名思義,ICMP loss表示丟包率,ICMP ping表示是否可PING通,ICMP response time表示響應(yīng)時(shí)間。
這里我們主要使用ICMP ping,監(jiān)控項(xiàng)有了,接下來就是觸發(fā)器設(shè)置,根據(jù)監(jiān)控的值來決定是否觸發(fā)并報(bào)警。這個(gè)觸發(fā)器在安裝fping時(shí)也自動(dòng)幫我們?cè)O(shè)置好了。

簡(jiǎn)單解釋一下表達(dá)式,以Ping不可達(dá)觸發(fā)器為例。
{centos6.x monitor for linux:agent.ping.last()}<>1,前面都是固定格式,我們只看ping.last()<>1, last表示最后一次監(jiān)控項(xiàng)獲取的結(jié)果,為1表示主機(jī)可達(dá),不為1表示主機(jī)不可達(dá)(PING不通),所以意思就是當(dāng)主機(jī)不可達(dá)時(shí),觸發(fā)報(bào)警。
通過以上設(shè)置后,我們就可以不再依賴agent,由zabbix server直接監(jiān)控目標(biāo)機(jī)的通斷狀態(tài),其實(shí)就是通過fping命令輪詢的發(fā)出指令。即使目標(biāo)機(jī)down機(jī),也能夠立即獲取監(jiān)控項(xiàng)并觸發(fā)報(bào)警。
另一種獨(dú)立監(jiān)控目標(biāo)機(jī)的方法
如前節(jié)所提,此方法對(duì)禁ping的目標(biāo)機(jī)是沒有辦法監(jiān)控的,我們需要另辟蹊徑。
我們知道目標(biāo)機(jī)一定會(huì)向公眾或特定人群提供服務(wù),提供服務(wù)就需要開放端口(TCP或UDP)。有了開放端口,我們就好辦事情了,只需監(jiān)控目標(biāo)機(jī)的開放端口,測(cè)試其端口是否打開來判斷主機(jī)是否存活。
簡(jiǎn)單檢查(simple check)
zabbix提供了一項(xiàng)名為簡(jiǎn)單檢查的功能可以實(shí)現(xiàn)我們的目標(biāo)。

在新建監(jiān)控項(xiàng)中,類型選擇簡(jiǎn)單檢查,鍵值設(shè)置為net.tcp.service[tcp,,10410],這個(gè)表達(dá)式的意思是“使用TCP協(xié)議,開放端口為10410",其它設(shè)置使用默認(rèn)即可。
設(shè)置好以后,zabbix server每30秒會(huì)以輪詢的方式向模板中的所有主機(jī)的10410端口發(fā)送檢測(cè),判斷端口是否已經(jīng)打開。
有了監(jiān)控項(xiàng),我們接下來設(shè)置觸發(fā)器,即如果監(jiān)測(cè)端口未打開,需要立即報(bào)警。

核心設(shè)置還是表達(dá)式,和前面提到的表達(dá)式類似,當(dāng)last的值為0時(shí),表示端口未正常打開,就要觸發(fā)報(bào)警。
這種方式是以監(jiān)控端口的狀態(tài)來判斷主機(jī)通斷,一般防火墻策略不會(huì)阻止服務(wù)端口的通信。
利用以上兩種方式,應(yīng)該可以絕大多數(shù)的監(jiān)控場(chǎng)景,至少我所監(jiān)控的場(chǎng)景已能夠完全滿足。希望能帶給大家一些幫助,如果你有更好的方法,也歡迎一起交流。