---------------原創內容,轉載請註明出處。------------一、概述RRDtool(round-robin database tool),即輪詢式資料庫工具(註:並不等同於電腦中的輪詢調度演算法),採用固定大小的空間來存儲數據,設定一個指針,隨數據的讀寫移動,指向最後更新的數據的...
---------------原創內容,轉載請註明出處。<[email protected]>------------
一、概述
RRDtool(round-robin database tool),即輪詢式資料庫工具(註:並不等同於電腦中的輪詢調度演算法),採用固定大小的空間來存儲數據,設定一個指針,隨數據的讀寫移動,指向最後更新的數據的位置。
很多資料中都將存儲數據的資料庫空間看做一個圓,這個圓沒有起點也沒有終點,因此只需一個固定大小的空間即可實現數據的持續讀寫。這個空間就是使用 "rrdtool create"命令後創建出的以“.rrd”尾碼結尾的文件。
RRDtool很有特色的一方面在於它不僅可以扮演後臺的角色來存儲數據,同時又給我們提供了豐富的工具來創建出精美的統計圖表,兼任前端的角色。
安裝:
linux一般可以直接使用yum或者apt-get來直接安裝。
$ sudo yum install rrdtool (centos)
$ sudo apt-get install rrdtool (ubuntu)
也可以到官方下載各操作系統(包括windows)的安裝包,或者下載源碼自己編譯。
http://oss.oetiker.ch/rrdtool/download.en.html
二、數據對象
RRDtool針對處理的是時序型數據(time-series data),比如網路帶寬,溫度,CPU負載等等這些和時間相關聯的數據或者說指標。很多優秀的監控系統都採用RRDtool作為DBMS或者作為繪圖工具,比如 Ganglia、MRTG、Xymon、Zenoss、open-falcon等等。可見RRDtool在處理監控指標方面得天獨厚的優勢。
三、RRDtool存儲與歸檔原理
RRDtool存儲數據的方式和常見的關係型資料庫有很大的不同:
- RRDtool的每個rrd文件大小,一經創建便固定,而傳統的關係型資料庫的文件大小則是隨著數據的寫入而逐漸增大的
- RRDtool在接收到數據的同時會進行計算合併,並存儲計算後結果
- RRDtool要求定時更新數據,同時資料庫中對出現“異常”的值使用UNKNOWN代替。
為了實現定時更新,RRDtool規定一個時間間隙(interval),經過interval就會進行資料庫更新,比如上面的圖中的interval就是1min。這個interval在RRDtool中被命名為step,在使用create命令創建rrd文件時,作為一個必須使用的選項來規定rrd資料庫所採用的interval,而且這個值之後不允許再改變。如:
.....(註:此處只是作為演示,並不是一個合法的完整的create命令)
上面的命令第一行比較容易理解(註:實際命令並沒有換行,這裡便於演示使用“\”來分隔),下麵來解釋一下第二行各個參數的含義,
(建議對照man page或者官方文檔http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html,查看完整的命令幫助):
DS(Data Source):定義數據來源,換句話說就是我們要檢測的指標,這裡使用cpu_load(檢測cpu負載)來作為DS的名字。GAUGE是數據源的類型(DST:Data Source Type)
常見的數據源類型:
1、COUNTER 數據必須是遞增的,保存的是相對於前面的一個值
2、GUAGE 保存原值
3、DERIVE 可增可減
4、ABSOLUTE 相對於初始值的數值(也就是參考點唯一)
5、COMPUTE 對於COMPUTE數據源來說格式是DS:ds-name:COMPUTE:rpn-expression
為了便於理解,可以認為它就是我們創建MySQL時定義的一列(當然這非常不准確):
先跳過heartbeat這個參數,來看後兩個參數。min max、顧名思義就是用來規定數據值的合理存儲範圍,對於cpu負載,我將其設置為0~100.對於不確定界限的值,可以使用U來代替。也就是說,如果接收到的數據在這個範圍內,就會被認為是good value,被資料庫接收並插入。否則就會被認為是壞值,作為unknown插入。
最後看heartbeat,對應上面示例命令的120。這個其實是RRDtool收集數據的一種策略,前面提到過RRDtool每經過step長的時間間隙,就會進行一次資料庫更新,並將刷新的值插入到資料庫中,我們稱這個值為(PDP: Primary Data Point).但是這樣的話就會產生問題----如果我在指定的間隙沒有收集到數據,資料庫就會收集不到值,怎麼處理呢?RRDtool中將這一類“壞值”統一作為unknown插入資料庫中,稍微想一下就會知道作為unknown,在統計的時候會更加精確,因為可以直接將這些unknown剔除,而不是不分青紅皂白的將所有的“0”全部剔除(針對於某些將數據壞值處理為0的資料庫)。
unknown的處理就萬無一失了嗎?答案很顯然是否定的,在實際收集數據時,我們很難保證在準確的時間點收集到數據。因此RRDtool提出了heartbeat這樣一個概念,表示一個時間跨度,也就是說,只要在這個時間跨度內,資料庫更新收集到了數據,那麼就可以插入這個值,否則將值作為unknown插入。也就是說在上面的示例命令中,只要在兩分鐘內收集到了數據,就會作為PDP更新到資料庫中。如果超過了heartbeat給定的時間,那麼就作為unknown插入資料庫。
現在在shell中輸入上面這個不完整的命令,來看看shell會給我們返回什麼樣的錯誤信息。
錯誤提示,你必須至少定義一個RRA(Round Robin Archive)。那麼什麼是RRA呢?前面介紹過RRD特殊的存儲方式,我在學習的時候就在想:持續讀寫數據,是如何保證數據的完整性?數據輪詢了一次後,必然會導致新數據對舊數據的覆蓋,那麼又如何來查詢之前收集到但是已經被後來覆蓋的數據呢?----很顯然,RRA就是提供這樣一種功能的歸檔策略,是RRD的核心,可以把它當做關係型資料庫中的視圖來理解。也就是說,我們怎樣來查看數據以及如何將收集到的數據繪成圖表,都是通過對這個RRA("視圖")來定義的。但是從另一方面來講,這應該也算是RRDtool的一種缺陷吧,上面的錯誤消息告訴我們,在創建的時候就必須要至少定義一個RRA,也就是要求我們在創建RRD資料庫的時候就必須事先規定好將來要如何來查詢處理這些數據。
完整的RRDtool create命令:
此時查看當前文件夾,就會看到一個rrd文件,即rrd_intro.rrd:
下麵來介紹RRA部分的命令:
RRA官方文檔定義:An archive consists of a number of data values or statistics for each of the defined data-sources (DS).
也就是說,創建RRA後,RRA就是被DS所共用的,不需要指定DS。同時,這個歸檔文件中包含一系列的數據和統計信息,那麼這些信息是如何得到的呢?
---通過CF(Consolidation Function)整合方法,將數據按照一定的規則歸檔。
合併方法分以下幾種:
1、AVERAGE 平均值
2、MAX 最大值
3、MIN 最小值
4、LAST 當前值
CF參數項有三個,先介紹steps和rows,對應上面命令的最後兩個參數。
前面已經講過PDP的含義,在符合heartbeat策略下收集到的一個值或者unknown,插入到資料庫中,作為PDP。
steps,顧名思義就是定義幾個step,比如上面這條命令的三個RRA分別定義了1、5、15個step,也分別對應了1、 5、 15個PDP,換算成時間就是1、 5、 15分鐘。這是CF的參數,說明這些值是拿來作為CF合併方法的參數的,即這個三個RRA分別使用1 、 5 、15個PDP來求平均值。將此結果作為官方文檔中提到的data value / statistic存入RRA文件,作為我們最終訪問和繪圖的數據。RRDtool定義這個數據即為CDP(Consolidated data point)即整合後的數據。
rows,按照我之前講的,應該比較好理解。我將DS作為關係型數據表中的列,PDP作為DS中的數據,CDP為歸檔後的數據在RRA“視圖中”展示給查詢者。因此最後的視圖中每一行就代表了一個CDP。對照上面的命令,分別統計了60 、 288 、 672 個CDP。換算成時間(60s * steps * rows,/3600 h, /(3600*24) day,)分別為 1小時,1天, 1周。
我這樣設計RRA代表什麼含義呢?這裡再提前介紹一個概念resolution(繪圖直接相關,後面介紹graph的時候會用到):
對應上面的命令:
1 h – 1min resolution
1 day – 5min resolution
1 week – 15min resolution
也就是說,我每分鐘統計一次cpu的平均負載,在視圖中給我展現出1小時內的總的統計情況。其他兩個類比即可。
我這裡也是對應一個linux的常用命令uptime。可能最後的resolution並沒有實際的參考價值,但是至少應該理解瞭如何來設置歸檔策略。一般採用逆向思維,也就是先確定總共需要統計的時間,再根據step和steps確定rows。
最後說一下這個xff,這個值是一個比率,如果CF歸檔時採用的PDP中unknown值占總數的比例超過了這個值,就說明這次統計中的壞值過多,RRDtool將這個合併後CDP作為unknown,歸檔到RRA中。一般採用0.5即可。
貼一個圖來表示PDP、CDP、RRA的關係