必威电竞|足球世界杯竞猜平台

rrdtool
來源:互聯網

RRDtool(輪替型資料庫工具)是一種用于處理時間序列數據的工具,如網絡帶寬、溫度或CPU負載。數據存儲在基于環形緩沖區的數據庫中,因此系統存儲占用量隨時間保持恒定。RRDtool還包括用于以圖形格式提取循環資料的工具。它支持多種編程語言的綁定,如PerlPythonRubyTclPHP和Lua。此外,還有一個獨立且完整的Java實現,稱為RRD4j。

基本信息

RRDtool (Round Robin Database Tool)就是一個強大的繪圖的引擎,很多工具例如MRTG都可以調用rrdtool繪圖。

RRDtool是由Tobias Oetiker 編寫并由全球各地的許多人貢獻的工具。本篇文檔的作者是Alex van den Bogaerdt 主要是幫助你理解RRDtool是什么,它能夠幫助你做些什么。 RRDtool的文檔對于有些人來說過于技術化。本教程幫助你理解RRDtool的基本概念。它為你自學RRDtool的文檔做好準備。本文檔還重點介紹了網絡統計方面的知識。

你可以一直往下走下去。RRDtool處理RRD數據庫。它向RRD數據庫存儲數據、從RRD數據庫中提取數據。

數據類型

可以適合時間序列的數據。在與MRTG合用時。(下一節會給出更詳細的介紹)。

下面的例子是關于SNMP的,SNMP是簡單網絡管理協議的縮寫。簡單是指協議簡單——并不表示管理或監視網絡簡單。讀完本篇文檔后,你應當能夠對人們談論的SNMP的東西有更多的理解。

應用

很可能你會從使用RRDtool來存儲和處理通過SNMP收集到的數據開始。

你最需要一個度量數據,以及能夠提供這些數據給RRDtool的感應器就可以了。這些PNG圖像依賴于你收集的數據,它可以是網絡平均使用率、峰值。

學習實例

第一個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英里/小時,因此不要在家里或我生活的地方嘗試這個速度 :)

記住:這些數值都僅僅是平均值。如果無法從數字中得到你是否以固定 的速度在行駛。本教程后面有一個例子說明這個問題。我希望你理解在計算米/秒或者比特/秒。唯一的差別在于收集數據的方式。即使是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:500米口徑球面射電望遠鏡=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的繪圖功能能夠處理的數據沒有任何虛擬的限制。我 會解釋他們是如何工作的,不過看看下面的PNG圖像:

rrdtool graph speed4.png \

--start 920804400 --end 920808000 \

--vertical-label km/h \

DEF:myspeed=test.rrd:speed:AVERAGE \

"CDEF:kmh=myspeed,3600,*" \

CDEF:500米口徑球面射電望遠鏡=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 時間] [--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 時間(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

是像溫度計、或者某個房間內的人數、或共享Red Hat的值這樣的東西。

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、時間、和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 溫度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 要繪制的圖片名稱

時間 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-極限 value] Y軸正值高度[-l|--lower-limit value]Y軸負值高度 [-r|--rigid]

Data and variables

DEF:vname=rrdfile:ds-name:CF[:step=step][:start=時間][: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 則是為了好算位置)。

參考資料 >

生活家百科家居網