天天看點

rrdtool學習和自定義腳本繪制圖形備忘

        RRDtool (Round Robin Database Tool)就是一個強大的繪圖的引擎,很多工具例如MRTG都可以調用rrdtool繪圖。包括現在使用很多的cacti也是基于rrdtool的基礎上畫圖的,可以說cacti隻是提供一個顯示圖形的web頁面。

        rrdtool:所謂的round robin指的就是一種環形資料庫:資料的存儲方式是一個圓環形式存儲的,我們可以自己去定義,資料能夠存放多久,給它多大的空間。當我們的空間填滿之後,後面的資料又可以覆寫前面的資料。是以rrdtool資料庫是不會增大的。(但是我們也要明白一個道理。既然資料填滿之後會覆寫,那麼我們多給它定義就好了):建立資料庫一般名稱我們都定義為 .rrd的字尾檔案。(如下圖所示:)

<a href="http://s3.51cto.com/wyfs02/M01/54/70/wKioL1SCqYrDwzDuAABN5_fZ8No588.jpg" target="_blank"></a>

主要了解的概念:用一張圖說明:

<a href="http://s3.51cto.com/wyfs02/M00/54/70/wKioL1SCszjThxzIAADH8erG7aw005.jpg" target="_blank"></a>

DS:DS 用于定義 Data Soure 。也就是用于存放結果的變量名。DS是用來申明資料源的,也可以了解為申明資料變量,也就是你要檢測的端口對應的變量名,這個參數在畫圖的時候還要使用的。

DST:DST 就是DS的類型。有 COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5種。由于網卡流量屬于計數器型,是以這裡應該為 COUNTER 。

RRA:RRA 用于指定資料如何存放。我們可以把一個RRA 看成一個表,各儲存不同 interval 的統計結果。RRA的作用就是定義更新的資料是如何記錄的。比如我們每5分鐘産生一條重新整理的資料,那麼一個小時就是12條。每天就是288條。這麼龐大的 資料量,一定不可能都存下來。肯定有一個合并(consolidate)資料的方式,那麼這個就是RRA的作用了。

PDP:Primary Data Point 。正常情況下每個 interval RRDtool 都會收到一個值;RRDtool 在收到腳本給來的值後會計算出另外一個值(例如平均值),這個 值就是 PDP ;這個值代表的一般是“xxx/秒”的含義。注意,該值不一定等于RRDtool 收到的那個值。除非是GAUGE ,可以看下面的例子就知道了

CF:CF 就是 Consolidation Function 的縮寫。也就是合并(統計)功能。有 AVERAGE、MAX、MIN、LAST 四種分别表示對多個PDP 進行取平均、取最大值、取最小值、取目前值四種類型。具體作用等到 update 操作時再說。

CDP:Consolidation Data Point 。RRDtool 使用多個 PDP 合并為(計算出)一個 CDP。也就是執行上面 的CF 操作後的結果。這個值就是存入 RRA的資料,繪圖時使用的也是這些資料

繪圖思路:

1、建立資料庫:

2、抓取資料流量

3、更新rrdtool資料庫

4、繪制圖形

定義一個監控mysql通路量,繪制圖形:

1、定義資料庫:

[root@node1 ~] # rrdtool create mysql.rrd --step 3 DS:mysqlselect:COUNTER:5:0:U RRA:AVERAGE:0.5:1:28800 RRA:AVERAGE:0.5:10:2880 RRA:MAX:0.5:10:2880 RRA:LAST:0.5:10:2880

注釋:DS:資料來源:DST類型為COUNTER:延遲5秒内收到資料有效:最小值:最大值

RRA:合并資料類型:(平均值。最大值,最小值):0.5表示unknow。失效大于0.5的機率的話不生成資料:1(表示一個PDP單元彙總。5表示5個PDP單元彙總平均):28800這裡表示一天算法舉例(一天86400s/3/1 第二個值:86400/3*10)

然後目前目錄下就生成了:mysql.rrd檔案:

<a href="http://s3.51cto.com/wyfs02/M01/54/70/wKioL1SCtzHhB0gbAABurWOTUNY386.jpg" target="_blank"></a>

2、定義收集資料:

(1)定義一個手機Mysql資料并發量的腳步(死循環):

SELECT=`mysql --batch -e "show global status like 'Com_select' "| awk '/Com_select/{print $2}'`

這裡指令是在shell模式下。檢視Mysql并發量(資料庫密碼為空):

第二:rrdtool update mysql.rrd N:$SELECT (更新mysql.rrd資料庫,N表示目前時間。$SELECT擷取并發個數)

(2)這裡為了資料更明顯的現實,在寫一條死循環腳步。往中間不斷的插入資料(前面已經建立好了資料庫testdb和表tb1。tb1定義兩個字段分别為ID和NAME。ID 字段注意制定自動增長):

[root@node1 ~] # vim insert.sh

#!/bin/bash

#

for I in {1..200000}; do

     mysql -e "INSERT INTO testdb.tb1(name) VALUES ('stu$I')"

     mysql -e "SELECT * FROM testdb.tb1" &amp;&gt; /dev/null

done

注釋:腳步不斷的裡面插入資料,和查詢,這樣并發就高了。

(3)分别執行腳本: bash -x getselect.sh  和bash -x insert.sh (觀察是否有報錯,有的話檢查腳本,腳本運作不能中斷,分别開三個視窗執行。到這一步資料的更新已經完成了,接下來就是繪制圖形了:

3、繪制圖形:

rrdtool fetch -r 3 mysql.rrd AVERAGE  #檢視是否手機到資料:

可以看到已經收集到了資料: -nan表示沒有資料:有數值的表示收到了資料:

接下來就可以繪制圖形:我們就從有資料的時間開始收集資料。比如:1417853451

開始繪圖:

[root@localhost rrd]# rrdtool graph mysql1.png -s 1417853451  -t "mysql select" -v "selects/3" DEF:select3=mysql.rrd:mysqlselect:AVERAGE:step=3 LINE1:select3#FF0000:"select"

497x174

[root@localhost rrd]# 

注釋:-s表示繪制開始時間。預設是10s之前.也可以-N指定目前時間。 -t 表示圖檔的擡頭: -v 表示X軸的名稱: DEF(繪制圖形的方法):select3變量=mysql.rrd:mysqlselect:AVERAGE(繪制類型也可以表示MAX和LAST目前值):step=3(解析度,表示每3s手機彙總圖像) LINE1(制定圖像繪制類型):select3#ff0000(線條顔色)

可以看到目前目錄下面生成了。myslq1.png的圖檔。把圖檔拉到windows電腦上,現實如下所示:

<a href="http://s3.51cto.com/wyfs02/M02/54/70/wKioL1SCvbWS9ieVAAEAdEkPuc8739.jpg" target="_blank"></a>

出圖已經完成,要是定期手機資料,可以用snmpd協定手機用戶端的資料。然後生成,最後用一個簡單的web靜态網頁生成圖形;

1、生成庫:

[root@node1 ~] # rrdtool create nginx.rrd --step 3 DS:mysqlselect:COUNTER:5:0:U RRA:AVERAGE:0.5:1:28800 RRA:AVERAGE:0.5:10:2880 RRA:MAX:0.5:10:2880 RRA:LAST:0.5:10:2880

擴充:平時我們經常要繪制一些像nginx并發量連接配接的資料:我們可以這樣寫一條腳本:

2、#!/bin/bash

while true ; do 

   EST=`netstat -anp | grep EST | grep php-fpm | wc -l`

   rrdtool update nginx.rrd N:$EST

rrdtool graph nginx.png -s 1417853451  -t "nginx select" -v "selects/3" DEF:select3=nginx.rrd:mysqlselect:AVERAGE:step=3 LINE1:select3#FF0000:"select"

到這裡監控并發量已經完成,這裡我就不做測試結果,寫這個遇到問題的朋友可以交流一下。

本文轉自 小羅ge11 51CTO部落格,原文連結:http://blog.51cto.com/xiaoluoge/1587075,如需轉載請自行聯系原作者