RRDTool 存儲(chǔ)原理簡介

RRDTool 是一套監(jiān)測工具设易,可用于存儲(chǔ)和展示被監(jiān)測對象隨時(shí)間的變化情況拄显。比如,我們在 Windows 電腦上常見的內(nèi)存和 CPU 使用情況:

電腦內(nèi)存和 ?CPU 使用情況

RRD 全稱是 Round Robin Database 趾撵,即「環(huán)型數(shù)據(jù)庫」赡译。顧名思義,它是一種循環(huán)使用存儲(chǔ)空間的數(shù)據(jù)庫濒析,適用于存儲(chǔ)和時(shí)間序列相關(guān)的數(shù)據(jù)正什。

RRD 數(shù)據(jù)庫在被創(chuàng)建的時(shí)候就已經(jīng)定義好了大小,當(dāng)空間存儲(chǔ)滿了以后号杏,又從頭開始覆蓋舊的數(shù)據(jù)婴氮,所以和其他線性增長的數(shù)據(jù)庫不同,RRD 的大小可控且不用維護(hù)盾致。

你可以把 RRD 理解為一個(gè)有時(shí)間刻度的圓環(huán)主经,每個(gè)刻度上可以存儲(chǔ)一個(gè)數(shù)值,同時(shí)有一個(gè)從圓心指向最新存儲(chǔ)值的指針绰上。

可以想象旨怠,隨著時(shí)間推移,指針會(huì)繞著圓心一直移動(dòng)下去蜈块,當(dāng)它指向下一個(gè)刻度后鉴腻,就可以在那個(gè)位置上存儲(chǔ)一個(gè)新的數(shù)值迷扇。但是,指針只能繞一個(gè)方向前進(jìn)爽哎,假設(shè)你存儲(chǔ)了時(shí)刻3的監(jiān)測值蜓席,那就不能再存儲(chǔ)時(shí)刻2的監(jiān)測值了。如下圖所示:

圓環(huán)

創(chuàng)建 RRD?基本語法

rrdtool?create?filename?

[--start|-b?start-time]?

[--step|-s?step]

[DS:ds-name:DST:dst-arguments]

[RRA:CF:xff:step:rows]

其中

rrdtool?create?filename

表示使用 rrdtool 命令 create 創(chuàng)建一個(gè)名為 filename 的數(shù)據(jù)庫文件课锌,通常 RRD 數(shù)據(jù)庫文件的后綴為 .rrd 厨内,但是你隨便使用文件名也不會(huì)有影響。

--start|-b?start-time

這個(gè)選項(xiàng)表示 RRD 數(shù)據(jù)庫的起始 (start/begin) 時(shí)間點(diǎn)為 start-time渺贤,這是一個(gè)從 1970-01-01 00:00:00 開始計(jì)時(shí)雏胃,以秒為間隔的一個(gè)整數(shù)值。

如圖所示:

時(shí)間軸

A點(diǎn)是從 1970-01-01 00:00:00 開始經(jīng)過0秒后到達(dá)的時(shí)間點(diǎn)志鞍;

B點(diǎn)是從 1970-01-01 00:00:00 開始經(jīng)過658108920秒后到達(dá)的時(shí)間點(diǎn) 1990-11-09 00:02:00瞭亮;

C點(diǎn)是從 1970-01-01 00:00:00 開始經(jīng)過1458763813秒后到達(dá)的時(shí)間點(diǎn) 2016-03-23 20:10:13。

所以固棚,start-time 是一個(gè)代表時(shí)間點(diǎn)的整數(shù)值统翩,表示 RRD 數(shù)據(jù)庫記錄的監(jiān)測值從這個(gè)時(shí)刻開始。

[--step|-s?step]

這個(gè)選項(xiàng)表示監(jiān)測的時(shí)間間隔此洲,即多久時(shí)間去獲取一次被監(jiān)測對象的數(shù)值厂汗,默認(rèn)值為5分鐘(300秒)。比如呜师,我們可以從10:00開始每60秒去獲取一次電腦內(nèi)存的使用值娶桦,這個(gè)時(shí)候 step 就是 60,獲取到的數(shù)值如下圖所示:

每隔60秒獲取監(jiān)測值


