要了解rrdtool如何使用就要先從rrd的數據存儲方式開始,rrdtool就是為了操作這個數據庫的工具,抄來下面一段文字解釋。
0x01 什么是rrd數據庫
所謂的“Round Robin” 其實是一種存儲數據的方式,使用固定大小的空間來存儲數據,並有一個指針指向最新的數據的位置。我們可以把用於存儲數據的數據庫的空間看成一個圓,上面有 很多刻度。這些刻度所在的位置就代表用於存儲數據的地方。所謂指針,可以認為是從圓心指向這些刻度的一條直線。指針會隨着數據的讀寫自動移動。要注意的 是,這個圓沒有起點和終點,所以指針可以一直移動,而不用擔心到達終點后就無法前進的問題。在一段時間后,當所有的空間都存滿了數據,就又從頭開始存放。 這樣整個存儲空間的大小就是一個固定的數值。所以RRDtool 就是使用類似的方式來存放數據的工具, RRDtool 所使用的數據庫文件的后綴名是'.rrd。如下圖,
0x02 創建rrdtool create
單純從理論上了解rrdtool實在有難度,DS、DST、RRA、PDP、CF、CDP等關鍵字直接懵倒一片,其實這些關鍵字都來自於rrd數據庫的創建語句。既然是創建了,那就是和rrd數據庫的結構相關了
* create - create a new RRD
rrdtool create filename [--start|-b start time]
[--step|-s step]
[--no-overwrite|-O]
[DS:ds-name:DST:dst arguments]
[RRA:CF:cf arguments]
各個名詞的解釋可以參考http://freeloda.blog.51cto.com/2033581/1307492,這博文寫得很通俗易懂
個人理解,在DS中雖然指定了每個時間間隔是多少,但是並沒有說明整個DS有多大,可以存儲多少數據,所以DS是一個臨時存儲的位置
最終RRA才是所謂的rrd數據庫,cd arguments中有setps指定了多少個PDP聚合成一個CDP,rows表示有多少個CDP,這里就已經固定了RRA包含幾個CDP,創建之后大小就不變,致使rrd文件大小也不改變
[root@localhost22 ~]# rrdtool create --start 1459017812 --step 3 test.rrd DS:ds1:GAUGE:6:U:U RRA:AVERAGE:0.5:2:600
查看當前的時間是date +%s,上面創建了一個時間間隔為3s的時間槽(--step 3),然后RRA中每2個PDP聚合一次AVERGAE(每個CDP跨度就是6s了),一共創建了600個,即記錄了一個小時的數據。
查看當前rrd文件,使用fetch 指定聚合方式和開始時間
[root@localhost22 ~]# rrdtool fetch test.rrd AVERAGE -r 2 -s 1459018002
ds1
1459018008: -nan
1459018014: -nan
1459018020: -nan
1459018026: -nan
1459018032: -nan
1459018038: -nan
可以看到時間間隔6s,沒有任何數據,接下來要插入數據
0x03 插入數據rrdtool update
往rrd文件中插入數據的命令是rrdtool update
* update - update an RRD
rrdtool update filename
[--template|-t ds-name:ds-name:...]
[--daemon <address>]
time|N:value[:value...]
at-time@value[:value...]
[ time:value[:value...] ..]
兩個主要選項一個就是數據源的順序,這個順序對應上后面需要插入數值的順序,另一個就是"時間:值",當前時間可以用N代替
[root@localhost22 ~]# rrdtool update test.rrd N:`echo $RANDOM`
上面的只是更新一次數據,寫個循環,讓其不斷更新
[root@localhost22 ~]# cat test.sh
while(true)
do
sleep 3 //每隔3s插入數據
rrdtool update test.rrd N:`echo $RANDOM`
done
然后執行該腳本,一段時間后,查看rrd文件 ,-r 2為解析度(表示兩個PDP聚合,如果指定其他解析度是創建時RRA沒有的,取相近的)
[root@localhost22 ~]# rrdtool fetch test.rrd AVERAGE -r 2 -s 1459019604
ds1
1459019610: 2.4833740297e+04
1459019616: 1.0401318901e+04
1459019622: 2.2809431869e+04
1459019628: 1.4484339557e+04
1459019634: 1.3323151010e+04
1459019640: 1.7158955025e+04
1459019646: 1.1848137257e+04
1459019652: 2.7713005683e+04
1459019658: 2.2571123781e+04
1459019664: 1.8554102312e+04
0x04 繪圖rrdtool graph
rrd數據文件有了數據就可以繪圖了,看一下rrdtool graph的參數,太多了!%>_<%
* graph - generate a graph from one or several RRD
rrdtool graph filename [-s|--start seconds] [-e|--end seconds]
[-x|--x-grid x-axis grid and label]
[-Y|--alt-y-grid] [--full-size-mode]
[-y|--y-grid y-axis grid and label]
[-v|--vertical-label string] [-w|--width pixels]
[--right-axis scale:shift] [--right-axis-label label]
[--right-axis-format format]
[-h|--height pixels] [-o|--logarithmic]
[-u|--upper-limit value] [-z|--lazy]
[-l|--lower-limit value] [-r|--rigid]
[-g|--no-legend] [--daemon <address>]
[-F|--force-rules-legend]
[-j|--only-graph]
[-n|--font FONTTAG:size:font]
[-m|--zoom factor]
[-A|--alt-autoscale]
[-M|--alt-autoscale-max]
[-G|--graph-render-mode {normal,mono}]
[-R|--font-render-mode {normal,light,mono}]
[-B|--font-smoothing-threshold size]
[-T|--tabwidth width]
[-E|--slope-mode]
[-P|--pango-markup]
[-N|--no-gridfit]
[-X|--units-exponent value]
[-L|--units-length value]
[-S|--step seconds]
[-f|--imginfo printfstr]
[-a|--imgformat PNG]
[-c|--color COLORTAG#rrggbb[aa]]
[--border width
[-t|--title string]
[-W|--watermark string]
[DEF:vname=rrd:ds-name:CF]
[CDEF:vname=rpn-expression]
[VDEF:vdefname=rpn-expression]
[PRINT:vdefname:format]
[GPRINT:vdefname:format]
[COMMENT:text]
[SHIFT:vname:offset]
[TEXTALIGN:{left|right|justified|center}]
[TICK:vname#rrggbb[aa][:[fraction][:legend]]]
[HRULE:value#rrggbb[aa][:legend]]
[VRULE:value#rrggbb[aa][:legend]]
[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]
[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]
[PRINT:vname:CF:format] (deprecated)
[GPRINT:vname:CF:format] (deprecated)
[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)
[-s|--start time]啟始時間
[-e|--end time]結束時間
[-S|--step seconds]解析度
[-t|--title string]圖片的標題
[-v|--vertical-label string] Y軸標簽
[-w|--width pixels] 顯示區的寬度(像素)
[-h|--height pixels]顯示區的高度 (像素)
[-j|--only-graph]只繪制圖像
[-u|--upper-limit value] Y軸最大值
[-l|--lower-limit value] Y軸最小值
[-r|--rigid]固定Y軸的值,不進行縮放
[-A|--alt-autoscale]自動縮放
[-J|--alt-autoscale-min]只自動縮放最小值
[-M|--alt-autoscale-max]只自動縮放最大值
[-N|--no-gridfit]不顯示網格線
[-x|--x-grid x-axis grid and label] 指定橫軸特性,基准網格線單位(時間):值:主網格線單位:值:x軸標簽顯示間隔(單位):值:后兩位是時間格式
[-y|--y-grid y-axis grid and label]
[-c|--color COLORTAG#rrggbb[aa]]指定相關顏色,COLORTAG(BACK/CANVAS/SHADEA/SHADEB/GRID/FONT/AXIS/FRAME/ARROW)
[-n|--font FONTTAG:size:font]自定義字體庫,指定路徑
[-a|--imgformat PNG] 輸出格式
[-W|--watermark string] 水印
[data definition ...]data and variables獲取畫圖的數據,格式如下:
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time] varname自定義變量保存rrd某個數據源取得的數據,CF指定數據源的哪一個聚合結果(哪個RRA)
LINE[width]:value[#color][:[legend]] 線條粗細:前面DEF定義的變量vname#顏色:圖下面的顏色方塊文本信息
[GPRINT:vname:CF:format] 圖下面的數值信息
[root@localhost22 ~]# rrdtool graph test.png --step 3 --start=1459019604 DEF:vtest=test.rrd:ds1:AVERAGE LINE:vtest#ff0000:'date'