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