[DS:ds-name:DST:dst-arguments]

這個(gè)選項(xiàng)用來定義數(shù)據(jù)源(Data Source)屬性匣掸,包括數(shù)據(jù)源名稱 ds-name趟紊,比如我們可以給監(jiān)測內(nèi)存使用率的數(shù)據(jù)源命名為 memory-rate氮双。

還要定義數(shù)據(jù)源類型(Data Source Type)碰酝,常用的有以下4種數(shù)據(jù)源類型,分別是:

1戴差、GAUGE

實(shí)測值送爸,RRD 將如實(shí)記錄,比如溫度變化曲線:

溫度變化曲線

2暖释、COUNTER

計(jì)數(shù)值袭厂,這是一個(gè)只增不減的正整數(shù)。比如球匕,汽車行駛里程纹磺,從汽車第一次上路開始,里程就從0開始不斷增長:

汽車?yán)锍瘫?/div>

假設(shè)每隔30分鐘監(jiān)測一次汽車?yán)锍塘敛埽?dāng) RRD 收到 COUNTER 類型的數(shù)據(jù)時(shí)橄杨,并不會(huì)像 GAUGE 類型那樣直接存儲(chǔ)秘症,而是計(jì)算變化率:

汽車?yán)锍瘫O(jiān)測

計(jì)算原理: (12121km - 12100km) / (10:30 - 10:00) = 11000m / 1800s = 6.11m/s

所以,RRD 對于 COUNTER 類型的數(shù)據(jù)源存儲(chǔ)的是變化率式矫,對于上述里程表而言就是行駛速度乡摹。

(注:第一個(gè)存儲(chǔ)值為 UNKNOWN,因?yàn)闆]有更早的數(shù)據(jù)采转,所以沒有變化可言)

3聪廉、ABSOLUTE

ABSOLUTE 類型存儲(chǔ)的也是變化率,假設(shè)我們正在微信和好友聊天故慈,每五分鐘我們會(huì)看一下有沒有新消息板熊,如果有的話就立即處理,這樣未讀提醒就會(huì)變?yōu)?察绷,然后下一個(gè)五分鐘后繼續(xù)看未讀新消息數(shù)邻邮,會(huì)得到這樣一個(gè)監(jiān)測表:

微信未讀消息監(jiān)測
微信未讀消息

計(jì)算原理:120條 / 300秒 = 0.4條/秒

這樣我們就可以知道一段時(shí)間內(nèi)聊天快慢的情況,數(shù)值越大表示5分鐘內(nèi)收到的未讀消息越多克婶,聊天也就越火熱筒严。

4、DERIVE

DERIVE 類型存儲(chǔ)的也是變化率情萤,和 COUNTER 類型不同的是鸭蛙,監(jiān)測值可以增長也可以下降,例如水庫的水位監(jiān)測:

水庫水位監(jiān)測

可以看到水位一時(shí)升高筋岛,一時(shí)降低娶视,通過計(jì)算變化率能夠監(jiān)測某一時(shí)段水位正在升高還是降低,以及相應(yīng)的速度睁宰。

[RRA:CF:xff:step:rows]

RRA (Round Robin Archive) 是用來定義 RRD 數(shù)據(jù)庫歸檔模型肪获,RRDTool 繪圖展示監(jiān)測情況的時(shí)候就從 RRA 中獲取數(shù)據(jù)。

為什么不直接獲取存儲(chǔ)的原始數(shù)據(jù)來繪圖呢柒傻?

這得從監(jiān)測場景的實(shí)際需求出發(fā)孝赫,通常我們對最近一小時(shí)或一天的監(jiān)測數(shù)據(jù)最關(guān)心,對于一個(gè)月或者一年以上的監(jiān)測數(shù)據(jù)有個(gè)大概的認(rèn)知就可以红符。

假設(shè)我們每秒監(jiān)測一次某臺(tái)服務(wù)器 CPU 使用率青柄,那么一年后將獲得:

1 x 60秒 x 60分鐘 x 24小時(shí) x 365天 = 31536000

個(gè)監(jiān)測值。

如果這么多數(shù)據(jù)點(diǎn)在一張圖表上展示预侯,即使一個(gè)數(shù)據(jù)點(diǎn)只占一個(gè)像素致开,你也可以想象得多長的圖片才能完整展示監(jiān)測數(shù)據(jù)。

