複製鏈接
請複製以下鏈接發送給好友

rrdtool

鎖定
所謂的“Round Robin” 其實是一種存儲數據的方式,使用固定大小的空間來存儲數據,並有一個指針指向最新的數據的位置。
中文名
rrdtool
外文名
Round Robin Database Tool
類    別
繪圖的引擎
編    寫
Tobias Oetiker

rrdtool引擎工具

RRDtool (Round Robin Database Tool)就是一個強大的繪圖的引擎,很多工具例如MRTG都可以調用rrdtool繪圖。 [1] 
RRDtool是由Tobias Oetiker 編寫並由全球各地的許多人貢獻的工具。本篇文檔的作者是Alex van den Bogaerdt 主要是幫助你理解RRDtool是什麼,它能夠幫助你做些什麼。 RRDtool的文檔對於有些人來説過於技術化。本教程幫助你理解RRDtool的基本概念。它為你自學RRDtool的文檔做好準備。本文檔還重點介紹了網絡統計方面的知識。
你可以一直往下走下去。RRDtool處理RRD數據庫。它向RRD數據庫存儲數據、從RRD數據庫中提取數據。

rrdtool數據類型

可以適合時間序列的數據。在與MRTG合用時。(下一節會給出更詳細的介紹)。
下面的例子是關於SNMP的,SNMP是簡單網絡管理協議的縮寫。簡單是指協議簡單——並不表示管理或監視網絡簡單。讀完本篇文檔後,你應當能夠對人們談論的SNMP的東西有更多的理解。

rrdtool應用

很可能你會從使用RRDtool來存儲和處理通過SNMP收集到的數據開始。
你最需要一個度量數據,以及能夠提供這些數據給RRDtool的感應器就可以了。這些PNG圖像依賴於你收集的數據,它可以是網絡平均使用率、峯值。

rrdtool學習實例

