趙 哲,譚海波,趙 赫,王衛(wèi)東,李曉風(fēng)
(1.中國科學(xué)院安徽光學(xué)精密機械研究所,安徽 合肥 230031;2.中國科學(xué)技術(shù)大學(xué),安徽 合肥 230026)
隨著信息技術(shù)的不斷發(fā)展,要處理的信息量不斷增長,應(yīng)用的復(fù)雜度也在不斷增加。越來越多的互聯(lián)網(wǎng)企業(yè)采用分布式服務(wù)器架構(gòu),不同的服務(wù)器提供不同服務(wù),或者多臺服務(wù)器進行負(fù)載均衡,以提高系統(tǒng)的運行速度,為用戶提供更好的體驗[1-2]。然而隨著服務(wù)器數(shù)量的增加,系統(tǒng)發(fā)生故障的可能性隨之增加。在系統(tǒng)發(fā)生故障時,人工定位發(fā)生故障的機器是不大現(xiàn)實的[3]。如何設(shè)計一個安全、可靠、靈活的網(wǎng)絡(luò)監(jiān)控系統(tǒng),在系統(tǒng)發(fā)生故障時,能夠準(zhǔn)確地將服務(wù)器地址、故障信息發(fā)送給系統(tǒng)的管理人員,是大多數(shù)互聯(lián)網(wǎng)企業(yè)都會面臨的問題[4]。
成熟的系統(tǒng)監(jiān)控解決方案有很多,但商用的服務(wù)器監(jiān)控軟件往往價格昂貴,并且靈活性不夠高。開源軟件具有很好的社區(qū)支持,且插件豐富,可擴展性強,企業(yè)只需在開源軟件的基礎(chǔ)上進行簡單配置或二次開發(fā)即可滿足自身需求,可節(jié)省大量的人力和物力。企業(yè)常用的開源監(jiān)控軟件有Zabbix[5]、Nagios[6]、Cacti[7]等。與其他監(jiān)控系統(tǒng)相比,Zabbix具有更加詳細(xì)的開發(fā)文檔和更好的中文支持。因此文中在開源Zabbix系統(tǒng)的基礎(chǔ)上設(shè)計監(jiān)控系統(tǒng),使用Zabbix對服務(wù)器主機的軟硬件參數(shù)進行監(jiān)控,然后開發(fā)獨立模塊對應(yīng)用程序運行過程中可能發(fā)生的故障進行監(jiān)控。
服務(wù)器監(jiān)控包括服務(wù)器主機的CPU、內(nèi)存、磁盤等硬件參數(shù)和IIS、Apache、MySQL、RabbitMQ等軟件參數(shù)的監(jiān)控,是整個監(jiān)控系統(tǒng)的核心。出于安全性和性能的考慮,企業(yè)中的服務(wù)器往往分布在不同地區(qū),并不在同一個子網(wǎng)內(nèi)。因此,系統(tǒng)監(jiān)控平臺要能夠監(jiān)控到分布在不同子網(wǎng)的主機,就需要具備公網(wǎng)IP,由被監(jiān)控主機向監(jiān)控平臺主動上傳監(jiān)控信息。只要被監(jiān)控主機連接了因特網(wǎng),就可以通過系統(tǒng)監(jiān)控平臺的公網(wǎng)IP建立TCP連接,傳輸該主機的硬件、軟件的監(jiān)控信息。監(jiān)控平臺通過主機名來標(biāo)識不同的主機,收到監(jiān)控信息之后會判斷是否存在相應(yīng)的告警策略,并分類進行存儲和展示[8]。
除了服務(wù)器主機會發(fā)生故障,應(yīng)用程序在運行過程中,也會遇到執(zhí)行錯誤的情況,因此相關(guān)的錯誤監(jiān)控機制是必須的。傳統(tǒng)的方式是將該錯誤記錄在日志中,待用戶或測試人員發(fā)現(xiàn)問題之后,通過分析日志再去定位錯誤。應(yīng)用程序錯誤監(jiān)控模塊則能夠在應(yīng)用程序執(zhí)行過程中,收集到應(yīng)用程序運行中的錯誤,直接執(zhí)行相應(yīng)的告警策略,將錯誤信息發(fā)送給對應(yīng)的管理人員。與傳統(tǒng)的錯誤處理方式相比,應(yīng)用程序錯誤監(jiān)控更加及時有效,能夠更好地保障應(yīng)用程序的運行。
系統(tǒng)監(jiān)控平臺不但能夠監(jiān)控服務(wù)器故障和應(yīng)用程序的錯誤,還應(yīng)該具有一定的穩(wěn)定性保障,能夠保證自身穩(wěn)定的運行。系統(tǒng)監(jiān)控平臺的監(jiān)控策略應(yīng)該是雙向的,而不是單向的。不但需要系統(tǒng)監(jiān)控平臺去監(jiān)測服務(wù)器主機的運行,還需要服務(wù)器主機監(jiān)控系統(tǒng)來監(jiān)測系統(tǒng)監(jiān)控平臺的正常運行。此外,還需要設(shè)計相關(guān)的自檢程序,來保障系統(tǒng)監(jiān)控平臺中客戶端和服務(wù)器的穩(wěn)定運行。
監(jiān)控平臺的告警是非常重要的一步,它直接關(guān)系著管理人員能否及時地知悉錯誤的發(fā)生。監(jiān)控平臺應(yīng)在故障發(fā)生時,通過多種渠道通知運維人員,包括短信、郵件、微信、QQ等方式。其中,郵件是較為常用的一種告警方式,可以通過多種方式實現(xiàn)。短信是最為有效的告警方式,需要借助第三方短信運行商,支付費用才能使用。隨著QQ和微信等社交軟件的普及,通過社交軟件告警也成為了一種很好的補充方式,QQ和微信消息的發(fā)送可以通過一些開源項目來實現(xiàn)。
如圖1所示,該系統(tǒng)主要分為服務(wù)器主機故障和應(yīng)用程序錯誤監(jiān)控兩部分。主機監(jiān)控通過開源的Zabbix監(jiān)控方案實現(xiàn),其中Zabbix Server是Zabbix的服務(wù)端程序,工作在系統(tǒng)監(jiān)控平臺服務(wù)器;Zabbix Agentd是Zabbix的客戶端程序,工作在被監(jiān)控服務(wù)器。應(yīng)用程序錯誤監(jiān)控通過錯誤收集接口來接收應(yīng)用程序在發(fā)生錯誤時發(fā)送過來的HTTP請求,然后記錄錯誤信息并執(zhí)行相應(yīng)的告警策略。
圖1 系統(tǒng)架構(gòu)
被監(jiān)控的主機都需要安裝Zabbix Agentd程序,系統(tǒng)監(jiān)控平臺則安裝Zabbix Server程序。Zabbix Agentd以一定的頻率向Zabbix Server傳送監(jiān)控數(shù)據(jù)[9-10]。為了保障Zabbix系統(tǒng)的運行,還設(shè)計了Zabbix Agentd和Zabbix Server自檢程序以及Zabbix Server的遠(yuǎn)程監(jiān)控程序。Zabbix Agentd自檢程序用于監(jiān)控Zabbix Agentd程序,并在Zabbix Agentd沒有運行時啟動該程序。Zabbix Server自檢程序與之類似,用于檢測本機Zabbix Server的運行。Zabbix Server遠(yuǎn)程檢測程序則用于在遠(yuǎn)程服務(wù)器上監(jiān)控Zabbix Server的運行狀態(tài)。
應(yīng)用程序錯誤監(jiān)控用于檢測應(yīng)用程序運行過程中發(fā)生的錯誤。應(yīng)用程序的開發(fā)者在捕捉到程序錯誤信息時,不但可記錄在本地的日志中,還可以通過HTTP請求的方式將錯誤信息發(fā)送到錯誤收集接口。接口在收到有效的HTTP請求后,會將錯誤信息記錄在本地數(shù)據(jù)庫中,并檢查是否存在相關(guān)告警策略,如果有的話則發(fā)送告警信息。
2.2.1 服務(wù)器監(jiān)控模塊設(shè)計
Zabbix是一套非常完備的服務(wù)器主機監(jiān)控解決方案,因此通過Zabbix來實現(xiàn)服務(wù)器監(jiān)控模塊。Zabbix Agentd有主動和被動兩種工作方式,其中主動式監(jiān)控是指Zabbix Agentd通過Zabbix Server的IP地址和端口號與之建立TCP連接,然后傳輸監(jiān)控的配置信息和被監(jiān)控主機的信息;被動式監(jiān)控則是指Zabbix Server通過Zabbix Agentd的IP地址和端口號與之建立TCP連接[11]。為了能夠檢測分布在不同區(qū)域、不同網(wǎng)絡(luò)環(huán)境中的服務(wù)器主機,使Zabbix Agentd以主動式的方式運行,只需要保證監(jiān)控平臺具有公網(wǎng)IP,可被Zabbix Agentd通過IP尋址即可。Zabbix Agentd在被監(jiān)控主機上運行時,會以一定頻率向Zabbix Server請求需要監(jiān)控的項目,然后通過監(jiān)控平臺的10051端口將監(jiān)控數(shù)據(jù)傳送給Zabbix Server。Zabbix解決方案提供了基于PHP和MySQL的Web管理站點,通過該站點可以添加被監(jiān)控的主機,配置需要監(jiān)控的項目,以及相關(guān)的報警聯(lián)系人和告警方式及策略等。
2.2.2 穩(wěn)定性保障模塊設(shè)計
穩(wěn)定性保障模塊用于保證Zabbix Server和Zabbix Agentd程序的正常運行,在檢測到程序沒有運行時,會嘗試啟動程序或發(fā)送告警。因為Zabbix Agentd的遠(yuǎn)程監(jiān)控可以通過Zabbix的監(jiān)控項實現(xiàn),所以實際上該模塊包括三部分程序。
(1)Zabbix Server自檢程序。
Zabbix Server只能運行在Linux平臺上,并且默認(rèn)工作在10051端口。因此,可以通過Shell腳本監(jiān)測本機10051端口是否開啟,進而判斷Zabbix Server的運行狀態(tài),并且檢測到Zabbix Server沒有運行時啟動該程序。通過shell腳本實現(xiàn)的Zabbix Server自檢程序需要以一定的頻率執(zhí)行,可使用Crontab程序來實現(xiàn)。
(2)Zabbix Agentd自檢程序。
Zabbix Agentd與Zabbix Server的自檢程序設(shè)計思路是類似的。與之不同的是,Zabbix Agentd可運行在Linux平臺和Windows平臺,默認(rèn)工作在本機的10050端口。在Windows操作系統(tǒng)中,Zabbix Agentd是以系統(tǒng)服務(wù)的形式運行的,可以使用C#語言編寫自檢程序,用于檢測Zabbix Agentd服務(wù)的運行狀態(tài),并且在沒有運行時啟動該程序。在Windows平臺,使用C#語言編寫的Zabbix Agentd自檢程序,可以通過定時器實現(xiàn)定期的檢測[12]。
(3)Zabbix Server遠(yuǎn)程監(jiān)測程序。
Zabbix Server通過監(jiān)控平臺的10051端口來收集Zabbix Agentd發(fā)送過來的監(jiān)控數(shù)據(jù)。因此可以在其他的服務(wù)器上通過與監(jiān)控平臺的10051端口建立TCP的方式,來檢測Zabbix Server運行狀態(tài)。如圖2所示,每2分鐘檢測一次,如果連續(xù)三次向監(jiān)控平臺的10051端口建立TCP連接失敗,則認(rèn)為Zabbix Server程序已停止。出于安全性考慮,遠(yuǎn)程服務(wù)器不具備啟動Zabbix Server的權(quán)限,僅發(fā)送告警,通知管理人員處理。
圖2 Zabbix Server遠(yuǎn)程監(jiān)測程序流程圖
2.2.3 應(yīng)用程序監(jiān)控模塊設(shè)計
應(yīng)用程序監(jiān)控模塊通過錯誤收集接口的形式對外開放,可以通過HTTP請求的方式調(diào)用。該模塊相對獨立,不依賴Zabbix的功能,使用PHP和MySQL進行開發(fā),但為了統(tǒng)一管理界面,將該模塊合并到Zabbix的管理站點。如圖3所示,錯誤收集接口在收到有效的HTTP請求后會檢查是否存在相關(guān)的告警策略,如果有則向聯(lián)系人發(fā)送短信、郵件等通知。發(fā)送短信、郵件等操作是比較耗時的,因此為了提高錯誤收集接口的響應(yīng)速度,只驗證HTTP請求是否有效,對于有效的HTTP請求,將相關(guān)參數(shù)放入消息隊列中。編寫錯誤信息處理腳本,監(jiān)聽消息隊列,專門用于執(zhí)行發(fā)送郵件、短信等告警操作。
服務(wù)器的監(jiān)控模塊通過Zabbix解決方案實現(xiàn),需要在系統(tǒng)監(jiān)控平臺上安裝Zabbix Server程序,在被監(jiān)控主機安裝Zabbix Agentd程序,并以主動式監(jiān)控的方式工作。如圖4所示,使用Zabbix Server的Web管理平臺,還需要在系統(tǒng)監(jiān)控平臺上搭建LNMP運行環(huán)境,然后將站點代碼復(fù)制到Web服務(wù)器目錄。Zabbix Agentd主動式監(jiān)控配置內(nèi)容如下:StartAgents=0表示禁用被動模式,ServerActive對應(yīng)Zabbix Server的IP地址,Hostname用于標(biāo)識不同的主機[13]。
圖3 HTTP請求處理流程
圖4 Zabbix Server Web管理界面
StartAgents=0
ServerActive=XX.XX.XX.XX
Hostname=host1
工作流程如圖5所示。
圖5 服務(wù)器監(jiān)控模塊工作流程
(1)Zabbix Server自檢程序。
通過編寫運行在Linux下的shell腳本,監(jiān)測本機的10050端口是否已經(jīng)開啟。如果沒有,則說明Zabbix Server沒有運行,通過shell腳本啟動該服務(wù)即可。在編寫完該shell腳本之后,還需要將其添加到Crontab列表中,每分鐘執(zhí)行一次該腳本。
*/1 * * * * /var/www/Zabbix_Server_Monitor.sh
(2)Zabbix Server遠(yuǎn)程監(jiān)測程序。
Zabbix Server遠(yuǎn)程監(jiān)控程序可運行在被監(jiān)控服務(wù)器上,通過嘗試向Zabbix Server所在的系統(tǒng)監(jiān)控服務(wù)器的10051建立TCP連接,來判斷Zabbix Server程序是否可用。以Windows Server 2012為例,在Windows平臺上可以使用C#編寫Windows服務(wù),具有更好的穩(wěn)定性。關(guān)鍵代碼如下:
clientSocket.Connect(new IPEndPoint(ip,10051));
if(counter>3){
SendMail(server_addr,mailto);
}else{
counter=0;
}
(3)Zabbix Server遠(yuǎn)程監(jiān)測程序。
Zabbix Server遠(yuǎn)程監(jiān)控程序可運行在被監(jiān)控服務(wù)器上,通過嘗試向Zabbix Server所在的系統(tǒng)監(jiān)控服務(wù)器的10051建立TCP連接,來判斷Zabbix Server程序是否可用。以Windows Server 2012為例,在Windows平臺上可以使用C#編寫Windows服務(wù),具有更好的穩(wěn)定性。關(guān)鍵代碼如下:
clientSocket.Connect(new IPEndPoint(ip, 10051));
if(counter > 3){
SendMail(server_addr, mailto);
}else{
counter=0;
}
(4)Zabbix Agentd自檢程序。
Zabbix Agentd自檢程序可運行在Linux和Windows平臺上,Linux下的自檢程序可以編寫shell腳本,通過檢測本機10050端口是否可用來實現(xiàn);Windows下自檢程序可以使用C#語言編寫服務(wù),檢測Zabbix Agentd服務(wù)的運行狀態(tài)。使用C#語言編寫Zabbix Agentd自檢服務(wù),每分鐘檢測一次Zabbix Agentd服務(wù)的狀態(tài),并設(shè)置為開機啟動。
關(guān)鍵代碼如下:
var service=new ServiceController("Zabbix Agentd");
string state=service.Status.ToString();
if(state!="Running")
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running);
}
為了統(tǒng)一管理平臺,應(yīng)用程序監(jiān)控模塊在Zabbix的Web站點的基礎(chǔ)上使用PHP語言進行開發(fā),復(fù)用Zabbix站點的樣式和用戶登錄模塊。該模塊的主要功能分為錯誤信息收集接口、報警規(guī)則設(shè)置、錯誤信息處理三部分。為了提高接口的響應(yīng)速度,只判斷請求是否有效,對于有效的請求,將有效參數(shù)以json格式存放到Redis的消息隊列中。錯誤信息處理腳本專門用于處理Redis隊列中的內(nèi)容,執(zhí)行發(fā)送郵件、短信等操作。錯誤信息收集接口驗證數(shù)字簽名的關(guān)鍵代碼如下:
$tmp_arr=$_REQUEST;
$request_sign=strtolower($tmp_arr['sign']);
unset($tmp_arr['sign']);
ksort($tmp_arr);
$tmp_str=implode($tmp_arr);
$real_sign=md5($tmp_str.$skey);
if($real_sign!=$request_sign){
printJson(2003,'數(shù)字簽名驗證失敗');
}
錯誤收集接口將有效的HTTP請求內(nèi)容以及其告警規(guī)則存放在Redis中,錯誤處理腳本從Redis中取出告警規(guī)則和請求內(nèi)容,并執(zhí)行發(fā)送短信、郵件等操作。Redis隊列使用其發(fā)布/訂閱機制實現(xiàn),錯誤處理腳本使用Subscribe方法訂閱頻道errorList,然后Web API在收到合法請求時,使用Publish方法向頻道errorList發(fā)送數(shù)據(jù)。
//錯誤收集接口向消息隊列中存入數(shù)據(jù)
$json_data=json_encode($valid_data);
$redis->publish("errorList",$json_data);
//錯誤處理腳本從消息隊列中取出數(shù)據(jù)
$redis->subscribe(array("errorList"),"handleFun");
//錯誤信息錯誤函數(shù)
functionhandleFun($redis, $chan, $msg){};
工作流程如圖6所示。
圖6 應(yīng)用程序監(jiān)控模塊工作流程
(1)郵件發(fā)送模塊的實現(xiàn)。
郵件發(fā)送模塊通過TCP連接SNMP郵件服務(wù)器發(fā)送郵件的方式實現(xiàn)。使用PHP或C#語言與郵件服務(wù)器通過Socket建立TCP連接后,通過SNMP協(xié)議實現(xiàn)郵件的發(fā)送。C#可以通過.NET中的MailMessage類來發(fā)送郵件,PHP則可以借助第三方類庫SendMail發(fā)送郵件[14]。
(2)短信發(fā)送模塊的實現(xiàn)。
短信發(fā)送模塊一般是通過向第三方提供的URL發(fā)送GET/POST請求,并攜帶用戶認(rèn)證和短信內(nèi)容等參數(shù)實現(xiàn)的,不同的第三方提供的URL和所需參數(shù)有所不同。C#語言可以使用HttpWebRequest實現(xiàn)發(fā)送HTTP請求,PHP語言則可以利用CURL擴展實現(xiàn)[15]。
(3)QQ消息發(fā)送模塊的實現(xiàn)。
QQ消息的發(fā)送可以通過Mojo-Webqq實現(xiàn),Mojo-Webqq是基于Perl語言實現(xiàn)的開源項目,它默認(rèn)運行在本機的5000端口,支持HTTP調(diào)用方式,使用方法與短信發(fā)送類似。微信消息告警可基于Mojo-Weixin開源項目實現(xiàn),使用方法與QQ消息告警類似。
隨著服務(wù)器數(shù)量的不斷增多和應(yīng)用程序復(fù)雜度的增加,傳統(tǒng)的人工管理方式已不再適用,網(wǎng)絡(luò)監(jiān)控系統(tǒng)則成為一種新的趨勢。文中設(shè)計的基于Zabbix的網(wǎng)絡(luò)監(jiān)控系統(tǒng),高效、穩(wěn)定、自動化運行,有效解決了服務(wù)器故障和應(yīng)用程序錯誤監(jiān)控的問題,具有很好的普遍性。該系統(tǒng)通過Zabbix Server的自檢程序和遠(yuǎn)程監(jiān)測程序一定程度上保障了系統(tǒng)的穩(wěn)定性,但還是存在單點故障的隱患。在未來的工作中,將致力于系統(tǒng)監(jiān)控平臺的負(fù)載均衡和系統(tǒng)災(zāi)備等工作,以更好地保障監(jiān)控系統(tǒng)的穩(wěn)定性[16]。
[1] 吳夫丹.基于云平臺的服務(wù)器監(jiān)控系統(tǒng)設(shè)計[D].西安:西安工業(yè)大學(xué),2014.
[2] 董 波,沈 青,肖德寶.云計算集群服務(wù)器系統(tǒng)監(jiān)控方法的研究[J].計算機工程與科學(xué),2012,34(10):68-72.
[3] 朱瑞斌.服務(wù)器集群監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].北京:北京交通大學(xué),2015.
[4] 張俊杰.服務(wù)器狀態(tài)監(jiān)控系統(tǒng)設(shè)計[D].西安:西安電子科技大學(xué),2014.
[5] TADER P.Server monitoring with Zabbix[J].Linux Journal,2010,2010(195):7.
[6] 王 帆.基于Nagios的服務(wù)器監(jiān)控平臺構(gòu)建與實現(xiàn)[J].實驗室研究與探索,2010,29(12):51-57.
[7] 岑銳堅.使用Cacti監(jiān)測系統(tǒng)與網(wǎng)絡(luò)性能[J].開放系統(tǒng)世界,2006(7):68-72.
[8] 徐 葉,袁 敏,李國軍.嵌入式Web服務(wù)器遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機與現(xiàn)代化,2013(2):94-98.
[9] 郭曉慧,李潤知,張 茜,等.基于Zabbix的分布式服務(wù)器監(jiān)控應(yīng)用研究[J].通信學(xué)報,2013,34:94-98.
[10] 李朝陽.利用Zabbix進行系統(tǒng)和網(wǎng)絡(luò)管理[J].計算機時代,2008(10):19-22.
[11] VLADISHEV A. Open source enterprise monitoring with Zabbix[C]//OpenSource data center conference.[s.l.]:[s.n.],2009.
[12] 杜 鵑.飛信機器人系統(tǒng)的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2010.
[13] 周 萌,林國策,楊厚云.CENTOS下ZABBIX的配置與使用[J].北京信息科技大學(xué)學(xué)報:自然科學(xué)版,2015,30(1):90-94.
[14] 李艷霞,劉乃嘉,王 鑫.高校信息系統(tǒng)自動監(jiān)控報警平臺的研發(fā)與應(yīng)用[J].實驗技術(shù)與管理,2011,28(3):101-103.
[15] 楊 磊.基于Linux系統(tǒng)的監(jiān)控工具與其自動化測試的設(shè)計與實現(xiàn)[D].成都:電子科技大學(xué),2012.
[16] ANDREOLINI M,COLAJANNI M,PIETRI M.A scalable architecture for real-time monitoring of large information systems[C]//Second symposium on network cloud computing and applications.[s.l.]:IEEE,2012:143-150.