但是萎馅,如果我們把每60秒監(jiān)測的60個(gè)原始數(shù)據(jù)點(diǎn)計(jì)算出一個(gè)平均值 AVERAGE(d1,d2,d3,...,d60) 的話双戳,那么將有:


1 x 60分鐘 x 24小時(shí) x 365天 = 525600

個(gè)平均值。

這樣數(shù)據(jù)量就比使用原始值降低了60倍糜芳!這種經(jīng)過計(jì)算平均值后得到的數(shù)據(jù)稱為歸檔值飒货。

雖然喪失了一定的精度千诬,但是并不影響我們觀察一年來的變化趨勢。

同理膏斤,如果我們把每小時(shí)監(jiān)測的3600個(gè)原始數(shù)據(jù)點(diǎn)計(jì)算一個(gè)歸檔平均值的話徐绑,數(shù)據(jù)點(diǎn)就只有24 x 365 = 8760個(gè)了。這就是繪圖展示監(jiān)測情況的時(shí)候要使用 RRA 歸檔數(shù)據(jù)的原因莫辨。

RRD 提供的歸檔方法有4種傲茄,除了上述的計(jì)算平均值 AVERAGE 方法外,還有:

計(jì)算最大值 MAX(d1,d2,d3,...dn) = 最大的那個(gè)監(jiān)測值

計(jì)算最小值 MIN(d1,d2,d3,...dn) = 最小的那個(gè)監(jiān)測值

計(jì)算最后值 LAST(d1,d2,d3,...dn) = 最后的那個(gè)監(jiān)測值

這里還涉及到兩個(gè)基本概念:

PDP (Primary Data Point) 原始數(shù)據(jù)點(diǎn)

CDP (Consolidation Data Point) 歸檔數(shù)據(jù)點(diǎn)

由上述介紹可以知道:一個(gè) CDP 由多個(gè) PDP 經(jīng)過歸檔函數(shù)計(jì)算得到沮榜。

在定義 RRA 的時(shí)候盘榨,一般的語法為:

RRA:CF:xff:steps:rows

表示使用{AVERAGE | MIN | MAX | LAST}中的一個(gè)歸檔函數(shù)? CF (Consolidation Function)。

xff 是 xfiles 因子(factor)蟆融,表示超過多少比率的有效 PDP 才可以計(jì)算出 CDP草巡,通常為0.5。

如果我們設(shè)置 xff 為 0.5型酥,即有大于50%的有效監(jiān)測值就可以在這些有效值上計(jì)算出歸檔值山憨,否則這段時(shí)間內(nèi)的歸檔值記為 UNKNOWN。

例如弥喉,我們監(jiān)測的10個(gè)時(shí)間點(diǎn)中郁竟,因?yàn)槟承┰蚱渲?個(gè)無法獲取監(jiān)測值,即監(jiān)測值為 UNKNOWN由境,那么還剩6個(gè)有效的監(jiān)測值棚亩,這時(shí)候有效率為60%,所以可以獲得歸檔值虏杰。

steps 表示多少個(gè) PDP 計(jì)算出一個(gè) CDP讥蟆,例如,在每秒獲取一個(gè)監(jiān)測值的實(shí)例中纺阔,steps = 60 表示每60個(gè)原始數(shù)據(jù)計(jì)算一個(gè)歸檔數(shù)據(jù)瘸彤,即一分鐘一個(gè)數(shù)據(jù)點(diǎn);steps = 3600 表示每3600個(gè)原始數(shù)據(jù)計(jì)算一個(gè)歸檔數(shù)據(jù)州弟,即一小時(shí)一個(gè)數(shù)據(jù)點(diǎn)钧栖。

?rows 表示多少個(gè) CDP 組成一個(gè) RRA低零。

通常一個(gè) RRD 數(shù)據(jù)庫可以有多個(gè)不同精度的 RRA婆翔,其中周期( steps * rows)最長的的 RRA 同時(shí)也規(guī)定了 RRD 的周期,這就是開頭說的:RRD 數(shù)據(jù)庫在創(chuàng)建的時(shí)候就已經(jīng)定義好大小掏婶。

