基本簡介
RRDtool是由TobiasOetiker編寫並由全球各地的許多人貢獻的工具。本篇文檔的作者是AlexvandenBogaerdt主要是幫助你理解RRDtool是什麼,它能夠幫助你作些什麼。RRDtool的文檔對於有些人來說過於技術化。本教程幫助你理解RRDtool的基本概念。它為你自學RRDtool的文檔做好準備。本文檔還重點介紹了網路統計方面的知識。數據類型
可以適合時間序列的數據。在與MRTG合用時。(下一節會給出更詳細的介紹)。下面的例子是關於SNMP的,SNMP是簡單網路管理協定的縮寫。簡單是指協定簡單——並不表示管理或監視網路簡單。讀完本篇文檔後,你應當能夠對人們談論的SNMP的東西有更多的理解。
套用介紹
很可能你會從使用RRDtool來存儲和處理通過SNMP收集到的數據開始。你最需要一個度量數據,以及能夠提供這些數據給RRDtool的感應器就可以了。這些PNG圖像依賴於你收集的數據,它可以是網路平均使用率、峰值。
1、RRDtool是什麼東西?
RRDtool是指RoundRobinDatabase工具(環狀資料庫)。Roundrobin是一種處理定量數據、以及當前元素指針的技術。想像一個周邊標有點的圓環--這些點就是時間存儲的位置。從圓心畫一條到圓周的某個點的箭頭--這就是指針。就像我們在一個圓環上一樣,沒有起點和終點,你可以一直往下走下去。過來一段時間,所有可用的位置都會被用過,該循環過程會自動重用原來的位置。這樣,數據集不會增大,並且不需要維護。RRDtool處理RRD資料庫。它用向RRD資料庫存儲數據、從RRD資料庫中提取數據。
2、RRD中可以存放什麼樣的數據?
可以適合時間序列的數據。就是說你必須能夠在時間的幾個點上度量某些值,並提供這些信息給RRDtool。如果你能夠做到這一點,RRDtool就能夠存儲它們。這些數值必須是數字,但是不一定要是整數,在與MRTG合用時。(下一節會給出更詳細的介紹)。
下面的例子是關於SNMP的,SNMP是簡單網路管理協定的縮寫。簡單是指協定簡單--並不表示管理或監視網路簡單。讀完本篇文檔後,你應當能夠對人們談論的SNMP的東西有更多的理解。現在,只要知道SNMP可以用來查詢設備中保持的計數器的值就可以了。我們要存放到RRD資料庫中的正是這些計數器中的數值。
3、RRDtool可以用來乾什麼?
RRDtool源自MRTG(多路由器流量繪圖器)。MRTG是由一個大學連線到網際網路鏈路的使用率的小腳本開始的。MRTG後來被當作繪製其他數據源的工具使用,包括溫度、速度、電壓、輸出量等等。
很可能你會從使用RRDtool來存儲和處理通過SNMP收集到的數據開始。這些數據很可能是某個網路或計算機接收或傳送的位元組數(比特數)。它也可以用來顯示潮水的波浪、陽光射線、電力消耗、展會的參觀人員、機場附近的噪音等級、你喜歡的度假區的溫度、電冰櫃的溫度、以及任何你可以想像的東西。
你最需要一個度量數據,以及能夠提供這些數據給RRDtool的感應器就可以了。RRDtool會讓你創建資料庫、存儲數據、提取數據、創建用於在Web瀏覽器中顯示的PNG格式的圖像。這些PNG圖像以來於你收集的數據,它可以是網路平均使用率、峰值。
4、問題探討
首先:再讀一遍!你可能漏了某些地方。如果你無法編譯原始碼,而且你的作業系統相當普遍,很可能不是RRDtool的錯誤。網際網路上有已經編譯好的版本。如果來自可信賴的網站,就下載一個。
另一種情況是程式能夠工作,但是沒有得到預期的結果,可能是配置方面的問題。檢查你的配置,與後面例子的配置比較一下。
RRDtool有一個郵件列表及其歸檔。讀一下幾周的列表並搜尋歸檔。沒有搜尋過歸檔就提問是很粗魯的做法:你遇到的問題可能已經由其他人解決了!儘管不是全部,大多數問題都會這樣,郵件列表不是經濟為了某個參與者服務的。看看RRDtool的文檔了解郵件列表的位置和使用方法。
我建議你馬上就花點時間訂閱郵件列表,只要傳送一封主題為subscribe的郵件到[email protected]就可以了。如果要退定該郵件列表,只需要傳送主題為unsubscribe到同樣的地址即可。
學習實例
1、第一個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秒內完成。我們的速度是1200米/300秒,或者說是40米/秒。
我們可以用公里/小時來計算速度:12乘以5分鐘就是一個小時,因此我們必須把12公里乘以12得到144公里/小時。對於和我一樣說英語的朋友來說,就是90英里/小時,因此不要在家裡或我生活的地方嘗試這個速度:)記住:這些數值都僅僅是平均值。如果無法從數字中得到你是否以固定的速度在行駛。本教程後面有一個例子說明這個問題。我希望你理解在計算米/秒或者比特/秒。唯一的差別在於收集數據的方式。即使是K這個單位也是一樣的,因為在網路術語中,K同樣表示1000。
我們現在要創建一個資料庫,在此資料庫中我們能夠保存所有這些有趣的數字。啟動這個程式的方法可能在各個作業系統上各不相同,但是我假設你可以搞清楚它是否與你的作業系統不同,鍵入下面的行作為一個長長的行(為了可讀性,我得把他分成幾行)並且用\來分割。
rrdtoolcreatetest.rrd\
--start920804400\
DS:speed:COUNTER:600:U:U\
RRA:AVERAGE:0.5:1:24\
RRA:AVERAGE:0.5:6:10
2、創建了什麼東西?
我們創建的rrd資料庫名為test(test.rrd),它的起始時間是我寫這篇文檔的當天下午,也就是1999年3月7日(該日期轉換成920804400秒)。我們的資料庫存放一個名為’speed’的數據源(DS),它表示一個計數器。該計數器每5分鐘(預設)讀取一次。在同一個資料庫中,保存有2個環狀歸檔(RRA),一個是每次讀取時的平均數據(例如:沒有東西進行平均)並保留24個樣本(24乘以5分鐘是2小時)。另一個RRA有6個平均值(半小時)並包含10個這樣的平均值(例如5個小時)。
RRDtool使用來源於UNIX世界的特殊時間戳。該時間戳是自1979年1月1日UTC時間開始到當前逝去的秒數。該時間戳的值被轉換成本地時間,它在不同的時區會不一樣。
可能你不是和我在地球的同一個地方。這就是說時區不同。在所有的例子中,我所說的時間當中,小時可能對你來說是錯誤的。這對這些例子中的結果有一點影響,在閱讀時,只需要修正時間中的小時即可。例如:我看到12:05的話,在英國的傢伙看到的時間就是11:05。
現在我們得向資料庫中填入一些數字。我們希望讀到以下數據:
12:0512345KM
12:1012357KM
12:1512363KM
12:2012363KM
12:2512363KM
12:3012373KM
12:3512383KM
12:4012393KM
12:4512399KM
12:5012405KM
12:5512411KM
13:0012415KM
13:0512420KM
13:1012422KM
13:1512423KM
我們用下面的命令把上述數據填入資料庫:
rrdtoolupdatetest.rrd920804700:12345920805000:12357920805300:12363rrdtoolupdatetest.rrd920805600:12363920805900:12363920806200:12373rrdtoolupdatetest.rrd920806500:12383920806800:12393920807100:12399rrdtoolupdatetest.rrd920807400:12405920807700:12411920808000:12415rrdtoolupdatetest.rrd920808300:12420920808600:12422920808900:12423正如你說看到的那樣,可以在一個命令里向資料庫中填入多個值。為了可讀性,我得只用三個數據,實際一行里運行的最大數據與作業系統相關。
我們可以使用rrdtoolfetch命令從資料庫中提取數據。
rdtoolfetchtest.rrdAVERAGE--start920804400--end920809200該命令會返回如下輸出結果:
speed
920804700:nan
920805000:4.0000000000e-02
920805300:2.0000000000e-02
920805600:0.0000000000e00
920805900:0.0000000000e00
920806200:3.3333333333e-02
920806500:3.3333333333e-02
920806800:3.3333333333e-02
920807100:2.0000000000e-02
920807400:2.0000000000e-02
920807700:2.0000000000e-02
920808000:1.3333333333e-02
920808300:1.6666666667e-02
920808600:6.6666666667e-03
920808900:3.3333333333e-03
920809200:nan
如果不是像上面的輸出結果,可能哪裡有錯誤。也許你的作業系統會列印出不同的格式NaN。NaN表示非數字。如果你的作業系統輸出U或UNKN或者其他類似東西都是正常的。如果其他地方錯誤,可能是因為你的過程中的那些步驟出錯了(當然假設我的教程是完全正確的:-))。這樣的話,刪除資料庫檔案然後再重新嘗試。有時事情就會變化。本例喲難道的數據像0.04而不是4.0000e-02。這些實際上是一樣的數字,只是寫法不同而已。如果rrdtool今後的版本顯示略有不同是輸出也不要大驚小怪。本文檔中的例子對於RRDtool1.2.0版本都是正確的。
3、繪第一張圖
建幾個圖示的時候到了,試試下面的命令:
rrdtoolgraphspeed.png\
--start920804400--end920808000\
DEF:myspeed=test.rrd:speed:AVERAGE\
LINE2:myspeed#FF0000
該命令會創建名為speed.png的圖像檔案,該圖像從12:00開始,到13:00。有一個名為myspeed的變數定義,它使用來自test.rrd資料庫的speedRRA中的數據。繪製的線條是2像素高,表示myspeed變數。顏色是紅色的.
你會注意到圖像的起始不是12:00而是12:05。這是因為在此時間之前的數據不夠計算出平均值。這只會在缺少某些樣本的情況下發生,不會經常發生。
顏色是由紅、綠、藍構成的。對每種顏色成分,你可以用16進制來表示使用多少,其中00表示不包含,FF表示完全包含。白色是由紅、綠、藍組成的:FFFFFF。黑色是全部不包含:000000。
4、用幾種數學方法來繪圖
查看圖像時,你會注意到橫軸下標為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檔案時進行一些計算!
rrdtoolgraphspeed2.png\
--start920804400--end920808000\
--vertical-labelm/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的教程。以及SteveRader的RPN表達式的教程。不過喔首先看我這篇教程吧。
如果我們用1000乘以這些數值,顯示把同樣的數據顯示成公里/小時也是可以的。
要修改米/秒為單位的值:
計算米/小時:value*3′600
計算公里/小時:value/1′000
合起來:value*(3′600/1′000)或者value*3.6
下面我們來創建這個PNG檔案,並加入更多的魔幻功能…rrdtoolgraphspeed3.png\
--start920804400--end920808000\
--vertical-labelkm/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:"Maximumallowed"\
AREA:good#00FF00:"Goodspeed"\
AREA:fast#FF0000:"Toofast"
這個圖像看起來更好。速度用KM/H表示,有一個附加的線條表示最大允許的速度(在我行駛的道路上的最大限速)。我還修改了速度的顯示顏色,把它從線條改為區塊。
5、一個更複雜的圖例
現在計算更加複雜一些。對於在限速內的速度衡量方法是:
檢查公里/小時是否大於100(kmh,100)GT
如果是,返回0,否則返回公里/小時。(((kmh,100)GT),0,kmh)IF對於上述的限速值:
檢查公里/小時是否大於100(kmh,100)GT
如果是,返回公里/小時,否則返回0。(((kmh,100)GT),kmh,0)IF我願意相信RRDtool的繪圖功能能夠處理的數據沒有任何虛擬的限制。我會解釋他們是如何工作的,不過看看下面的PNG圖像:
rrdtoolgraphspeed4.png\
--start920804400--end920808000\
--vertical-labelkm/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:"Maximumallowed"\
AREA:good#00FF00:"Goodspeed"\
AREA:fast#550000:"Toofast"\
STACK:over#FF0000:"Overspeed"主要用處是說明您要取出那個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:"LastUpdated"將在圖上產生該文字,可以用\n等換行符號GPRINTGPRINT:vname:CF:formatvname即DEF中的your_var,而CF看你要輸出的文字是AVERAGE/MAX/MIN/LAST等數值,format如同printf中的格式,EX:GPRINT:telnet:AVERAGE:"%10.0lf\n"意即要輸出這段時間中(-s~-e中,telnet的平均值,%10.0lf則是為了好算位置)。