李井鑫 陳文治
RRDTool監(jiān)控?cái)?shù)據(jù)存儲(chǔ)技術(shù)結(jié)合Open-Falcon開源監(jiān)控平臺(tái),可以實(shí)現(xiàn)針對(duì)鐵路云數(shù)據(jù)中心下大規(guī)模實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)的有效處理,提高運(yùn)維生產(chǎn)效率。
隨著鐵路的快速發(fā)展,鐵路監(jiān)控運(yùn)維平臺(tái)在處理大規(guī)模實(shí)時(shí)數(shù)據(jù)時(shí)所面對(duì)的任務(wù)也越來(lái)越艱巨。本文將以處理大規(guī)模實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)為切入點(diǎn),介紹RRDTool的基礎(chǔ)概念與工作原理,簡(jiǎn)化大規(guī)模監(jiān)控?cái)?shù)據(jù)的存儲(chǔ)、規(guī)整數(shù)據(jù)的格式,直觀展示被監(jiān)測(cè)對(duì)象隨時(shí)間的變化趨勢(shì)。同時(shí)結(jié)合Open-Falcon這一開源監(jiān)控平臺(tái)采集、存儲(chǔ)和展示大規(guī)模實(shí)時(shí)數(shù)據(jù),從而實(shí)現(xiàn)針對(duì)鐵路云數(shù)據(jù)中心下大規(guī)模實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)的有效處理,提高運(yùn)維生產(chǎn)效率。
1 RRDTool介紹
RRDTool(Round Robin Database Tool)是一套基于RRD(Round Robin Database)數(shù)據(jù)庫(kù)的監(jiān)測(cè)工具。RRD數(shù)據(jù)庫(kù)也就是環(huán)形數(shù)據(jù)庫(kù),主要用來(lái)存儲(chǔ)對(duì)象隨著時(shí)間變化的情況,Tool則用來(lái)取RRD存儲(chǔ)的數(shù)據(jù)并展示數(shù)據(jù),方便我們直觀地了解被監(jiān)測(cè)對(duì)象隨時(shí)間變化的情況,比如常見的CPU、內(nèi)存、磁盤等指標(biāo)的使用情況。相較于傳統(tǒng)的數(shù)據(jù)庫(kù),RRD更適用于高并發(fā)、實(shí)時(shí)變化、規(guī)模大的數(shù)據(jù)存儲(chǔ),結(jié)合對(duì)應(yīng)的繪圖工具,可以直觀地展示數(shù)據(jù)的變化狀況。
1.1 RRD
RRD(Round Robin Database)是一種循環(huán)使用以降低數(shù)據(jù)存儲(chǔ)空間的數(shù)據(jù)庫(kù),十分適用于存儲(chǔ)和時(shí)間序列相關(guān)的數(shù)據(jù)。RRD數(shù)據(jù)庫(kù)在被創(chuàng)建的時(shí)候就已經(jīng)定義好了大小,所以和其他線性增長(zhǎng)的數(shù)據(jù)庫(kù)不同,RRD的大小可控且不用維護(hù)。
1.1.1RRD數(shù)據(jù)庫(kù)的數(shù)據(jù)源類型
RRD數(shù)據(jù)庫(kù)的數(shù)據(jù)源類型主要有四種,以下分別作介紹:
1)GAUGE:實(shí)際值,如圖1所示,記錄鐵路售票系統(tǒng)售票量隨時(shí)間的變化曲線。
2)COUNTER:計(jì)數(shù)值,如圖2所示。這是一個(gè)只增不減的正整數(shù)。比如,高鐵行駛里程,從高鐵開始運(yùn)營(yíng),里程就從0開始不斷增長(zhǎng)。假設(shè)每隔30分鐘監(jiān)測(cè)一次高鐵的里程,當(dāng)RRD收到COUNTER類型的數(shù)據(jù)時(shí),并不會(huì)像GAUGE類型那樣直接存儲(chǔ),而是計(jì)算變化率。計(jì)算原理:(67890km-67740km)/(11:30-11:00)=5km/min,也就是說速度為5km/min,83.33m/s。RRD對(duì)于COUNTER類型的數(shù)據(jù)源存儲(chǔ)的是變化率,對(duì)于上述里程表而言就是行駛速度。(注意:第一個(gè)存儲(chǔ)值為UNKNOWN,因?yàn)闆]有更早的數(shù)據(jù)可用于計(jì)算,所以此時(shí)沒有變化可言)。
3)ABSOLUTE:ABSOLUTE類型存儲(chǔ)的也是變化率,假設(shè)鐵路運(yùn)維監(jiān)控平臺(tái)每五分鐘都會(huì)有監(jiān)控告警信息上報(bào),如果在五分鐘內(nèi)存在告警信息10條,當(dāng)我們看完這十條告警信息后未讀提醒就會(huì)變?yōu)?,然后下一個(gè)五分鐘后繼續(xù)看未讀新消息數(shù)。所以該數(shù)值越大,表示每5分鐘內(nèi)收到的未讀消息越多,存在的問題也就越多,具體監(jiān)測(cè)表如圖3所示。這樣我們就可以通過計(jì)算知道一段時(shí)間內(nèi)鐵路運(yùn)維監(jiān)控平臺(tái)所收取到的警告條數(shù),從而得知系統(tǒng)的整體運(yùn)行情況,計(jì)算方式如下:100條/300秒=0.33條/秒。
4)DERIVE:DERIVE類型存儲(chǔ)的也是變化率,和COUNTER類型不同的是,監(jiān)測(cè)值可以增長(zhǎng)也可以下降,其計(jì)算原理和COUNTER相同,例如某監(jiān)控平臺(tái)在一定時(shí)間收到的異常數(shù)據(jù)條數(shù),如圖4所示。
1.2 RRD的數(shù)據(jù)歸檔
1.2.1RRD的歸檔模型
RRD的歸檔模型RRA(Round Robin Archive)定義了怎樣來(lái)存儲(chǔ)數(shù)據(jù)而非直接存儲(chǔ)原始數(shù)據(jù),RRD提供的歸檔方法有如下4種:
1)計(jì)算最大值MAX(d1,d2,d3,...dn)=最大的那個(gè)監(jiān)測(cè)值
2)計(jì)算最小值MIN(d1,d2,d3,...dn)=最小的那個(gè)監(jiān)測(cè)值
3)計(jì)算最后值LAST(d1,d2,d3,...dn)=最后的那個(gè)監(jiān)測(cè)值
4)計(jì)算平均值A(chǔ)VERAGE(d1,d2,d3,...dn)=(d1+d2+d3...dn)/n
四種歸檔模型適用于不同的場(chǎng)景,比如一定范圍內(nèi)的極大值、極小值監(jiān)控、最終值監(jiān)控等,其中最常使用的是平均值,展示數(shù)據(jù)在一定時(shí)間范圍內(nèi)的變化趨勢(shì)。
1.2.2歸檔的意義
為什么要對(duì)數(shù)據(jù)進(jìn)行歸檔?這得從監(jiān)測(cè)場(chǎng)景的實(shí)際需求出發(fā)。通常我們會(huì)對(duì)最近一小時(shí)或一天的監(jiān)測(cè)數(shù)據(jù)最關(guān)心,對(duì)于一個(gè)月或者更久的監(jiān)測(cè)數(shù)據(jù)并不關(guān)心。
假設(shè)存在這樣一個(gè)場(chǎng)景,我們每秒監(jiān)測(cè)一次某臺(tái)服務(wù)器CPU使用率,獲取一個(gè)監(jiān)測(cè)數(shù)據(jù),那么一年后將獲得:1×60秒×60分鐘×24小時(shí)×365天=31536000個(gè)監(jiān)測(cè)值。
如果這么多數(shù)據(jù)點(diǎn)在一張圖表上展示,即使一個(gè)數(shù)據(jù)點(diǎn)只占一個(gè)像素,那么你也可以想象需要多大的圖片才可以對(duì)圖形進(jìn)行展示,而且這樣做將極大地增加繪圖的時(shí)間,并且沒有實(shí)際效益。但是,如果我們將每60秒監(jiān)測(cè)的60個(gè)原始數(shù)據(jù)點(diǎn)計(jì)算出一個(gè)平均值,比如每60個(gè)點(diǎn)算一個(gè)平均值,這樣數(shù)據(jù)量就比使用原始值降低了60倍!同理,如果我們把每小時(shí)監(jiān)測(cè)的3600個(gè)原始數(shù)據(jù)點(diǎn)計(jì)算一個(gè)歸檔平均值的話,數(shù)據(jù)點(diǎn)就只有24×365=8760個(gè)。這就是繪圖展示監(jiān)測(cè)情況的時(shí)候要使用RRA歸檔數(shù)據(jù)的原因。
1.3 RRD的存儲(chǔ)
RRD文件一般以.rrd結(jié)尾,文件格式大體分為兩部分,其中文件頭信息區(qū)包含一些版本信息和一些與數(shù)據(jù)存儲(chǔ)區(qū)相關(guān)的信息。數(shù)據(jù)存儲(chǔ)區(qū)存儲(chǔ)了實(shí)際的數(shù)據(jù)。數(shù)據(jù)的類型是根據(jù)在創(chuàng)建RRD文件時(shí)定義的數(shù)據(jù)源(Data Source)屬性和RRA來(lái)共同決定。
1.3.1 環(huán)形的rrd數(shù)據(jù)庫(kù)
對(duì)于RRD我們可以把它的存儲(chǔ)空間看成一個(gè)圓,具體如圖5所示,上面有很多刻度和一根指向刻度的指針。這些刻度所在的位置就代表用于存儲(chǔ)數(shù)據(jù)的位置。
所謂指針,我們可以理解為是從圓心指向這些刻度的一條直線,指針會(huì)隨著數(shù)據(jù)的讀寫自動(dòng)移動(dòng),并且這個(gè)圓沒有起點(diǎn)和終點(diǎn)的概念,也就是說指針隨時(shí)間變化可以一直移動(dòng),在一段時(shí)間后,當(dāng)所有的空間都存滿了數(shù)據(jù)時(shí),指針就又從它第一個(gè)存放數(shù)據(jù)的位置開始存放數(shù)據(jù),并覆蓋掉之前的數(shù)據(jù)。這樣整個(gè)存儲(chǔ)空間的大小就是一個(gè)固定的數(shù)值。
2? RRDTool與Open-Falcon的結(jié)合應(yīng)用
2.1? Open-Falcon
2.1.1? Open-Falcon簡(jiǎn)介
Open-Falcon為社區(qū)開源的監(jiān)控平臺(tái),由數(shù)據(jù)采集與告警判斷兩部分組成。主要負(fù)責(zé)監(jiān)控?cái)?shù)據(jù)的采集、上報(bào)、告警判定等,可以實(shí)現(xiàn)對(duì)服務(wù)器、操作系統(tǒng)、中間件、第三方應(yīng)用等進(jìn)行監(jiān)控,結(jié)合RRDTool的歸檔與存儲(chǔ)的優(yōu)異性能,可以高效的對(duì)大規(guī)模的集群與復(fù)雜的應(yīng)用實(shí)現(xiàn)高效的監(jiān)控。
告警判斷部分主要由judge、alarm等組成,其中judge負(fù)責(zé)判斷數(shù)據(jù)采集組件所采集的數(shù)據(jù)與用戶配置的告警策略是否符合,若符合告警策略則認(rèn)為該條數(shù)據(jù)為異常數(shù)據(jù),需要告警,便將該數(shù)據(jù)發(fā)送至alarm,由alarm來(lái)實(shí)現(xiàn)告警,從而幫助運(yùn)維人員快速的定位問題。
數(shù)據(jù)采集部分主要由agent、transfer、graph組成,其中agent負(fù)責(zé)采集監(jiān)控?cái)?shù)據(jù),是所有數(shù)據(jù)的源頭,agent支持單周期內(nèi)上億次的數(shù)據(jù)采集,并且結(jié)合RRD可實(shí)現(xiàn)單服務(wù)器200萬(wàn)指標(biāo)的上報(bào)、歸檔、存儲(chǔ)。agent通過定時(shí)采集數(shù)據(jù)(默認(rèn)每分鐘一次),通過rpc調(diào)用將數(shù)據(jù)發(fā)送給transfer做數(shù)據(jù)規(guī)整,并做一致性hash分片,然后將數(shù)據(jù)發(fā)送給graph來(lái)存儲(chǔ),并由graph提供數(shù)據(jù)查詢的接口。
2.2? Open-Falcon與RRDTool的結(jié)合應(yīng)用
2.2.1 RRDTool結(jié)合Open-Falcon存儲(chǔ)數(shù)據(jù)
Open-Falcon的agent模塊將數(shù)據(jù)采集后通過transfer發(fā)送至graph,采集的數(shù)據(jù)示例如下:
Endpoint:ffeaee73-5f6d-49f0-9b0e-cf9c4e82ba34, Metric:df.bytes.used.percent,
Type:GAUGE,
Tags:dev=/dev/adf1,
Step:60,
Time:1570846812,
Value:20
Hostip:192.168.17.29
Endpoint:虛擬機(jī)的uuid或物理機(jī)的主機(jī)名稱。Metric:指標(biāo)名稱。Type:指標(biāo)類型。Tags:標(biāo)簽,可以為空,對(duì)指標(biāo)進(jìn)一步的分類。Step:采集周期。Time:當(dāng)前時(shí)間時(shí)間戳。Value:指標(biāo)值。Hostip:目標(biāo)機(jī)ip。其中g(shù)raph模塊主要負(fù)責(zé)操作rrd數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)數(shù)據(jù),并且每次存入的時(shí)候,會(huì)自動(dòng)進(jìn)行采樣、歸檔。為了不丟失信息,數(shù)據(jù)歸檔的時(shí)候,會(huì)按照平均值采樣、最大值采樣、最小值采樣存三份。接收到transfe發(fā)送的數(shù)據(jù)之后,graph會(huì)按rrd數(shù)據(jù)庫(kù)解析數(shù)據(jù)的方式,計(jì)算出發(fā)送來(lái)的數(shù)據(jù)的UUID和MD5。
假設(shè)每條數(shù)據(jù)為一個(gè)item對(duì)象,則計(jì)算方式如下所示:
item.uuid=(item.endpoint+item.metric+item.tags+item.dstype+item.step)
item.md5=(item.endpoint+item.metric+item.tags)
計(jì)算出指標(biāo)數(shù)據(jù)的uuid與md5值后,graph會(huì)將item進(jìn)行處理。首先刷入本地緩存,即內(nèi)存隊(duì)列中,rrd文件命名規(guī)則為:RRDFileName=item.md5+item.dstype+item.step,然后會(huì)建立本地索引,此時(shí)會(huì)嘗試先增量建立索引,當(dāng)索引接收到數(shù)據(jù)后,通過計(jì)算數(shù)據(jù)的總條數(shù)值(checksum)來(lái)確定來(lái)自目標(biāo)機(jī)(endpoint)的metric是否是第一次采集數(shù)據(jù)。
如果不是第一次采集數(shù)據(jù),則在已經(jīng)建索引的數(shù)據(jù)項(xiàng)的緩存(IndexedItemCache)中能夠找到,并且如果uuid沒變則只更新item;如果uuid變了則重新建立索引(index);如果是第一次數(shù)據(jù)采集,那么在IndexedItemCache中找不到,則把它添加到unindexeditemCache中,等待被索引。之后graph會(huì)定時(shí)在未建索引的數(shù)據(jù)項(xiàng)的緩存(unindexeditemCache)中創(chuàng)建索引,并將它保存到系統(tǒng)對(duì)應(yīng)關(guān)聯(lián)的項(xiàng)目數(shù)據(jù)庫(kù)中,如PostgreSQL或Mysql數(shù)據(jù)庫(kù),以PostgreSQL為例,則會(huì)在PostgreSQL中新建三張表:
1)endpoint:該表記錄了所有上報(bào)數(shù)據(jù)的endpoint,并且為每一個(gè)endpoint生成一個(gè)id,即endpoint_id。
2)tag_endpoint:拆解item的每一個(gè)tag。用tag和endpoint形成一個(gè)主鍵的表,記錄每個(gè)endpoint包含的tag。每條記錄生成一個(gè)id,為tagendpoint_id。
3)endpoint_counter:counter是metric+tags組合后的名詞
最后將內(nèi)存隊(duì)列中的數(shù)據(jù)存入rrd數(shù)據(jù)庫(kù)中。
2.2.2 RRDTool結(jié)合Open-Falcon查詢數(shù)據(jù)
為指標(biāo)數(shù)據(jù)建立索引的目的是為了更快定位rrd文件,而rrd文件命名是受endpoint、metric、tags、dstype、step決定的,所以當(dāng)查詢請(qǐng)求時(shí),不可能去遍歷所有的rrd文件,就會(huì)先讀取數(shù)據(jù)表的數(shù)據(jù),拼接出rrd文件路徑,然后根據(jù)索引創(chuàng)建的時(shí)間范圍進(jìn)行獲取數(shù)據(jù)。
查詢數(shù)據(jù)時(shí)首先會(huì)根據(jù)endpoint和counter,從索引中獲取數(shù)據(jù)的dsType和step從而生成md5:(endpoint + counter)計(jì)算md5,然后從indexedItemCache查找md5對(duì)應(yīng)的item,如果沒有找到的話,則從數(shù)據(jù)庫(kù)中中進(jìn)行查找,之后根據(jù)endpoint、counter、dsType、step,獲取對(duì)應(yīng)的RRD文件名,從而獲取到數(shù)據(jù)。
當(dāng)用戶在查詢某個(gè)metric在過去一個(gè)月或者一年的歷史數(shù)據(jù)時(shí),graph會(huì)依據(jù)RRD初始化時(shí)定義的采樣頻率,返回采樣過后的數(shù)據(jù),從而極大地提高數(shù)據(jù)查詢速度。
3 RRDTool與Open-Falcon在鐵路監(jiān)控運(yùn)維上的應(yīng)用
Open-Falcon在應(yīng)對(duì)硬件、軟件、操作系統(tǒng)等方面提供了多種監(jiān)控指標(biāo)和便捷的自定義監(jiān)控插件與指標(biāo)的方式,為運(yùn)維監(jiān)控提供了很大的靈活性。
除此以外,強(qiáng)大的性能如單機(jī)200萬(wàn)的指標(biāo)采集與周期內(nèi)上億次的指標(biāo)上報(bào),結(jié)合RRDTool的歸檔存儲(chǔ)與動(dòng)態(tài)展示能力,便捷地解決了鐵路行業(yè)在運(yùn)維監(jiān)控上的難題。
3.1 基礎(chǔ)監(jiān)控
agent內(nèi)置許多監(jiān)控指標(biāo),應(yīng)用到鐵路行業(yè),可以實(shí)現(xiàn)對(duì)基礎(chǔ)的如服務(wù)器的CPU、Load、內(nèi)存、磁盤、IO、網(wǎng)絡(luò)相關(guān)、內(nèi)核參數(shù)、ss統(tǒng)計(jì)輸出、端口、核心服務(wù)的進(jìn)程存活信息、關(guān)鍵業(yè)務(wù)進(jìn)程資源消耗、NTP offset、DNS解析等指標(biāo)進(jìn)行采集。
以磁盤io寫入速率為例,agent定期采集目標(biāo)機(jī)的io寫入速率的監(jiān)控?cái)?shù)據(jù)并將數(shù)據(jù)發(fā)送至graph寫入數(shù)據(jù)庫(kù)中,當(dāng)我們想了解最近一小時(shí)的磁盤io寫入速率,則可以利用RRDTool繪制最近一小時(shí)內(nèi)磁盤的寫入速率情況,此時(shí)使用的數(shù)據(jù)為agent定期上報(bào)的監(jiān)控?cái)?shù)據(jù),我們可以清楚地看見具體某個(gè)時(shí)間點(diǎn)的具體數(shù)值,如圖6所示。
當(dāng)我們想了解最近一個(gè)月的磁盤io寫入速率時(shí),我們并不會(huì)在意具體哪一天的哪個(gè)時(shí)間點(diǎn)的使用情況,而是關(guān)注這一個(gè)月內(nèi)的整體變化情況,此時(shí)就可以利用RRD的歸檔數(shù)據(jù),繪制最近月內(nèi)磁盤的寫入速率情況,重點(diǎn)了解一個(gè)月內(nèi)的整體變化情況。
利用RRD的歸檔數(shù)據(jù)繪制過去一個(gè)月內(nèi)的數(shù)據(jù)變化圖,這種方式不僅不影響我們了解某些指標(biāo)的變化趨勢(shì);而且利用歸檔數(shù)據(jù)可以節(jié)省大量的數(shù)據(jù)存儲(chǔ)空間,節(jié)約系統(tǒng)資源;并且相較于利用一個(gè)月內(nèi)的所有的監(jiān)控?cái)?shù)據(jù)繪圖,利用歸檔數(shù)據(jù)時(shí)間更短效率更高。
3.2 自定義監(jiān)控
agent也可以采集第三方應(yīng)用的監(jiān)控?cái)?shù)據(jù),比如Mysql、云集群與云服務(wù)、RabbitMQ、大數(shù)據(jù)集群與大數(shù)據(jù)服務(wù)等實(shí)現(xiàn)監(jiān)控?cái)?shù)據(jù)采集,還可以通過自定義各種插件實(shí)現(xiàn)對(duì)Linux、Windows、交換機(jī)等設(shè)備進(jìn)行監(jiān)控?cái)?shù)據(jù)的采集。
以目前應(yīng)用在鐵路行業(yè)最廣的云集群為例,我們可以通過自定義agent插件,以監(jiān)測(cè)云集群的狀態(tài)。比如我們想了解最近一小時(shí)內(nèi)云集群的nova.api服務(wù)的存活狀態(tài)時(shí)就可以通過自定義插件的形式,并同樣將監(jiān)控?cái)?shù)據(jù)發(fā)送至graph并存入RRD數(shù)據(jù)庫(kù)中,假設(shè)采集數(shù)據(jù)的指標(biāo)名稱為service.openstack.nova.api.up,并規(guī)定指標(biāo)的值(value)為1時(shí)代表服務(wù)運(yùn)行正常,為0時(shí)服務(wù)異常。
此時(shí)我們便可以通過RRDTool繪制該服務(wù)的運(yùn)行狀態(tài)圖,可以很直觀地了解該服務(wù)的整體運(yùn)行狀況。
4? 結(jié)束語(yǔ)
本文對(duì)以RRDTool監(jiān)控?cái)?shù)據(jù)存儲(chǔ)技術(shù)為基礎(chǔ)的鐵路運(yùn)維監(jiān)控平臺(tái)在處理大規(guī)模的實(shí)時(shí)數(shù)據(jù)方面進(jìn)行了詳細(xì)分析,介紹了RRDTool的有關(guān)概念與簡(jiǎn)單使用,以及結(jié)合Open-Falcon在鐵路監(jiān)控平臺(tái)上的具體應(yīng)用。從RRDTool對(duì)數(shù)據(jù)的歸檔結(jié)構(gòu)以及存儲(chǔ)方式,論證了使用它的必要性。
當(dāng)然,運(yùn)維監(jiān)控平臺(tái)的優(yōu)化是無(wú)止境的,所需解決的問題也遠(yuǎn)不止于此,需要不斷面對(duì)問題、解決問題從而優(yōu)化系統(tǒng),才能始終保證系統(tǒng)的高效與優(yōu)異。