使用命令創(chuàng)建一個(gè)名為 test.rrd 的 RRD 數(shù)據(jù)庫:

rrdtool create test.rrd

--step 300

DS:miles:COUNTER:600:0:1024

RRA:AVERAGE:0.5:2:8

RRA:AVERAGE:0.5:4:7

RRD 數(shù)據(jù)庫模型(U 表示 UNKNOWN)

--step 300

表示監(jiān)測時(shí)間間隔為5分鐘啃奴。

DS:miles:COUNTER:600:0:1024

表示數(shù)據(jù)源的名稱 為 miles,數(shù)據(jù)源類型(DST) 為 COUNTER雄妥,數(shù)據(jù)源的 heartbeat 周期為 600秒最蕾,如果一個(gè) heartbeat 時(shí)間周期內(nèi)監(jiān)測數(shù)據(jù)還沒有獲取到依溯,那么 RRD 自動(dòng)將監(jiān)測值設(shè)置為 UNKNOWN,數(shù)據(jù)源的最小值為0瘟则,最大值為1024黎炉,如果獲得的監(jiān)測值不在這個(gè)范圍, RRD 自動(dòng)將監(jiān)測值設(shè)置為 UNKNOWN醋拧。

RRA:AVERAGE:0.5:2:8

定義了一個(gè) RRA :歸檔函數(shù)是求平均值 AVERAGE慷嗜,xff 因子是 0.5,每2個(gè)監(jiān)測值 PDP 將計(jì)算一個(gè)歸檔值 CDP丹壕,總共存儲(chǔ) 8 個(gè) CDP庆械,所以這個(gè) RRA 的時(shí)間周期是 300s x 2 x 8 = 4800s。

如上圖示例可知菌赖,CDP(RRA1-AVG) 的各項(xiàng)值為?

(1+2)/2 = 1.5

(3+4)/2 = 3.5

......


RRA:AVERAGE:0.5:4:7

定義了一個(gè) RRA :歸檔函數(shù)是求平均值 AVERAGE缭乘,xff 因子是 0.5,每4個(gè)監(jiān)測值 PDP 將計(jì)算一個(gè)歸檔值 CDP琉用,總共存儲(chǔ) 7 個(gè) CDP堕绩,所以這個(gè) RRA 的時(shí)間周期是 300s x 4 x 7 = 8400s。

如上圖示例可知邑时,CDP(RRA2-AVG) 的各項(xiàng)值為

(1+2+3+4)/4 = 2.5

(5+6+7+8)/4 = 6.5

......


上述兩個(gè) RRA 中逛尚,最長時(shí)間周期為 8400s,由于 RRD 定義的監(jiān)測周期為 300s刁愿,所以這個(gè) RRD 將存儲(chǔ) 8400/300 = 28個(gè)監(jiān)測值绰寞。

因?yàn)?RRA 的長度 rows 也是定義好的,所以隨著時(shí)間推移铣口,監(jiān)測值越來越多的時(shí)候滤钱,RRA 的內(nèi)容也隨之變化:

時(shí)間推移

當(dāng) RRDTool 繪制監(jiān)測圖表的時(shí)候,會(huì)優(yōu)先選取精度(solution)高的 RRA 數(shù)據(jù)脑题,上圖示例中件缸,顯然 RRA1-AVG 的精度要高于 RRA2-AVG,或者說更接近原始數(shù)據(jù)叔遂。

但是他炊,一個(gè)前提條件是所選的 RRA 能夠覆蓋我們希望圖表展示的時(shí)間周期,上圖示例中 RRA1-AVG 只覆蓋了 第5-20個(gè)監(jiān)測點(diǎn)已艰,所以當(dāng)我們希望看到從第1-20個(gè)監(jiān)測點(diǎn)的數(shù)據(jù)時(shí)痊末,只能選擇 RRA2-AVG 了,雖然它精度不如 RRA1-AVG哩掺,但至少它覆蓋到了我們希望看到的時(shí)間周期凿叠。

所以,在實(shí)際應(yīng)用場景中,我們通常會(huì)定義多個(gè) RRA盒件,覆蓋時(shí)間周期短的精度高蹬碧,比如最近一天的監(jiān)測值;覆蓋時(shí)間周期長的精度低炒刁,比如最近一年的監(jiān)測值恩沽。

