RRDtool 安裝和使用


一、RRDtool 的功能及使用介紹

定義:RRDtool(Round Robin Database Tool)是一個用來處理定量數據的開源高性能數據庫。

1.RRDtool 的特性

由於 RRDtool 設計的初衷就是為監控開發的,所以與其他的數據庫相比,RRDtool 有以下特性:

  • 有一個強大的繪圖引擎,可以根據數據庫內容,創建 png 格式的圖片。圖 1,圖 2 和圖 3 所示的就是三張通過 rrdtool graph 命令生成的網絡帶寬波形圖。
圖 2. 最近一天的網卡收發速率

圖 1. 最近一小時的網卡收發速率

圖 3. 最近一年的網卡收發速率

圖 2. 最近一天的網卡收發速率

圖 3. 最近一年的網卡收發速率

圖 3. 最近一年的網卡收發速率

  • 是一個基於時間序列的環形數據庫。可以想象一個圓,圓周上有一些均勻分散的點。這些點就是數據存儲的位置。從圓心畫一條到圓周的某個點的箭頭,這個箭頭就是指向當前元素的指針。在當前元素被讀或寫之后,指針就往下一個元素移動。當所有位置都被用過,原來的位置就會被重用。這樣,數據庫永遠不會滿,不需要維護。
  • 可以被配置成存儲當前值與前一個值變化速度,而不是簡單地存儲提供的值。
  • 要求在預定的時間間隔中取得監控數據,如果沒有得到更新的數據,就將該時間段的值設為 UNKNOWN.

2.RRDTool 中的數據處理

RRD 數據庫存儲的值並不一定等於更新時提供的值。這個值是根據數據庫設定對提供的值進行計算得到的。計算過程可以分為三個步驟:

1.根據用戶定義的數據類型對提供的值進行計算,具體計算方法見表 1

數據類型 計算方法
GAUGE 等於提供的值,適用於提供值為速度計、溫度或人數等
COUNTER 當前值與前一個值的變化速度,要求遞增的值,如計數器,里程表等。如果計數器溢出,RRDTool會檢查溢出是32位還是64位,並相應的加上合適的值
DERIVE 當前值與前一個值的變化速度,不要求遞增。除了不進行溢出處理之外,該類型的內部處理機制與COUNTER相同
ABSOLUTE 假定前一個值始終為0,求變化速度。可用來存儲讀取后復位的計數器

 

 

 

 

 

表 1.RRDtool 中的數據類型

1)整形

輸入的時間經常會不在時間間隔的邊界,所以需要根據前后兩個有效的更新進行線性整形。(有效時間是被 heartbeat 設定控制的 )假定你在監視一個增長速度不均勻的計數器,每分鍾檢查一次,在 4:30 是 2,5:30 是 4,那么第 5 分鍾的變化速度為 3。整形后得到的值稱為 PDP(Primary Data Points)。

2)合並

RRDtool 最終會根據設定對 PDP 進行合並,得到 CDP(Consolidated Data Point)。CDP 可以是多個(可以是一個)PDP 的平均值、最小值、最大值以及最近的值。CDP 是 RRD 數據庫中最終存儲的數據。這對於輸出監控數據時是非常有利的。假設每個 PDP 的時間間隔是 1 分鍾,如果你想查看 1 天的數據,而且你不需要查看每一分鍾具體的監控數據,只是想看一下這一個天中每半個小時的監控數據。如果 RRD 中存儲的是 PDP, 在輸出時就需要對當天的 PDP 每 30 個進行合並。合並需要時間,如果你需要合並的數據量更大,如 1 個月或是 1 年,那這個合並的時間會非常長。所以 RRDtool 選擇在數據庫更新時對 PDP 進行合並,保存 CDP。用戶可以根據需要設定如何對 PDP(非 UNKNOWN)進行合並。

合並方式 計算方法
AVERAGE 平均值
MIN 最小值
MAX 最大值
LAST 最近值

 

 

 

 

表 2.PDP 的合並方式

二、RRDTool的安裝

1.通過yum 安裝,rrdtool版本1.3.8

#yum install -y rrdtool 

 

#yum install -y gcc

#yum install -y rrdtool-python

2.安裝最新版本 1.4.7

# wget http://pkgs.repoforge.org/rrdtool/rrdtool-devel-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/rrdtool-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/python-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm

安裝下列輔助工具

#yum install libdbi ruby xorg-x11-fonts-Type1 -y
#yum install perl-Time-HiRes perl-TermReadKey -y


卸載舊版本

# yum erase rrdtool -y

正式安裝

# rpm -Uvh perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm python-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-devel-1.4.7-1.el6.rfx.x86_64.rpm

 

3.RRDTool 的使用

1. 創建 RRD 數據庫

語法:

rrdtool create filename [--start|-b start time] [--step|-s step] [--no-overwrite] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]

參數:

1) create 關鍵字,用於創建一個 RRD 數據庫文件

filename 文件名,擴展名最好是 .rrd

--start|-b start time 第一個記錄的開始時間,默認是當前時間減 10 秒。表示方法為從 1970-01-01 UTC 到指定時間的秒數

--step|-s step 每條記錄的時間間隔,默認為 300 秒

--no-overwrite 不覆蓋同文件名的數據庫文件

2) DS:ds-name:DST:dst arguments

DS 關鍵字,用於定義數據源。一個 RRD 文件可以有多個 DS。

ds-name 數據源名稱,可以是 1 ~ 19 個 [a-zA-Z0-9_] 中的任意字符,一個 RRD 數據庫文件可以有多個數據源。

