神奇的環形數據庫工具-rrdtool

一 前言

前段時間寫多主機性能指標監控工具res-monitor時有提到它,這裏就專門對它作個介紹吧。css

像res-monitor這類工具,既要實時獲取數據,又要實時圖形化展現數據,常規的是把採集的數據存放到數據庫,而後再讀數據庫數據畫圖展現,然而,當我遇到rrdtool的時候,眼前一亮,很特別,它一方面能夠把數據存儲起來,扮演數據庫的角色;另外一方面又能根據存儲的數據繪圖,並且圖形表達能力很強,如線狀圖、餅狀圖、柱狀圖、區域面積圖等;支持高性能的數據存儲、繪圖,很方便集成在各類腳本中。從github的修改記錄來看,它從2012年發佈至今,一直在維護和更新着,可見其生命力。html

Rrdtool很強大,完成數據存儲和實時展現繪圖等工做,只須要掌握3個命令,但這三個命令的參數至關多,使用起來有點複雜,另外,須要注意的是,它主要應用在linux平臺,在windows上只能用Cygwin打包版本的,並且有些,須要繞過去。python

本文不打算詳細介紹rrdtool的原理,由於這塊能夠看官方文檔,主要是說明如何使用它,並給出一些應用參考。
Rrdtool網址: https://oss.oetiker.ch/rrdtool/index.en.htmllinux

什麼是rrd數據庫

Rrdtool是環形數據庫工具,存儲和讀取的是環形數據庫,表現是後綴爲.rrd的二進制文件。要大概理解啥是環形數據庫,我對它的理解就是把它想象成圓形的時鐘,隨着時間推移,不斷往裏寫數據,同時有個標記指向當前數據記錄的最新位置,就像時鐘上的指針指示當前時間同樣。又由於它是圓形的,無始無終,能夠一直往裏寫數據,只是歷史數據會被覆蓋掉,因此,有時它又被叫作時序結構數據庫。nginx

rrdtool經常使用命令

如下僅列出rrdtool的三個經常使用命令create、update、graph,看到這些命令格式,大概你就感受到這工具使用的複雜性了。
Create命令格式:git

rrdtool create filename [--start|-b start time] [--step|-s step] [--template|-t template-file] [--source|-r source-file] [--no-overwrite|-O] [--daemon|-d address] [DS:ds-name[=mapped-ds-name[[source-index]]]:DST:dst arguments[RRA:CF:cf arguments]

Update命令格式:github

rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--skip-past-updates|-s] [--daemon|-d address] [--] N:value[:value]... timestamp:value[:value]... at-timestamp@value[:value]...

Graph命令格式:數據庫

rrdtool graph|graphv filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]

針對各個參數的說明實在太多,不在此列出,建議直接看官方文檔https://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html,該部分:windows

rrdtool-1.png

rrdtool應用——監控帶寬使用狀況實例

命令格式太複雜,可是,只要搞定上面三個命令,之後用起來就輕鬆了,直接套用格式就行,以下是res-monitor監控帶寬使用的命令配置實例,應用在python代碼裏,僅供參考哦。
1)    使用create命令建立rrd數據庫文件ruby

rrdtool_create = ('{bin_file} create {rrd_file} -s {interval} '
                  'DS:recvAvg:GAUGE:300:0:U '
                  'DS:sendAvg:GAUGE:300:0:U '
                  'RRA:AVERAGE:0.5:1:600 ')

命令說明:
Create命令建立rrd數據庫,設置間隔爲5s,定義裏個數據源(DS),且數據源類型是保留原始值(GAUGE),數據接收的最大時間跨度是5分鐘,不然設置U(unknown),指定按每一個數據取平均值(AVERAGE)的方式歸檔存放數據;

2)    使用update命令更新rrd數據庫

rrdtool_update = '{bin_file} update {rrd_file} N:'

命令說明:
Update命令向rrd數據庫寫數據,注意N:後面的數據組數和create指定的數據源對應,上面create是2個數據源,update的數據也只能是2組。能夠理解成多行2列的表,每列對應create指定的數據源,update就是一行行往裏面填數據。

3)    使用graph命令讀取rrd數據庫並繪製

    rrdtool_graph = ('{bin_file} graph {rrd_graph} '
                             '--start now-1800s '
                             '--vertical-label "NET Utilization" '
                             '--units-exponent 0 '
                             '--alt-autoscale-max '
                             '--lower-limit 0 '
                             '--title "NET/TOTAL:recv/send(MB/s)" '
                             '--font TITLE:10: Roman.ttf --font AXIS:10: Roman.ttf –font UNIT:10: Roman.ttf --font LEGEND:10: Roman.ttf '
                             'DEF:recvAvgFlow={rrd_relative_file}:recvAvg:AVERAGE '
                             'LINE1:recvAvgFlow#e60000:"recv(MB/s)" '
                             'GPRINT:recvAvgFlow:AVERAGE:"AVERAGE\:%3.1lf" '
                             'GPRINT:recvAvgFlow:MIN:"MIN\:%3.1lf" '
                             'GPRINT:recvAvgFlow:MAX:"MAX\:%3.1lf\\n" '
                             'DEF:sendAvgFlow={rrd_relative_file}:sendAvg:AVERAGE '
                             'LINE1:sendAvgFlow#32cd32:"send(MB/s)" '
                             'GPRINT:sendAvgFlow:AVERAGE:"AVERAGE\:%3.1lf" '
                             'GPRINT:sendAvgFlow:MIN:"MIN\:%3.1lf" '
                             'GPRINT:sendAvgFlow:MAX:"MAX\:%3.1lf\\n" '
                             )

命令說明:
Graph命令至關複雜,但表現裏很強,上面參數指定圖標顯示的時間跨度,縱橫座標標題,圖表是否自動縮放,線條顏色,每一個線條對應從哪裏取數據,且顯示MIN\MAX\AVERAGE圖例說明等等。

注意:
命令中的變量須要根據本身的實際狀況替換,本身開發的程序裏須要執行週期性的數據採集操做得到數據,而後使用update操做將數據寫入rrdtool。按上述命令格式配置,最後的效果以下:

rrdtool-2.png

坑1:
Rrdtool主要被設計應用在linux平臺的,命令參數的分割符就是「:」,但在windows平臺,冒號是盤符標誌,因此,實際應用中須要作轉義或者傳入相對路徑;

坑2:Windows使用Cygwin打包版本的rrdtool,可能會報字體文件缺失,注意下載默認的指定文件並指定。

相關文章
相關標籤/搜索