以上是 RRD 數(shù)據(jù)庫的內(nèi)部存儲(chǔ)原理,那么如何更新它的存儲(chǔ)值呢翔始?

通常飒筑,我們會(huì)借用外部程序,如 Shell绽昏、Python协屡、Ruby等腳本語言,獲取被監(jiān)測對象的數(shù)值全谤,然后使用 RRDTool update 命令存儲(chǔ)監(jiān)測值肤晓,例如:

rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363 ......

表示時(shí)間點(diǎn)920804700時(shí),被監(jiān)測對象數(shù)值為12345

表示時(shí)間點(diǎn)920805000時(shí)认然,被監(jiān)測對象數(shù)值為12357

表示時(shí)間點(diǎn)920805300時(shí)补憾,被監(jiān)測對象數(shù)值為12363

......

最后,要展示監(jiān)測數(shù)據(jù)了卷员,RRDTool 內(nèi)置了繪圖表功能盈匾,你可以直接使用類似以下的命令行輸出一張 png 圖片:

rrdtool graph myrouter-day.png --start -86400?

DEF:inoctets=myrouter.rrd:input:AVERAGE?

DEF:outoctets=myrouter.rrd:output:AVERAGE?

AREA:inoctets#00FF00:"In traffic"?

LINE1:outoctets#0000FF:"Out traffic"

上述命令表示:創(chuàng)建一張名為 myrouter-day.png 的圖片,監(jiān)測時(shí)間從一天前(60x60x24=86400)開始的路由器進(jìn)出流量統(tǒng)計(jì)毕骡。其中流進(jìn)流量使用區(qū)域圖(AREA)削饵,顏色為綠色(#00FF00);流出流量使用一個(gè)像素寬的曲線圖(LINE1)未巫,顏色為藍(lán)色(#0000FF)窿撬。

但是,RRDTool 也可以將數(shù)值輸出叙凡,然后我們使用第三方的繪圖工具劈伴,繪制監(jiān)測圖,這樣可以在 WEB 上更靈活的展示監(jiān)測數(shù)值握爷。

如下圖所示跛璧,就是 Open-Falcon 使用 RRDTool 存儲(chǔ)監(jiān)測數(shù)據(jù),然后獲取監(jiān)測數(shù)據(jù)在網(wǎng)頁上繪制趨勢圖:

服務(wù)器負(fù)載監(jiān)測


綜上新啼,就是 RRDTool 的原理簡介追城,如果你沒有看懂的話,請隨意吐槽师抄。

作者微博/微信 @Ceelog漓柑,轉(zhuǎn)載請注明出處 ;)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叨吮,隨后出現(xiàn)的幾起案子辆布,更是在濱河造成了極大的恐慌,老刑警劉巖茶鉴,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋玲,死亡現(xiàn)場離奇詭異,居然都是意外死亡涵叮,警方通過查閱死者的電腦和手機(jī)惭蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來割粮,“玉大人盾碗,你說我怎么就攤上這事∫ㄆ埃” “怎么了廷雅?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長京髓。 經(jīng)常有香客問我航缀,道長,這世上最難降的妖魔是什么堰怨? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任芥玉,我火速辦了婚禮,結(jié)果婚禮上备图,老公的妹妹穿的比我還像新娘灿巧。我一直安慰自己,他們只是感情好揽涮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布砸烦。 她就那樣靜靜地躺著,像睡著了一般绞吁。 火紅的嫁衣襯著肌膚如雪幢痘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天家破,我揣著相機(jī)與錄音颜说,去河邊找鬼。 笑死汰聋,一個(gè)胖子當(dāng)著我的面吹牛门粪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烹困,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玄妈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拟蜻,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绎签,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酝锅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诡必,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年搔扁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爸舒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稿蹲,死狀恐怖扭勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苛聘,我是刑警寧澤涂炎,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站焰盗,受9級特大地震影響璧尸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熬拒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一爷光、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澎粟,春花似錦蛀序、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啸盏,卻和暖如春重贺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回懦。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工气笙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怯晕。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓潜圃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舟茶。 傳聞我的和親對象是個(gè)殘疾皇子谭期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容