第一個RRD數據庫
在我看來,學習某個東西的最好辦法就是實踐。為什麼不開始呢?我們會創建一個數據庫,放一些數值到它裏面,然後提取這些數據。你的輸出應當與本文檔中的輸出是一樣的。
我們會從一些簡單的入手,然後把汽車與路由器比較,或者將公里和比特、字節數比較。他們都是一樣的:都是某些時段的某些數值。
假設我們有一個向互聯網發送數據和接收數據的設備。該設備保留一個計數器,該計數器在開啓設備時設置為0,並在每傳送一個字節就加1。該計數器可能會有一個最大值。如果該值達到最大時,在加一個字節的計數,該計數器就會再次從0開始。這與世界上的許多計數器都是一樣的,比如車輛上的里程計數器。
關於網絡的討論通常用每秒比特數來衡量,因此我們要習慣這種用法。把一個字節看成是8個比特,並且開始用比特而不是字節來思考問題。不過,計數器仍然用字節數為單位來計量!在SNMP世界裏,大部分的計數器都是32比特的。這就意味着他們計數範圍是0-4294967。我們在例子裏會用到這些數值。該設備在被查詢時,會返回計數器的當前值。我們知道從上次查詢設備開始到的時間,因此我們就知道每秒 平均傳輸了多少字節數。這不難計算。首先用文字來描述,然後計算:
用當前查詢到的計數器值,減去上一次查詢的計數器值
把當前查詢時間和上次查詢時間作上述同樣操作(秒)
將(1)的結果除以(2)的結果,得到的結果就是每秒的字節數。乘以8就得到每秒的比特數(bps)
實例一
你正在開車。12:05時你看了一下儀表盤上的里程計數器,它顯示這倆車已經行駛了12345公里。12:10分時,你有看了一下里程計數器,它顯示 12357公里。這表示你在5分鐘內行駛了12公里。科技人員會把它轉換成米/秒,這樣可以更好的進行比較(每5分鐘的字節數)和(每秒比特數)。
我們行駛了12公里,也就是12000米。我們在5分鐘內,或者説是300秒內完成。我們的速度是12000米/300秒,或者説是40米/秒。
我們可以用公里/小時來計算速度:12乘以5分鐘就是一個小時,因此我們必須把12公里乘以12得到144公里/小時。對於和我一樣説英語的朋友來説,就是90英里/小時,因此不要在家裏或我生活的地方嘗試這個速度。
RRDtool生成的內存監控圖 RRDtool生成的內存監控圖
記住:這些數值都僅僅是平均值。如果無法從數字中得到你是否以固定的速度在行駛。本教程後面有一個例子説明這個問題。我希望你理解在計算米/秒或者比特/秒。唯一的差別在於收集數據的方式。即使是K這個單位也是一樣的,因為在網絡術語中,K同樣表示1000。
我們要創建一個數據庫,在此數據庫中我們能夠保存所有這些有趣的數字。啓動這個程序的方法可能在各個操作系統上各不相同,但是我假設你可以搞清楚它是否與你的操作系統不同,鍵入下面的行作為一個長長的行(為了可讀性,我得把他分成幾行)並且用 \ 來分割。
rrdtool create test.rrd \
--start 920804400 \
DS:speed:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:24 \
RRA:AVERAGE:0.5:6:10
創建內容
我們創建的rrd數據庫名為test (test.rrd),它的起始時間是我寫這篇文檔的當天下午,也就是1999年3月7日(該日期轉換成920804400秒)。我們的數據庫存放一個名為 ’speed’ 的數據源(DS),它表示一個計數器。該計數器每5分鐘(缺省)讀取一次。在同一個數據庫中,保存有2個環狀歸檔(RRA),一個是每次讀取時的平均數據(例如:沒有東西進行平均)並保留24個樣本(24乘以5分鐘是2小時)。另一個RRA有6個平均值(半小時)幷包含10個這樣的平均值(例如5個小時)。
RRDtool使用來源於UNIX世界的特殊時間戳。該時間戳是自1970年1月1日UTC時間開始到當前逝去的秒數。該時間戳的值被轉換成本地時間,它在不同的時區會不一樣。
可能你不是和我在地球的同一個地方。這就是説時區不同。在所有的例子中,我所説的時間當中,小時可能對你來説是錯誤的。這對這些例子中的結果有一點影響,在閲讀時,只需要修正時間中的小時即可。例如:我看到 12:05 的話,在英國的傢伙看到的時間就是 11:05 。
如果不是像上面的輸出結果,可能哪裏有錯誤。也許你的操作系統會打印出不同的格式 NaN 。 NaN 表示 非數字 。 如果你的操作系統輸出 U 或UNKN或者其他類似東西都是正常的。如果其他地方錯誤,可能是因為你的過程中的那些步驟出錯了(當然假設我的教程是完全正確的)。這樣的話,刪除數據庫文件然後再重新嘗試。 有時事情就會變化。本例喲難道的數據像 0.04 而不是 4.0000e-02 。這些實際上是一樣的數字,只是寫法不同而已。如果rrdtool今後的版本顯示略有不同是輸出也不要大驚小怪。本文檔中的例子對於RRDtool 1.2.0版本都是正確的。
繪第一張圖
建幾個圖示的時候到了,試試下面的命令:
rrdtool graph speed.png \
--start 920804400 --end 920808000 \
DEF:myspeed=test.rrd:speed:AVERAGE \
LINE2:myspeed#FF0000
#p#分頁標題#e#
該命令會創建名為speed.png的圖像文件,該圖像從12:00開始,到13:00。有一個名為myspeed的變量定義,它使用來自 test.rrd數據庫的 speed RRA中的數據。繪製的線條是2像素高,表示myspeed變量。顏色是紅色的.
你會注意到圖像的起始不是12:00而是12:05。這是因為在此時間之前的數據不夠計算出平均值。這隻會在缺少某些樣本的情況下發生,不會經常發生。
顏色是由紅、綠、藍構成的。對每種顏色成分,你可以用16進制來表示使用多少,其中00表示不包含,FF表示完全包含。白色是由紅、綠、藍組成的:FFFFFF。黑色是全部不包含:000000。
用幾種數學方法來繪圖
查看圖像時,你會注意到橫軸下標為 12:10、12:20、12:30、12:40、12:59。有時某些下標不適合(可能是12:00和13:00)會被忽略掉。
縱軸顯示我們輸入的範圍。下面提供的公里數,以及除以300秒的結果,我們得到非常小的數值。為了更加精確,第一個值是12(12567-12456),除以300後得到0.04,RRDtool顯示時為 40m 表示 40/1000 。 其中的 m 與米、公里、或者毫米都沒有任何關係!RRDtool不知道我們的數據單位,它只處理沒有單位的數據。
如果我們用米來衡量我們的距離,就會是這樣:(12′357′000-12′345′000)/300 = 12′000/300 = 40.
因為許多人都對這樣的數值範圍感覺更好,我們就來修正一下。我們將重新創建數據庫,並存儲正確的數據。但是有更好的辦法:在創建png文件時進行一些計算!
rrdtool graph speed2.png \
--start 920804400 --end 920808000 \
--vertical-label m/s \
DEF:myspeed=test.rrd:speed:AVERAGE \
CDEF:realspeed=myspeed,1000,\* \
LINE2:realspeed#FF0000
注意:不要忘記操作符 * 後面的 。這個反斜杆用來將*從操作系統可能解釋的符號轉義,而不是直接傳遞給rrdtool命令。
在查看PNG文件後,你會注意到 m 不見了。正確的結果就是這樣。同樣,在圖像中加入了一個標註。出了上面提到的幾點外,PNG看起來應當是一樣的。
計算是在CDEF部分中指定的,使用逆波蘭表達式( RPN )表示的。我們要求RRDtool所作的事情是:`取數據源myspeed, 以及數值1000;把他們相乘` 。在此不要被RPN表達式困擾了,後面會詳細介紹。同時,你可能想讀一讀關於CDEF的教程。以及Steve Rader的RPN表達式的教程。不過哦首先看我這篇教程吧。
如果我們用1000乘以這些數值,顯示把同樣的數據顯示成公里/小時也是可以的。
要修改米/秒為單位的值:
計算米/小時: value * 3′600
計算公里/小時: value / 1′000
合起來: value * (3′600/1′000) 或者 value * 3.6
下面我們來創建這個PNG文件,並加入更多的魔幻功能…
rrdtool graph speed3.png \
--start 920804400 --end 920808000 \
--vertical-label km/h \
DEF:myspeed=test.rrd:speed:AVERAGE \
"CDEF:kmh=myspeed,3600,*" \
CDEF:fast=kmh,100,GT,kmh,0,IF \
CDEF:good=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good speed" \
AREA:fast#FF0000:"Too fast"
這個圖像看起來更好。速度用KM/H表示,有一個附加的線條表示最大允許的速度(在我行駛的道路上的最大限速)。我還修改了速度的顯示顏色,把它從線條改為區塊。
一個更復雜的圖例
計算更加複雜一些。對於在限速內的速度衡量方法是:
檢查公里/小時是否大於100 ( kmh,100 ) GT
如果是,返回0,否則返回公里/小時。 ((( kmh,100 ) GT ), 0, kmh) IF
對於上述的限速值:
檢查公里/小時是否大於100 ( kmh,100 ) GT
如果是,返回公里/小時,否則返回0。 ((( kmh,100) GT ), kmh, 0) IF
#p#分頁標題#e#
RRDtool生成的流量圖 RRDtool生成的流量圖
我願意相信RRDtool的繪圖功能能夠處理的數據沒有任何虛擬的限制。我會解釋他們是如何工作的,不過看看下面的PNG圖像:
rrdtool graph speed4.png \
--start 920804400 --end 920808000 \
--vertical-label km/h \
DEF:myspeed=test.rrd:speed:AVERAGE \
"CDEF:kmh=myspeed,3600,*" \
CDEF:fast=kmh,100,GT,100,0,IF \
CDEF:over=kmh,100,GT,kmh,100,-,0,IF \
CDEF:good=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good speed" \
AREA:fast#550000:"Too fast" \
STACK:over#FF0000:"Over speed"
對RRDTool的總結
RRDtool是指Round Robin Database 工具(環狀數據庫)。Round robin是一種處理定量數據、以及當前元素指針的技術。想象一個周邊標有點的圓環--這些點就是時間存儲的位置。從圓心畫一條到圓周的某個點的箭頭--這就是指針。就像我們在一個圓環上一樣,沒有起點和終點,你可以一直走下去。過來一段時間,所有可用的位置都會被用過,該循環過程會自動重用原來的位置。這樣,數據集不會增大,並且不需要維護。我們使用RRDtool來處理RRD數據庫。使用它向RRD數據庫存儲提取數據。
RRD適合存儲時間序列的數據。就是説你必須能夠在時間的幾個點上度量某些值,並提供這些信息給RRDtool。如果你能夠做到這一點,RRDtool就能夠存儲它們。這些數值必須是數字,但是不一定要是整數。
下面的許多例子是關於SNMP的,SNMP是簡單網絡管理協議的縮寫。簡單是指協議簡單--並不表示管理或監視網絡簡單。讀完本篇文檔後,你應當能夠對人們談論的SNMP有更多的理解。只要知道SNMP可以用來查詢設備中保持的計數器的值就可以了。我們要存放到RRD數據庫中的正是這些計數器中的數值。
RRDtool源自MRTG(多路由器流量繪圖器)。MRTG是有一個大學連接到互聯網鏈路的使用率的小腳本開始的。MRTG後來被當作繪製其他數據源的工具使用,包括温度、速度、電壓、輸出量等等。
很可能你會從使用RRDtool來存儲和處理通過SNMP收集到的數據。這些數據很可能是某個網絡或計算機接收或發送的字節數(比特數)。它也可以用來顯示潮水的波浪、陽光射線、電力消耗、展會的參觀人員、機場附近的噪音等級、你喜歡的度假區的温度、電冰箱的温度、以及任何你可以想象的東西。
你最需要一個度量數據,以及能夠提供這些數據給RRDtool的感應器。RRDtool會讓你創建數據庫、存儲數據、提取數據、創建用於在Web瀏覽器中顯示的PNG格式的圖像。這些PNG圖像來於你收集的數據,它可以是網絡平均使用率、峯值等。
首先在此介紹一下常用的RRDtool選項的語法,你可以粗略的讀一下,然後看例子,看完之後在仔細的研讀語法.
1.如何使用rrdtool創建各種類型、特性的RRD環型數據庫。
rrdtool create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:dst arguments] 。net[RRA:CF:cf arguments]
説明:
RRDtool的創建功能能夠設置一個新的RRD數據庫文件。該功能完成所創建的文件全部被預填入 UNKNOWN 數值。
filename
需要創建的RRD的文件名。RRD數據庫文件名應當以 .rrd作為擴展名。儘管RRDtool可以接受任何文件名。
--start|-b start time(default: now - 10s)
設定RRD數據庫加入的第一個數據值的時間-從1970-01-01 UTC時間以來的時間(秒數)。RRDtool不會接受早於或在指定時刻上的任何數值。
--step|-s step(default: 300 seconds)
指定數據將要被填入RRD數據庫的基本的時間間隔(默認是300秒)。
DS:ds-name:DST:dst arguments
單個RRD數據庫可以接受來自幾個數據源的輸入。例如某個指定通訊線路上的進流量和出流量。在DS配置選項中,你必須為每個需要在RRD存儲的數據源指定一些基本的屬性。
ds-name是你要用來從某個RRD中引用的某個特定的數據源。ds-name必須為[a-zA-Z0-9]間的、長度為1-19個字符組成。
DST定義數據源的類型。數據源項的後續參數依賴於數據源的類型。對於GAUGE、COUNTER、DERIVE、以及ABSOLUTE,其數據源的格式為:
DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
對於COMPUTE數據源,其格式為:
DS:ds-name:COMPUTE:rpn-expression
要確定使用哪種數據源類型,請檢查下面的定義。
GAUGE
是像温度計、或者某個房間內的人數、或共享Redhat的值這樣的東西。
COUNTER
是像路由器中 ifInOctets 計數器這樣會持續遞增的計數器。COUNTER數據源假設計算機永遠不會減小,除非計數器溢出。update功能可能導致溢出。計算機是按照每秒的頻率存儲的。當計數器溢出時,RRDtool會檢查該溢出是否會發生在32位或64位邊界,並且相應的把合適的值加入結果中。
DERIVE
存放該數據源從以往到差異線。這對於gauges類型非常有用,它可用來衡量進出某個房間的比率。在derive內部,與COUNTER幾乎是一樣的,但是沒有溢出檢查。因此,如果你的計數器在32或64位不會復位,你應當使用DERIVE或者用一個MIN值為0的混合使用。
關於COUNTER vs DERIVE的説明
如果你不容許偶爾發生的、某個計數器的合法迴繞復位而造成的錯誤,而要用`unknowns‘ 來對錶示所有計數器的合法迴繞和復位,你就要使用min=0的DERIVE類型。否則,使用具有合理max的COUNTER類型,會為所有的合法計數器迴繞返回正確的值。
對於一個步長為5分鐘的32位計數器,計數器迴繞復位的錯誤概率大約為:每1Mbps的最大帶寬發生概率為0.8%.注意這等價於100Mbps接口的80%,因此對於高帶寬接口和32位計數器,最好使用帶有min=0的DERIVE。如果你使用的是64位計數器,只有任何最大值的設定可以避免計數器迴繞的錯誤發生的可能性。
ABSOLUTE
讀取後馬上覆位的計數器。用於易於溢出的快速計數器。因此,不要常規地讀取他們,你需要自每次讀取後確認在下一次溢出前有一個最大的有效時間。該類型的另外一個用途是你需要累積上次更新以來的信息數目。
COMPUTE
用於存放對RRD中的其他數據源進行公式計算的結果。該數據源在更新時不需要提供數值,它是根據rpn-表達式定義的公式從數據源的PDPs中計算出來的PDP(Primary Data Point)。歸併功能會被應用到COMPUTE數據源的PDPs上。在數據庫軟件中,此類數據集用`虛擬‘ 或 ’計算‘ 列表示。
heartbeat心跳定義了在兩次數據源更新之間、在將數據源的數值確定為 UNKNOWN 前所允許的最大秒數。
min和max定義了數據源提供、預期的數值範圍。任何數據源的超過min或max數值範圍的數值,都將被認為是UNKNOWN 。如果你不知道或者不關心mix和max, 將他們設置為 unknown。注意min和max總是值數據源所處理的數值。對於一個流量計數器類型的DS來説,這可以是預期中該設備獲取的數據率。
如果有可用的min/max的值信息,一定要設置min和max屬性。這可以幫助RRDtool在更新時對提供的數據進行健壯檢查。
rpn-expression定義了由同一個RRD庫的其他數據源的計算而來的、某個COMPUTE數據源的PDPs計算公式。這於graph命令的CDEF參數一樣。請參看graph手冊瞭解RPN操作符的列表和説明。對於COMPUTE數據源,不支持以下RPN操作符:COUNT、PREV、TIME、和LTIME。此外,在定義RPN表達式時,COMPUTE數據源只能夠引用在create命令中列出的數據源。這於CDEF的限制是一樣的,CDEF只能夠引用在同一個graph命令中前面定義的DEFs和CDEFs。
RRA:CF:cf arguments
RRD的一個目的是在一個環型數據歸檔中存儲數據。一個歸檔有大量的數據值或者每個已定義的數據源的統計,而且它是在一個RRA行中被定義的。
當一個數據進入RRD數據庫時,首先填入到用 -s 選項所定義的步長的時隙中的數據,就成為一個pdp值-首要數據點(Primary Data Point)。
該數據也會被用該歸檔的CF歸併函數進行處理。可以把各個PDPs通過某個聚合函數進行歸併的歸併函數有這樣幾種:AVERAGE、MIN、MAX、LAST等。這些歸併函數的RRA命令行格式為:
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
xff
xfiles factor定義了在被歸併數值仍然是一個未知時,*UNKNOWN*數據中,某個歸併間隔的哪個部分可以採用。
steps
定義這些PDP中的多少個可以用來構建歸併的數據點。
rows
定義在一個RRA歸檔中保留多少次的生成數據值。
例子例 1
rrdtool create temperature.rrd --step 300 \
DS:temp:GAUGE:600:-273:5000 \
RRA:AVERAGE:0.5:1:1200 \
RRA:MIN:0.5:12:2400 \
RRA:MAX:0.5:12:2400 \
RRA:AVERAGE:0.5:12:2400
上例設置了一個名為 temperature.rrd 的RRD,它每300秒接收一個温度值。如果超過600秒沒有提供數據,温度值變為*UNKNOWN*。其最小可接受的值為 -273,最高值為5000.
本例中同時還定義了幾個歸檔區。第一個RRA歸檔區存儲100小時內的温度(1200*300秒=100小時)。第二個RRA存儲每小時的最低温度(12*300秒=1小時),共存儲100天的數據(2400小時)。第三和第四個RRA分別存放最高温度和平均温度。
例 2
rrdtool create proxy.rrd --step 300 \
DS:Total:DERIVE:1800:0:U \
DS:Duration:DERIVE:1800:0:U \
RRA:AVERAGE:0.5:1:2016
本例是監視一個Web代理每300秒間隔(5分鐘)內處理的請求的平均請求數。此例中,該代理有兩個計數器,啓動後處理的請求總數、以及處理請求的合計累積數。顯然這些計數器都有某個迴繞點,但是使用DERIVE數據源類型同時還可以處理在Web代理停止和重啓時的復位。
在該RRD數據庫中,存儲的第一個數據源類型是間隔期內的每秒請求數。第二個數據源類型是在除以300的間隔期內的請求處理總數。
2.rrd環型數據庫的更新:
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] ...]
filename :要更新的RRD數據庫的名稱。
--template|-t ds-name[:ds-name]... :-t ds-name要更新RRD數據庫中數據源的名稱
N|timestamp:value[:value...]:時間:要更新的值...
代碼:
$>timestamp=`date -d "2003/08/15 12:00" +%s`
3.如何繪製rrd環型數據庫中的採集到的數據
rrdtool graph filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]
filename 要繪製的圖片名稱
Time range時間範圍
[-s|--start time] 啓始時間[-e|--end time]結束時間 [-S|--step seconds]步長
Labels
[-t|--title string]圖片的標題 [-v|--vertical-label string] Y軸説明
Size
[-w|--width pixels] 顯示區的寬度[-h|--height pixels]顯示區的高度 [-j|--only-graph]
Limits
[-u|--upper-limit value] Y軸正值高度[-l|--lower-limit value]Y軸負值高度 [-r|--rigid]
Data and variables
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
CDEF:vname=RPN expression
VDEF:vname=RPN expression
主要用處是説明您要取出那個RRD檔案的 DSN 到這個 graph 的參數中來 CDEF 通過運算得到一個虛擬的變量,,其運算式需寫成後序 EX: a=1+3 寫成 a=1,3 + LINE{1|2|3}:vname[#rrggbb[:legend]] LINE1:your_var#rgb顏色值:圖例説明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中, AREA:vname[#rrggbb[:legend]] AREA 畫出樣本數值至 0 之間的區塊圖 STACK:vname[#rrggbb[:legend]] STACK 疊在上一個值上的圖形 請注意,如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值, 再畫小的值,這才會有層次的效果,不然,最大的數據若最後畫,會蓋住前面的數據 COMMENT 説明文字,如 COMMENT:"Last Updated" 將在圖上產生該文字,可以用 \n 等換行符號 GPRINT GPRINT:vname:CF:format vname 即DEF 中的 your_var,而 CF 看你要輸出的文字是 AVERAGE/MAX/MIN/LAST 等數值,format 如同 printf 中的格式, EX: GPRINT:telnet:AVERAGE:"%10.0lf \n" 意即要輸出這段時間中(-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置)。
參考資料