一、RRDtool 的功能及使用介紹
定義:RRDtool(Round Robin Database Tool)是一個用來處理定量數據的開源高性能數據庫。
1.RRDtool 的特性
由於 RRDtool 設計的初衷就是為監控開發的,所以與其他的數據庫相比,RRDtool 有以下特性:
- 有一個強大的繪圖引擎,可以根據數據庫內容,創建 png 格式的圖片。圖 1,圖 2 和圖 3 所示的就是三張通過 rrdtool graph 命令生成的網絡帶寬波形圖。
圖 1. 最近一小時的網卡收發速率
圖 2. 最近一天的網卡收發速率
圖 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