苑舒斌,宗曉萌,于俊濤
中海油信息科技有限公司北京分公司,北京,100010
隨著信息化程度的日益加深,以及對(duì)信息安全和技術(shù)資產(chǎn)的日益重視,越來(lái)越多的企業(yè)將保護(hù)核心的數(shù)據(jù)資產(chǎn)和防范企業(yè)核心業(yè)務(wù)數(shù)據(jù)泄漏提上日程。對(duì)此,一種可行的解決思路為推進(jìn)云辦公,實(shí)現(xiàn)重要數(shù)據(jù)的隔離、備份和流轉(zhuǎn)審計(jì)。在此場(chǎng)景下,可能涉及大量的物理服務(wù)器和虛擬主機(jī),需要進(jìn)行監(jiān)控,以及時(shí)發(fā)現(xiàn)系統(tǒng)問(wèn)題,復(fù)盤歷史故障[1]。因此需要一種高度可擴(kuò)展、可配置的監(jiān)控報(bào)警平臺(tái),實(shí)現(xiàn)對(duì)服務(wù)器系統(tǒng)的在線監(jiān)控報(bào)警。平臺(tái)應(yīng)當(dāng)可定制被監(jiān)控的數(shù)據(jù)種類,必要時(shí)隨時(shí)通過(guò)擴(kuò)展模塊增加新數(shù)據(jù)。采集來(lái)的數(shù)據(jù)需匯總到平臺(tái)集中存儲(chǔ),并集中進(jìn)行分析報(bào)警。針對(duì)報(bào)警功能,應(yīng)允許用戶便利地定制報(bào)警規(guī)則,基于采集到的數(shù)據(jù)按需報(bào)警。同時(shí),平臺(tái)中的數(shù)據(jù)采集模塊可能運(yùn)行在服務(wù)器本身以及虛擬主機(jī)上,因此采集模塊必須輕量化,減少不必要的開(kāi)銷,并在采集架構(gòu)設(shè)計(jì)上實(shí)現(xiàn)必要的彈性,可輕松應(yīng)對(duì)不同規(guī)模的系統(tǒng)。
現(xiàn)有的服務(wù)器監(jiān)控平臺(tái),如Zabbix、Ganglia、Nagios等,他們各具特色,但在集群構(gòu)建、報(bào)警規(guī)則定義、規(guī)模橫向擴(kuò)展能力、二次開(kāi)發(fā)能力、監(jiān)控目標(biāo)擴(kuò)展能力、故障容錯(cuò)能力等方面各自有一定的缺陷[1]。本文設(shè)計(jì)的平臺(tái)依托已有集群環(huán)境中的服務(wù)組件構(gòu)建,設(shè)計(jì)上側(cè)重于規(guī)則模板的靈活構(gòu)建和可編程性。
基于以上考慮,平臺(tái)架構(gòu)設(shè)計(jì)將側(cè)重于分布式、可擴(kuò)展、可配置和輕量化等方面。
圖1所示為系統(tǒng)的整體功能框圖。在被監(jiān)控的服務(wù)器、虛擬主機(jī)等設(shè)備中安裝采集程序,負(fù)責(zé)對(duì)終端數(shù)據(jù)的初步收集。然后通過(guò)采集程序的接口模塊進(jìn)行整理,變?yōu)闃?biāo)準(zhǔn)消息內(nèi)容,發(fā)送到消息隊(duì)列。根據(jù)系統(tǒng)規(guī)模不同,消息隊(duì)列可組建為集群模式。作為消息隊(duì)列的消費(fèi)者,入庫(kù)程序也可根據(jù)處理負(fù)載情況動(dòng)態(tài)增減。最終,入庫(kù)程序?qū)⒈O(jiān)控?cái)?shù)據(jù)保存到時(shí)序數(shù)據(jù)庫(kù)中,供用戶做歷史數(shù)據(jù)查詢時(shí)展示使用,并可作為復(fù)雜報(bào)警功能的判斷條件。報(bào)警程序的數(shù)據(jù)來(lái)源可以是數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)本身可靠性較低,尤其是系統(tǒng)發(fā)生故障的情況下,難以保證數(shù)據(jù)庫(kù)系統(tǒng)仍可以正常運(yùn)行。因此,報(bào)警判斷依賴的原始數(shù)據(jù)必須可由入庫(kù)程序直接提供。
圖1 系統(tǒng)整體框圖
運(yùn)行于主機(jī)中的采集程序負(fù)責(zé)定時(shí)獲取對(duì)象的運(yùn)行狀態(tài)數(shù)據(jù),如CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)、IPMI等硬件運(yùn)行狀態(tài),以及運(yùn)行于其上的關(guān)鍵進(jìn)程、數(shù)據(jù)庫(kù)、消息隊(duì)列、虛擬機(jī)、Docker服務(wù)等軟件運(yùn)行狀態(tài)[2]。因?yàn)椴杉绦蛐枰\(yùn)行在大量主機(jī)上,所以首先要考慮其運(yùn)行效率,需以最小的資源占用實(shí)現(xiàn)采集需求;同時(shí),也要便于擴(kuò)展,能便利地加入新的監(jiān)控對(duì)象采集需求,甚至可以由用戶定制需求。
一方面,消息隊(duì)列實(shí)現(xiàn)了橫向擴(kuò)展需求。依靠隊(duì)列提供的集群功能、消息路由和負(fù)載均衡功能,可快速配置適應(yīng)不同規(guī)模的接入主機(jī)數(shù)量,并可隨時(shí)增減作為消息消費(fèi)者的入庫(kù)程序模塊。另一方面,消息隊(duì)列提供了數(shù)據(jù)緩存和持久化功能[3]。當(dāng)網(wǎng)絡(luò)抖動(dòng)或其他意外導(dǎo)致系統(tǒng)負(fù)載波動(dòng)時(shí),消息隊(duì)列可為系統(tǒng)提供必要的緩沖;入庫(kù)程序和數(shù)據(jù)庫(kù)本身發(fā)生故障,也可為待處理的數(shù)據(jù)提供持久化功能,保證已采集的數(shù)據(jù)不因平臺(tái)故障而丟失。
入庫(kù)程序消費(fèi)消息隊(duì)列數(shù)據(jù),包括數(shù)據(jù)預(yù)處理、摘要數(shù)據(jù)生成、數(shù)據(jù)入庫(kù)、數(shù)據(jù)自動(dòng)分表和過(guò)期數(shù)據(jù)清理等功能模塊,如圖2所示。來(lái)自消息隊(duì)列的原始采集數(shù)據(jù)可能具有不同的數(shù)據(jù)命名方式,或者數(shù)據(jù)單位。同時(shí),一部分需入庫(kù)的數(shù)據(jù)可能需要通過(guò)收集到的原始數(shù)據(jù)計(jì)算后才能得到。因此,首先需對(duì)收到的數(shù)據(jù)進(jìn)行預(yù)處理,之后將這些數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)數(shù)據(jù)庫(kù)的入庫(kù)語(yǔ)句存入數(shù)據(jù)庫(kù)。這里考慮到數(shù)據(jù)庫(kù)存入可能失敗,批量處理失敗的數(shù)據(jù)應(yīng)退回到消息隊(duì)列,等待后續(xù)處理,如圖2中虛線所示。故障診斷及數(shù)據(jù)展示過(guò)程中,會(huì)需要系統(tǒng)能提供較長(zhǎng)時(shí)間范圍內(nèi)原始數(shù)據(jù)的統(tǒng)計(jì)信息,如最大值、最小值、平均值等,因此入庫(kù)程序還需提供數(shù)據(jù)摘要服務(wù),計(jì)算原始數(shù)據(jù)若干時(shí)間范圍內(nèi)等級(jí)的統(tǒng)計(jì)結(jié)果,并存入數(shù)據(jù)庫(kù)以供查詢。常見(jiàn)的時(shí)序數(shù)據(jù)庫(kù)也支持持續(xù)查詢等摘要生成功能,但基于數(shù)據(jù)庫(kù)本身功能的摘要生成就缺乏靈活性,且對(duì)各種異常情況缺乏容錯(cuò)能力,因此由程序?qū)崿F(xiàn)該功能。另外,出于數(shù)據(jù)庫(kù)查詢性能和數(shù)據(jù)量控制的考慮,程序還應(yīng)提供自動(dòng)分庫(kù)分表和過(guò)期數(shù)據(jù)清理功能。為了實(shí)現(xiàn)分布式數(shù)據(jù)存儲(chǔ)的一致性,并保證分布式程序有一致的分表命名邏輯,分表按照固定的UTC時(shí)間間隔進(jìn)行。程序入庫(kù)的數(shù)據(jù)也會(huì)同時(shí)創(chuàng)建一份緩存數(shù)據(jù),供故障診斷模塊跳過(guò)數(shù)據(jù)庫(kù)直接訪問(wèn)使用。緩存數(shù)據(jù)應(yīng)按照入庫(kù)時(shí)間戳進(jìn)行組織,根據(jù)實(shí)際診斷需求,緩存多個(gè)不同時(shí)間點(diǎn)的數(shù)據(jù)。通常進(jìn)行故障判斷時(shí),需要對(duì)相鄰多個(gè)時(shí)間點(diǎn)的數(shù)據(jù)進(jìn)行分析計(jì)算。
圖2 入庫(kù)程序功能框圖
報(bào)警程序首先讀取數(shù)據(jù)緩存中的數(shù)據(jù)進(jìn)行分析,判斷是否滿足報(bào)警條件。如果數(shù)據(jù)不存在,再嘗試到數(shù)據(jù)庫(kù)中查詢。通常報(bào)警分析都需要利用近期采集的多個(gè)數(shù)據(jù)進(jìn)行判斷,而其中某些部分在下次分析中也需要用到。緩存可以減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)壓力,也可以保證當(dāng)數(shù)據(jù)庫(kù)不可用時(shí),僅依賴近期數(shù)據(jù)的簡(jiǎn)單報(bào)警分析便可正常進(jìn)行。
報(bào)警程序的規(guī)則配置接口直接面向用戶,其設(shè)計(jì)的關(guān)鍵是如何使用戶能高效便捷地創(chuàng)建自定義報(bào)警規(guī)則,輸出自定義的報(bào)警通知信息。為了給用戶最大的規(guī)則定制空間,需要接口支持?jǐn)?shù)學(xué)計(jì)算、字符串處理、條件判斷、循環(huán)控制等功能[1]。接口中,提供用戶獲取指定時(shí)間點(diǎn)采集數(shù)據(jù)的能力。基于以上考慮,系統(tǒng)選取字符串模板引擎作為報(bào)警功能判斷分析過(guò)程實(shí)現(xiàn)的核心。
最后,發(fā)現(xiàn)系統(tǒng)報(bào)警后需要對(duì)歷史數(shù)據(jù)進(jìn)行分析、明確問(wèn)題原因,所以采集數(shù)據(jù)的圖形化展示是必不可少的功能。因?yàn)閿?shù)據(jù)存儲(chǔ)部分依賴時(shí)序數(shù)據(jù)庫(kù)實(shí)現(xiàn),因此該功能可簡(jiǎn)單地通過(guò)數(shù)據(jù)庫(kù)支持的數(shù)據(jù)可視化工具實(shí)現(xiàn)。
本研究針對(duì)平臺(tái)架構(gòu)中涉及的關(guān)鍵部分實(shí)現(xiàn)進(jìn)行詳細(xì)介紹。
數(shù)據(jù)采集部分側(cè)重輕量化和可擴(kuò)展性?;谥鳈C(jī)狀態(tài)監(jiān)控的基本需求,對(duì)CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)、IPMI等硬件運(yùn)行狀態(tài)的采集是必要功能。通過(guò)對(duì)現(xiàn)有解決方案的篩選,找到符合平臺(tái)需求的開(kāi)源項(xiàng)目Collectd。
Collectd程序本身以C語(yǔ)言編寫,運(yùn)行時(shí)占用的CPU和內(nèi)存資源都很少。其通過(guò)模塊擴(kuò)展的方式,默認(rèn)支持對(duì)常見(jiàn)硬件數(shù)據(jù)、關(guān)鍵進(jìn)程數(shù)據(jù)、常用服務(wù)器組件數(shù)據(jù)、虛擬機(jī)和容器數(shù)據(jù)的采集功能[5]。同時(shí)以Python腳本形式,可以方便地編寫自定義擴(kuò)展模塊。程序還提供了網(wǎng)絡(luò)協(xié)議、AQMP隊(duì)列協(xié)議、服務(wù)器文件輸出等多種采集數(shù)據(jù)輸出方式?;谄銾DP網(wǎng)絡(luò)傳輸協(xié)議,甚至可以將多個(gè)Collectd采集程序的實(shí)例級(jí)聯(lián),實(shí)現(xiàn)分級(jí)的數(shù)據(jù)收集,也可以直接將數(shù)據(jù)輸出到InfluxDB時(shí)序數(shù)據(jù)庫(kù)。此處,基于系統(tǒng)橫向擴(kuò)展和數(shù)據(jù)可靠性的考慮,我們選擇用RabbitMQ消息隊(duì)列作為數(shù)據(jù)處理的中間件。因此,Collectd在平臺(tái)中將利用AQMP協(xié)議的輸出方式連接到中心消息隊(duì)列。程序的功能框圖如圖3所示。
圖3 Collectd功能框圖
采集數(shù)據(jù)具有如下屬性:采樣時(shí)間、主機(jī)名、采集模塊、模塊實(shí)例、數(shù)據(jù)名稱、數(shù)據(jù)值,分別表示數(shù)據(jù)采樣的實(shí)際時(shí)間、采樣發(fā)生的主機(jī)名稱、執(zhí)行采樣的功能模塊、采樣的目標(biāo)對(duì)象和采樣參數(shù)的名稱。因此,采集到的數(shù)據(jù)都可用五元組(時(shí)間,主機(jī),模塊,實(shí)例,名稱)唯一標(biāo)識(shí)。例如在時(shí)間點(diǎn)1000對(duì)主機(jī)H1的CPU狀態(tài)采樣,得到的結(jié)果為各個(gè)CPU核心的空閑時(shí)間、等待時(shí)間等數(shù)據(jù)。因此,表示核心2 IDLE比例的數(shù)據(jù)可用五元組(1000,H1,CPU,2,IDLE)進(jìn)行標(biāo)識(shí)。
應(yīng)用中,發(fā)現(xiàn)Collectd自帶的AQMP隊(duì)列協(xié)議輸出模塊每收到一條輸入數(shù)據(jù)即發(fā)送一條MQ消息。此舉可能導(dǎo)致網(wǎng)絡(luò)中有大量短TCP報(bào)文傳送,影響網(wǎng)絡(luò)性能。因此對(duì)模塊進(jìn)行修正,實(shí)現(xiàn)單條MQ消息中批量發(fā)送采集數(shù)據(jù)。
因?yàn)槌掷m(xù)監(jiān)控產(chǎn)生的數(shù)據(jù)量很大,而對(duì)其查詢的條件主要為數(shù)據(jù)產(chǎn)生時(shí)間,因此適合使用時(shí)序數(shù)據(jù)庫(kù)進(jìn)行保存。常見(jiàn)的開(kāi)源選擇包括Elasticsearch、InfluxDB等。
因?yàn)椴煌N類采集數(shù)據(jù)的內(nèi)容相差很大,而同類數(shù)據(jù)基本有相同的數(shù)據(jù)項(xiàng),實(shí)踐中選擇將來(lái)自不同采集模塊的數(shù)據(jù)單獨(dú)保存到不同的數(shù)據(jù)表中。不考慮定期分表的影響,每個(gè)采集模塊的數(shù)據(jù)存到同一表中。表中除時(shí)間列外,另有主機(jī)名、采集模塊名、數(shù)據(jù)實(shí)例名等索引字段,而每個(gè)數(shù)據(jù)的名稱作為表的數(shù)據(jù)列,與采集數(shù)據(jù)唯一標(biāo)識(shí)的五元組對(duì)應(yīng)。同時(shí),為了便于數(shù)據(jù)查詢,規(guī)定所有數(shù)據(jù)時(shí)間需整理到規(guī)定的整數(shù)倍采樣時(shí)間的間隔時(shí)點(diǎn)。
為了便于后續(xù)進(jìn)行數(shù)據(jù)展示和報(bào)警規(guī)則編寫,入庫(kù)程序同時(shí)還會(huì)對(duì)入庫(kù)數(shù)據(jù)進(jìn)行摘要計(jì)算,將摘要結(jié)果同樣寫入數(shù)據(jù)庫(kù)。對(duì)于一種原始數(shù)據(jù)表,根據(jù)需要可設(shè)置多個(gè)不同等級(jí)的摘要表。摘要表中,每個(gè)原始數(shù)據(jù)對(duì)應(yīng)其最大值、最小值、累加和、平方和、有效數(shù)據(jù)個(gè)數(shù)等5個(gè)摘要數(shù)據(jù)。實(shí)際期望得到的統(tǒng)計(jì)數(shù)據(jù)是原始數(shù)據(jù)在摘要時(shí)間間隔中的最大值、最小值、平均值和標(biāo)準(zhǔn)差,設(shè)置摘要數(shù)據(jù)是為了屏蔽摘要過(guò)程意外中斷、數(shù)據(jù)丟失、進(jìn)程重啟等意外情況對(duì)摘要結(jié)果精度的影響。
如圖4所示為摘要過(guò)程的計(jì)算原理,展示了兩個(gè)低等級(jí)摘要數(shù)據(jù)如何計(jì)算對(duì)應(yīng)的高等級(jí)摘要數(shù)據(jù)。對(duì)于原始采樣數(shù)據(jù),可認(rèn)為其最大值、最小值、累加和都是其自身,平方和是自身平方。后續(xù)摘要時(shí),下一摘要等級(jí)應(yīng)記錄的最大值、最小值、累加和、平方和,則分別是上一摘要等級(jí)中對(duì)應(yīng)時(shí)間范圍內(nèi)所有數(shù)據(jù)的最大值、最小值、累加和、平方和。可以認(rèn)為每個(gè)采樣間隔中各個(gè)摘要結(jié)果的數(shù)量級(jí)大致相同,因此該摘要過(guò)程不會(huì)導(dǎo)致數(shù)值誤差積累。最終,摘要等級(jí)的一個(gè)時(shí)間間隔,記錄了對(duì)應(yīng)所有原始采樣點(diǎn)數(shù)據(jù)的摘要值。根據(jù)記錄中的有效數(shù)據(jù)數(shù)量、累加和、平方和,即可獲得摘要時(shí)間區(qū)間內(nèi)精確的平均值和標(biāo)準(zhǔn)差。
圖4 摘要計(jì)算圖示
數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)除原始數(shù)據(jù)外,還有各級(jí)摘要。因此訪問(wèn)數(shù)據(jù)庫(kù)的數(shù)據(jù)時(shí),需使用六元組(時(shí)間,主機(jī),模塊,摘要等級(jí),實(shí)例,名稱),且名稱中需以后綴的方式表示期望數(shù)據(jù)的摘要類型。
報(bào)警規(guī)則設(shè)置應(yīng)當(dāng)靈活、便捷,用戶可對(duì)特定范圍內(nèi)的設(shè)備進(jìn)行指定報(bào)警監(jiān)控,報(bào)警規(guī)則編寫時(shí)能便捷地獲取監(jiān)控?cái)?shù)據(jù),并有編寫復(fù)雜邏輯的能力。
獲取監(jiān)控?cái)?shù)據(jù)的便捷性體現(xiàn)為以下幾點(diǎn)。第一,用戶報(bào)警規(guī)則中獲取監(jiān)控?cái)?shù)據(jù)時(shí),可便捷地指定數(shù)據(jù)六元組的內(nèi)容,以精確地獲取數(shù)據(jù)。第二,六元組中的部分內(nèi)容,如主機(jī)名、實(shí)例名,可指定通配符,或者給定預(yù)定義列表。第三,六元組中的各項(xiàng)應(yīng)當(dāng)具有合理的默認(rèn)值,常規(guī)數(shù)據(jù)訪問(wèn)必須提供的項(xiàng)只有時(shí)間和名稱。第四,時(shí)間參數(shù)應(yīng)采用相對(duì)值,且具有容錯(cuò)性,指定時(shí)間應(yīng)自動(dòng)取整到相應(yīng)數(shù)據(jù)摘要間隔的整數(shù)倍時(shí)點(diǎn)。第五,規(guī)則定義參數(shù)化,普通用戶不需要修改規(guī)則腳本,直接改變規(guī)則參數(shù)即可變更規(guī)則行為。
為實(shí)現(xiàn)以上目標(biāo),為報(bào)警規(guī)則腳本提供get函數(shù)原型如下:
def get(tsOffset: float, itemName: string,metric: string = None, summary: string = None,host: string = None, inst: string = None)
其中只有相對(duì)時(shí)間tsOffset和變量名稱itemName為必選項(xiàng);其他參數(shù)中模塊名稱metric和摘要等級(jí)summary在規(guī)則編寫時(shí)提供了默認(rèn)值,因此可以省略;主機(jī)名host和模塊實(shí)例inst提供了通配符和列表語(yǔ)法。對(duì)于一條報(bào)警規(guī)則,在實(shí)際運(yùn)行前會(huì)根據(jù)通配符到系統(tǒng)中確認(rèn)實(shí)際可能的主機(jī)名和模塊實(shí)例列表,或者直接使用用戶給定的列表,然后對(duì)所有可能的組合都執(zhí)行一次規(guī)則判斷。因此,每次規(guī)則執(zhí)行,主機(jī)名和模塊實(shí)例的默認(rèn)值都不相同,實(shí)現(xiàn)了模板化報(bào)警規(guī)則的功能,可指定規(guī)則執(zhí)行的目標(biāo)列表,也實(shí)現(xiàn)了對(duì)特定范圍內(nèi)的設(shè)備進(jìn)行指定報(bào)警的功能。
編寫復(fù)雜報(bào)警邏輯,指用戶在編寫報(bào)警規(guī)則時(shí),可進(jìn)行變量定義、數(shù)學(xué)計(jì)算、字符串處理、條件判斷、循環(huán)控制等操作。同時(shí),基于安全考慮,用戶編寫的腳本還需要在沙箱環(huán)境中隔離運(yùn)行。Python作為一種使用簡(jiǎn)單的腳本語(yǔ)言,且較多運(yùn)維人員都有應(yīng)用經(jīng)驗(yàn),適合作為報(bào)警規(guī)則腳本的基礎(chǔ)。Python環(huán)境下,Jinja模板語(yǔ)言具有類似Python的語(yǔ)法,且可以利用Python本身的函數(shù)功能,運(yùn)行環(huán)境也有沙箱保證,適用于本平臺(tái)報(bào)警規(guī)則腳本編寫的基本需求。通過(guò)模板語(yǔ)言語(yǔ)法編寫報(bào)警規(guī)則,還可便利地格式化輸出報(bào)警提示信息[6]。實(shí)踐中,我們是基于Jinja模板語(yǔ)言提供的功能實(shí)現(xiàn)報(bào)警規(guī)則執(zhí)行。將定義的get函數(shù)映射到模板語(yǔ)言函數(shù)中,供用戶獲取數(shù)據(jù)。
為了使用戶在報(bào)警規(guī)則執(zhí)行、報(bào)警消息生成時(shí)可以獲取更完整的信息,也將get函數(shù)使用的默認(rèn)參數(shù)和規(guī)則定義時(shí)填寫的規(guī)則名稱等作為附加信息映射到模板語(yǔ)言環(huán)境中,供用戶使用。
對(duì)于常見(jiàn)的時(shí)序數(shù)據(jù)庫(kù),有Grafana作為開(kāi)箱可用的數(shù)據(jù)展示組件[7]。因?yàn)樗袛?shù)據(jù)保存到數(shù)據(jù)庫(kù),也可便捷地集成到現(xiàn)有的應(yīng)用環(huán)境界面中。
如圖5所示為平臺(tái)數(shù)據(jù)展示示例。Grafana提供了基礎(chǔ)的數(shù)據(jù)源連接、變量配置、時(shí)間縮放功能。平臺(tái)配置了4個(gè)變量,分別為模塊名稱列表、主機(jī)列表、模塊實(shí)例列表和變量名稱列表,分別表示在選定的展示時(shí)間區(qū)間內(nèi),可用的數(shù)據(jù)采集模塊名稱、選定采集模塊收集的主機(jī)名稱、選定主機(jī)上該模塊的實(shí)例列表和模塊的采集變量列表。其中,除模塊名稱外均支持多選。選擇完成后,將對(duì)每個(gè)采集參數(shù)顯示一個(gè)獨(dú)立圖表,圖表中對(duì)每個(gè)主機(jī)名稱和模塊實(shí)例名稱的組合均顯示一條折線,表征變化趨勢(shì)。圖中選定的采集模塊是CPU模塊,它采集了每個(gè)CPU核心的系統(tǒng)使用率、用戶使用率、中斷使用率、等待時(shí)間比例等數(shù)據(jù)。根據(jù)配置,顯示了某主機(jī)上第0、第1核心的系統(tǒng)使用率和用戶使用率變化。
圖5 Grafana數(shù)據(jù)展示
現(xiàn)通過(guò)實(shí)例展示系統(tǒng)中如何配置檢查特定CPU核心的使用情況,如果負(fù)荷持續(xù)超標(biāo)則進(jìn)行報(bào)警。
系統(tǒng)監(jiān)控的主機(jī)中有若干名稱以“ZS-”開(kāi)頭,其CPU核心20-29運(yùn)行特定負(fù)載,如果CPU空閑時(shí)間持續(xù)半小時(shí)低于10%,則應(yīng)報(bào)警。對(duì)于該場(chǎng)景,可按照表1內(nèi)容配置報(bào)警規(guī)則。規(guī)則指出,該規(guī)則會(huì)使用CPU模塊采集到的5分鐘等級(jí)摘要數(shù)據(jù),監(jiān)控的主機(jī)名稱可用通配符“HOST-*”進(jìn)行匹配,監(jiān)控的CPU實(shí)例可用正則表達(dá)式“/2[0-9]{1}/”進(jìn)行匹配。對(duì)于匹配到的CPU核心,連續(xù)獲取其最近30分鐘idle_avg數(shù)據(jù),判斷是否低于閾值。如果所有時(shí)點(diǎn)都低于閾值,則說(shuō)明CPU空閑時(shí)間持續(xù)偏低,應(yīng)進(jìn)行報(bào)警。這里用到兩個(gè)用戶定義的參數(shù)var.low和var.cnt,分別表示idle的檢測(cè)閾值和連續(xù)獲取的5分鐘摘要數(shù)據(jù)時(shí)點(diǎn)數(shù)量。表中定義idle的低閾值為10%,采樣時(shí)點(diǎn)數(shù)量是6,對(duì)應(yīng)30分鐘時(shí)長(zhǎng)。報(bào)警規(guī)則的最后一行是判斷語(yǔ)句,如果結(jié)果是真,則應(yīng)當(dāng)報(bào)警,報(bào)警內(nèi)容由輸出模板格式化后給定。
由表1的配置樣例可以看出,平臺(tái)規(guī)則配置非常靈活,輸出內(nèi)容也可根據(jù)設(shè)定清晰地指出報(bào)警來(lái)源。編寫規(guī)則腳本需要一定的編程基礎(chǔ),但通過(guò)用戶參數(shù)的形式,使普通用戶也能夠安全地按需修訂規(guī)則行為。
表1 報(bào)警配置實(shí)例
關(guān)鍵進(jìn)程重啟也是服務(wù)器監(jiān)控平臺(tái)的一項(xiàng)重要工作內(nèi)容。通常的服務(wù)重啟監(jiān)控基于指定名稱進(jìn)程的數(shù)量變化,或者進(jìn)程啟動(dòng)時(shí)間變化進(jìn)行判斷。對(duì)于具有多實(shí)例的服務(wù),常見(jiàn)監(jiān)控平臺(tái)往往難以有效定義報(bào)警規(guī)則?;诒酒脚_(tái)的擴(kuò)展能力,可通過(guò)插入數(shù)據(jù)預(yù)處理模塊的方式直接獲得監(jiān)控進(jìn)程的重啟事件,統(tǒng)計(jì)進(jìn)程重啟次數(shù)。
如圖2所示,數(shù)據(jù)入庫(kù)程序具有數(shù)據(jù)預(yù)處理功能模塊。對(duì)于CPU、內(nèi)存、關(guān)鍵進(jìn)程等系統(tǒng)已知的數(shù)據(jù)類別,均可注冊(cè)專用的數(shù)據(jù)處理模塊,進(jìn)行數(shù)據(jù)預(yù)處理。預(yù)處理框架中,可實(shí)現(xiàn)對(duì)輸入數(shù)據(jù)的通用處理,如字段名改寫、單位轉(zhuǎn)換、有效性檢查等。之后將收到的數(shù)據(jù)緩存在臨時(shí)結(jié)構(gòu)中,等待模塊接收到完整的數(shù)據(jù)再統(tǒng)一進(jìn)行后續(xù)處理,包括數(shù)據(jù)處理回調(diào)和實(shí)際入庫(kù)動(dòng)作。
如圖6所示,針對(duì)進(jìn)程重啟檢測(cè)功能,可在關(guān)鍵進(jìn)程監(jiān)控模塊進(jìn)行數(shù)據(jù)預(yù)處理時(shí),插入數(shù)據(jù)處理回調(diào)函數(shù)。函數(shù)接收進(jìn)程數(shù)據(jù)處理模塊緩存的進(jìn)程名稱、進(jìn)程PID等數(shù)據(jù),與自身狀態(tài)字典保存的內(nèi)容進(jìn)行對(duì)比,即可發(fā)現(xiàn)特定進(jìn)程是否重啟。發(fā)現(xiàn)進(jìn)程重啟后,重啟統(tǒng)計(jì)模塊將產(chǎn)生重啟數(shù)據(jù),標(biāo)記過(guò)去時(shí)間間隔內(nèi)某進(jìn)程發(fā)生1次重啟。重啟統(tǒng)計(jì)模塊產(chǎn)生的數(shù)據(jù)與其他從主機(jī)輸入的模塊數(shù)據(jù)具有同等地位,在平臺(tái)中同等進(jìn)行數(shù)據(jù)摘要、保存、展示、報(bào)警等后續(xù)訪問(wèn)。期望的預(yù)處理數(shù)據(jù)復(fù)雜時(shí),平臺(tái)也可以支持利用多個(gè)模塊數(shù)據(jù)進(jìn)行分析生成[8]。
圖6 進(jìn)程重啟統(tǒng)計(jì)實(shí)現(xiàn)框圖
此方案充分利用了平臺(tái)易于擴(kuò)展的優(yōu)勢(shì),高效完成進(jìn)程重啟監(jiān)控任務(wù)。且進(jìn)程重啟數(shù)據(jù)也被入庫(kù)、摘要,可隨時(shí)查看歷史記錄。
本文針對(duì)大規(guī)模服務(wù)器集群和虛擬主機(jī)的應(yīng)用場(chǎng)景,給出了一種高度可配置的分布式狀態(tài)監(jiān)控和報(bào)警系統(tǒng)的基本架構(gòu),包括數(shù)據(jù)采集、消息隊(duì)列、入庫(kù)程序、報(bào)警程序、數(shù)據(jù)展示等組成部分。平臺(tái)可適應(yīng)不同規(guī)模主機(jī)集群的監(jiān)控報(bào)警需求,報(bào)警規(guī)則支持模板化,編寫簡(jiǎn)單,并可設(shè)置用戶自定義規(guī)則參數(shù)。
平臺(tái)功能目前都已實(shí)現(xiàn),在實(shí)際工作場(chǎng)景中運(yùn)行良好,規(guī)則腳本提供的靈活性完全可以滿足日常監(jiān)控報(bào)警功能擴(kuò)展的需求。