DST 數據類型。支持的數據類型有:

GAUGE, COUNTER, DERIVE, ABSOLUTE,COMPUTE

DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max

DS:ds-name:COMPUTE:rpn-expression

COMPUTE 存放對其他數據源進行公式計算的結果。

Heartbeat 心跳,兩次數據源更新之間將數據源的數值確定為 UNKNOWN 前所允許的最大秒數。Min:max PDP 的最小值 / 最大值。

3) RRA:CF:cf arguments

RRA 關鍵字,用於定義 RRA(round robin archive) 檔。一個 RRD 數據庫文件有至少一個的 RRA 檔。CDP 就被保存於 RRA 中。

CF 合並方式,可以是 AVERAGE,MIN,MAX,LAST

RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows

xff 定義合並時間間隔內允許的 PDP 為 UNKNOWN 的比例,超過這個比例時,CDP 被置為 UNKNOWN。

steps 定義多少個 PDP 合並一個 CDP。

rows 定義一個 RRA 檔保存有多少條記錄。

demo:#創建一個rrd文件 create_rrd.py

#coding=utf-8

import rrdtool,time

rrdb=rrdtool.create('mysql.rrd','--step','3','--start','1402643365',#數據庫名稱:mysql.rrd;每三秒獲取一次數據;從2014年6月18日15時開始

'DS:mysqlselect:COUNTER:5:0:U',#數據源名稱:mysqlselect,類型是Counter類型(不斷增加的數值;5是heartbeat 0是最小值 U表示最大值,這里表示未知;詳細介紹參考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=864861&page=1

'RRA:AVERAGE:0.5:1:28800',#RRA用於指定數據如何存放

'RRA:AVERAGE:0.5:10:2880',

'RRA:MAX:0.5:10:2880',

'RRA:LAST:0.5:10:2880')

 

2. 更新 RRD 數據庫

語法:

rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--daemon address] [--] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] … ]

參數:

1) update/updatev 關鍵字,用於更新數據庫

updatev 會輸出磁盤上數據庫文件更新后輸出更新信息。由於 updatev 需要直接的磁盤訪問,所有不能與 --daemon 共用。

filename 需要更新的 RRD 數據庫的文件名

2) --template|-t ds-name[:ds-name]...

默認情況下,需要按照數據源定義的順序更新。該參數允許你指定要更新的數據。

3) --daemon address

使用緩存后台程序更新數據庫,而不直接訪問磁盤。

4)N|timestamp:value[:value...]

更新時間及數據。時間格式可以是 N| 時戳;N 表示現在;時戳以自 1970-01-01 以來的秒數來表示。 如果使用負數時間(當前時間之前多長時間),需要使用—與其它選項區分開。用 U 表示數據的值為 UNKNOWN。

at-timestamp@value[:value...]

更新時間也可以使用 AT 風格表示。

環境變量 RRDCACHED_ADDRESS 與 --daemon 選項的作用是一樣的,如果兩者都出現的話,前者優先。

 

demo:#使用rrdtool update更新網卡流量 getselect.sh(這里用到snmp簡單網絡管理協議,具體安裝可以參考:http://www.cnblogs.com/smallcoderhujin/p/3785731.html

while true; do

    SELECT=`snmpget -v 2c -c public [your host ip] ifInOctets.2 | sed -e 's/.*ter32: \(.*\)/\1/'`

    rrdtool update mysql.rrd N:$SELECT

    sleep 3

done

 

3. 讀取數據

語法:

rrdtool fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end|-e end] [--daemon address]

參數:

1) fetch 關鍵字,用於取數據。

2) filename 需要讀取的文件的文件名

3) CF 需要讀取數據的合並方式 (AVERAGE,MIN,MAX,LAST)

4) --resolution|-r resolution (default is the highest resolution)

解析度,也就是你要取數據的時間間隔(單位:秒);rrdfetch 會盡量找到最匹配的 RRA。默認為數據庫文件支持的最高解析度,即時間間隔最短的;如果想取的不是最高解析度的 RRA,假設要取得的是解析度為 x 的 RRA,開始時間和結束時間必須落在期望解析度的邊界點上,即需要滿足以下條件:

a.start 時間和 end 時間都是 x 的倍數

b.start 時間和 end 時間都在 RRA 記錄的時間范圍內。

5) --start|-s start (default end-1day)

開始時間;支持時戳和 AT 風格;默認是 1 天前。

6) --end|-e end (default now)

結束時間;格式與開始時間相同;默認是現在;

7) --daemon address

緩存后台程序地址。如果指定的話,在讀取之前,會發 flush 指令給緩存后台程序將緩存的數據同步到磁盤。

demo:#查詢,查詢2014.6.12 15:50:25至2014.6.12 15:51:25之間的數據

import rrdtool

print rrdtool.fetch('mysql.rrd','AVERAGE','--start','1402645825','--end','1402645885')

 

4.繪圖

demo:#繪圖 graph_rrd.py(需要注意的是數據庫的名稱,數據源名稱需要一致)

#coding=utf-8

import rrdtool

rrdtool.graph('mysql.png','--start','1402645825',

'--title','mysql select',

'--vertical-label','selects/3',

'DEF:select3=mysql.rrd:mysqlselect:AVERAGE:step=3',

'LINE1:select3#FF0000:select',)

 

5.效果圖

效果圖:

 

參考:

http://my.oschina.net/guol/blog/136023

http://freeloda.blog.51cto.com/2033581/1307492

http://bbs.hexun.com/money/post_568_6335152_1_d.html

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=864861&page=1



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM