天天看點

推薦一片關于rrdtool的好文章,寫的很細

大綱

一、MRTG的不足和RRDTool對比

二、RRDTool概述

三、安裝RRDTool

四、RRDTool繪圖步驟

五、rrdtool指令詳解

六、RRDTool繪圖案例

注,實驗環境 CentOS 6.4 x86_64,軟體版本 rrdtool-1.3.8(最新版的是1.4.8)。(說明:本博文的一些圖檔和内容自于開源社群與官方網站并不是所有内容全是原創)

一、MRTG的不足和RRDTool對比

1.MRTG軟體的不足

MRTG監測網絡流量很友善,但是如果需要監測其他的系統性能,比如CPU負載、系統負載、網絡連接配接數等,就不是那麼簡單了。即使實作了這些功能,但管理起來非常麻煩。比如公司有一兩千個被監測點,分布在不同的機房,為了管理友善需要将這些伺服器和網絡裝置分類,這樣的話就需要将這些被監測點放在不同的MRTG配置檔案中,運作多個crontab,甚至還要自己寫HTML頁面對其進行管理。

MRTG畢竟是一套很老的軟體,而且存在許多不足的地方,其作者Tobias Oetiker在1999年就已經開始開發另一套開源軟體RRDTool來代替MRTG。現在RRDTool已經發展得很成熟,在功能MRTG難以與其相提并論。

2.RRDTool與MRTG對比

與MRTG一樣,RRDTool也是由Tobias Oetiker撰寫的開源軟體,但RRDTool并非MRTG的更新版本,兩者有非常大的差別,也可以說RRDTool是将用來取代MRTG的産品。下面是兩個軟體的一些優缺點的對比。

(1).MRTG

優點:

  • 簡單、易上手,基本安裝完了之後隻要修改一下配置檔案即可使用。

缺點:

  • 使用文本式的資料庫,資料不能重複使用。
  • 隻能按日、周、月、年來檢視資料。
  • 由于MRTG本來隻是用來監測網絡的流量,是以隻能存儲兩個DS(Data Source),即存儲流量的輸入和輸出。
  • 每取一次資料即需要繪圖一次,浪費系統資源。
  • 圖像比較模糊。
  • 無使用者、圖像管理功能。
  • 沒有詳細日志系統。
  • 無法詳細了解各流量的構成。
  • 隻能用于TCP/IP網絡,對于SAN網絡流量無能為力。
  • 不能在指令行下工作。

(2).RRDTool

優點:

  • 使用RRD(Round Robin Database)存儲格式,資料等于放在資料庫中,可以友善地調用。比如,将一個RRD檔案中的資料與另一個RRD檔案中的資料相加。
  • 可以定義任意時間段畫圖,可以用半年資料畫一張圖,也可以用半小時内的資料畫一張圖。
  • 能畫任意個DS,多種圖形顯示方式。
  • 資料存儲與繪圖分開,減輕系統負載。
  • 能任意處理RRD檔案中的資料,比如,在浏覽監測中我們需要将資料由Bytes轉化為bits,可以将原始資料乘8。

缺點:

  • RRDTool的作用隻是存儲資料和畫圖,它沒有MRTG中內建的資料采集功能。
  • 在指令行下的使用非常複雜,參數極多。
  • 無使用者、圖像管理功能。

RRDTool官方網站:

http://oss.oetiker.ch/rrdtool/

二、RRDTool概述

1.概述

RRDtool 代表 “Round Robin Database tool” ,作者同時也是 MRTG 軟體的發明人。官方站點位于http://oss.oetiker.ch/rrdtool/ 。 所謂的“Round Robin” 其實是一種存儲資料的方式,使用固定大小的空間來存儲資料,并有一個指針指向最新的資料的位置。我們可以把用于存儲資料的資料庫的空間看成一個圓,上面有很多刻度。這些刻度所在的位置就代表用于存儲資料的地方。所謂指針,可以認為是從圓心指向這些刻度的一條直線。指針會随着資料的讀寫自動移動。要注意的是,這個圓沒有起點和終點,是以指針可以一直移動,而不用擔心到達終點後就無法前進的問題。在一段時間後,當所有的空間都存滿了資料,就又從頭開始存放。這樣整個存儲空間的大小就是一個固定的數值。是以RRDtool 就是使用類似的方式來存放資料的工具, RRDtool 所使用的資料庫檔案的字尾名是'.rrd。如下圖,

推薦一片關于rrdtool的好文章,寫的很細

2.特點

  • 首先 RRDtool 存儲資料,扮演了一個背景工具的角色。但同時 RRDtool 又允許建立圖表,這使得RRDtool看起來又像是前端工具。其他的資料庫隻能存儲資料,不能建立圖表。
  • RRDtool 的每個 rrd 檔案的大小是固定的,而普通的資料庫檔案的大小是随着時間而增加的。
  • 其他資料庫隻是被動的接受資料, RRDtool 可以對收到的資料進行計算,例如前後兩個資料的變化程度(rate of change),并存儲該結果。
  • RRDtool 要求定時擷取資料,其他資料庫則沒有該要求。如果在一個時間間隔内(heartbeat)沒有收到值,則會用 UNKN (unknow)代替,其他資料庫則不會這樣。

三、安裝RRDTool

1.安裝yum源

1 2

[[email protected] ~]

# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[[email protected] ~]

# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

2.同步時間

1

[[email protected] ~]

# ntpdate 202.120.2.101

3.下載下傳rrdtool的RPM包

1

[[email protected] ~]

# wget ftp://195.220.108.108/linux/centos/6.4/os/x86_64/Packages/rrdtool-1.3.8-6.el6.x86_64.rpm

4.yum安裝rrdtool

1

[[email protected] ~]

# yum -y localinstall --nogpgcheck rrdtool-1.3.8-6.el6.x86_64.rpm

5.檢視一下安裝檔案

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

[[email protected] ~]

# rpm -qa | grep rrdtool

rrdtool-1.3.8-6.el6.x86_64

[[email protected] ~]

# rpm -ql rrdtool

/usr/bin/rrdcgi

/usr/bin/rrdtool

#指令行工具

/usr/bin/rrdupdate

/usr/lib64/librrd

.so.4 

#下面是庫檔案

/usr/lib64/librrd

.so.4.0.7

/usr/lib64/librrd_th

.so.4

/usr/lib64/librrd_th

.so.4.0.7

/usr/share/man/man1/bin_dec_hex

.1.gz 

#下面是幫助文檔

/usr/share/man/man1/cdeftutorial

.1.gz

/usr/share/man/man1/rpntutorial

.1.gz

/usr/share/man/man1/rrd-beginners

.1.gz

/usr/share/man/man1/rrdbuild

.1.gz

/usr/share/man/man1/rrdcgi

.1.gz

/usr/share/man/man1/rrdcreate

.1.gz

/usr/share/man/man1/rrddump

.1.gz

/usr/share/man/man1/rrdfetch

.1.gz

/usr/share/man/man1/rrdfirst

.1.gz

/usr/share/man/man1/rrdgraph

.1.gz

/usr/share/man/man1/rrdgraph_data

.1.gz

/usr/share/man/man1/rrdgraph_examples

.1.gz

/usr/share/man/man1/rrdgraph_graph

.1.gz

/usr/share/man/man1/rrdgraph_rpn

.1.gz

/usr/share/man/man1/rrdinfo

.1.gz

/usr/share/man/man1/rrdlast

.1.gz

/usr/share/man/man1/rrdlastupdate

.1.gz

/usr/share/man/man1/rrdresize

.1.gz

/usr/share/man/man1/rrdrestore

.1.gz

/usr/share/man/man1/rrdthreads

.1.gz

/usr/share/man/man1/rrdtool

.1.gz

/usr/share/man/man1/rrdtune

.1.gz

/usr/share/man/man1/rrdtutorial

.1.gz

/usr/share/man/man1/rrdupdate

.1.gz

/usr/share/man/man1/rrdxport

.1.gz

/usr/share/rrdtool

6.檢視一下指令行工具

1 2 3 4 5 6 7 8 9 10

[[email protected] ~]

# rrdtool -h

RRDtool 1.3.8 Copyright 1997-2009 by Tobias Oetiker <[email protected]>

Compiled Aug 21 2010 10:57:18

Usage: rrdtool [options] 

command

command_options

Valid commands: create, update, updatev, graph, graphv, dump, restore,

last, lastupdate, first, info, fetch, tune,

resize, xport

RRDtool is distributed under the Terms of the GNU General

Public License Version 2. (www.gnu.org

/copyleft/gpl

.html)

For 

more

information 

read

the RRD manpages

注,使用 man rrdtool 可以檢視詳細的使用方法。好了,到這裡我們就安裝完成了,下面我們來說一下RRDTool的繪圖步驟。

四、RRDTool繪圖步驟

推薦一片關于rrdtool的好文章,寫的很細

步驟一︰建立RRD檔案,這個檔案說來就是RRDtool的專屬資料庫。RRDtool以自有的格式存放資料。下面會講解!

步驟二︰抓取資料個人覺得是整個RRDtool最困難的一部分,因為RRDtool的資料是要靠自己在建立RRD資料庫時定義出來,不像MRTG内建抓資料功能,但是卻因為如此,可以給RRDtool畫圖的資料彈性也比較大,例如︰snmp查詢結果、系統狀态、網頁中特定資料統計等等。

步驟三︰将抓下來的資料就用rrdtool update的指令進行更新到的RRD資料庫中,讓圖表能畫出最新的流量。

步驟四︰這就是重點啦!通過rrdtool graph的指令來依據RRD資料庫的資料進行繪圖,這也是使用者唯一看的到的東西,若規劃的不好會影響使用者閱讀上的困難!

循環︰由于要完成動态繪圖的圖表,第二步驟到第四步驟必須不斷的重複執行以維持資料的更新,目前知道要達成循環的方法有兩種︰

  • 在Script中使用循環
  • 使用crontab任務計劃

五、rrdtool指令詳解

1.建立RRD資料庫

create 文法

1 2 3 4 5

rrdtool create filename

[--start|-b start 

time

]

[--step|-s step]

DS:ds-name:DST:dst arguments 

#最後擷取的資料是PDP,更新資料時要考濾DS順序(*把所有要更新的資料,按照DS定義的順序用冒号格開*)

RRA:CF:cf arguments 

#最後擷取的資料是CDP,繪圖時使用的是這些資料

參數詳解:

  • 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的資料,繪圖時使用的也是這些資料

下面是RRA與PDP、CDP之間的關系圖,

推薦一片關于rrdtool的好文章,寫的很細

(0).filename

預設是以 .rrd 結尾,但也以随你設定。

(1).--start|-b start time

設定RRD資料庫加入的第一個資料值的時間,從1970-01-01 00:00:00 UTC時間以來的時間(秒)。RRDtool不會接受早于或在指定時刻上的任何數值。預設值是now-10s;如果 update 操作中給出的時間在 –-start 之前,則 RRDtool拒絕接受。--satrt 選項也是可選的。 如果你想指定--start 為1天前,可以用CODE:--start $(date -d '1 days ago' +%s)。注意,--start 選項的值必是 timestamp 的格式。

(2).--step|-s step

指定資料将要被填入RRD資料庫的基本的時間間隔。預設值是300秒;

(3).DS:ds-name:DST:dst arguments DS(Data Source)

DS:DS 用于定義 Data Soure 。也就是用于存放結果的變量名。 DS是用來申明資料源的,也可以了解為申明資料變量,也就是你要檢測的端口對應的變量名,這個參數在畫圖的時候還要使用的。這裡開始定義RRD資料的基本屬性;單個RRD資料庫可以接受來自幾個資料源的輸入。在DS選項中要為每個需要在RRD中存儲的資料源指定一些基本的屬性;ds-name資料域命名;DST定義資料源的類型,dst arguments參數依賴于資料源的類型。

案例:DS:mysql:COUNTER:600:0:100000000

DS(Data Source,資料源)表達式總共有六個欄位:

  • DS 表示這個為DS表達式
  • ds-name 資料域命名
  • DST 定義資料源的類型
  • heartbeat 有效期(heartbeat),案例裡的值為'600',假設要取12:00的資料,而前後300秒裡的值(11:55-12:05)經過平均或是取最大或最小都算是12:00的有效值;
  • min 允許存放的最小值,此例允許最小為0。
  • max 允許存放的最大值,最大為100000000。

注,如果不想設限制可以再第五個欄位和第六個欄位以 "U:U"表示(U即Unknown)。

DST定義資料源的類型。資料源項的後續參數依賴于資料源的類型。對于GAUGE、COUNTER、DERIVE、以及ABSOLUTE,其資料源的格式為: DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max。DST 的選擇是十分重要的,如果選錯了 DST ,即使你的腳本取的資料是對的,放入 RRDtool 後也是錯誤的,更不用提畫出來的圖是否有意義了。

  • GAUGE :GAGUE 和上面三種不同,它沒有“平均”的概念,RRDtool 收到值之後位元組存入 RRA 中。
  • COUNTER :必須是遞增的,除非是計數器溢出。在這種情況下,RRDtool 會自動修改收到的值。例如網絡接口流量、收到的packets 數量都屬于這一類型。
  • DERIVE:和 COUNTER 類似。但可以是遞增,也可以遞減,或者一會增加一會兒減少。
  • ABSOLUTE :ABSOLUTE 比較特殊,它每次都假定前一個interval的值是0,再計算平均值。
  • COMPUTE :COMPUTE 比較特殊,它并不接受輸入,它的定義是一個表達式,能夠引用其他DS并自動計算出某個值。例如CODE:DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:eth0_bytes,8,* 則 eth0_bytes 每得到一個值,eth0_bits 會自動計算出它的值:将 eth0_bytes 的值乘以 8 。不過 COMPUTE 型的 DS 有個限制,隻能應用它所在的 RRD 的 DS ,不能引用其他 RRD 的 DS。 COMPUTE 型 DS 是新版本的 RRDtool 才有的,你也可以用 CDEF 來實作該功能。如:CDEF:eth0_bits=eth0_bytes,8,*

DST 執行個體說明,

Values = 300, 600, 900, 1200

#假設 RRDtool 收到4個值,分别是300,600,900,1200。 

Step = 300 seconds

#step 為 300 

COUNTER = 1,1,1,1

#(300-0)/300,(600-300)/300,(900-600)/300,(1200-900)/300 ,是以結果為 1,1,1,1 

DERIVE = 1,1,1,1 # 同上 

ABSOLUTE = 1,2,3,4

#(300-0)/300,(600-0)/300,(900-0)/300,(1200-0)/300,是以結果為 1,2,3,4 

GAUGE = 300,600,900,1200 # 300 , 600 ,900 ,1200 不做運算,直接存入資料庫。是以第一行的 values 并不是 PDP,後面4行才是PDP。

下面我們來建立一個RRD庫檔案,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

[[email protected] ~]

# rrdtool create eth0.rrd \

> --step 300 \

> DS:eth0_in:COUNTER:600:0:12500000 \

# 600 是 heartbeat;0 是最小值;12500000 表示最大值;

> DS:eth0_out:COUNER:600:0:12500000 \

# 如果沒有最小值/最大值,可以用 U 代替,例如 U:U

> RRA:AVERAGE:0.5:1:600 \

# 1 表示對1個 PDP 取平均。實際上就等于 PDP 的值

> RRA:AVERAGE:0.5:4:600 \

# 4 表示每4個 PDP 合成為一個 CDP,也就是20分鐘。方法是對4個PDP取平均,

> RRA:AVERAGE:0.5:24:600 \ 

# 同上,但改為24個,也就是24*5=120分鐘=2小時。

> RRA:AVERAGE:0.5:288:730

# 同上,但改為288個,也就是 288*5=1440分鐘=1天

[[email protected] ~]

# ll -h eth0.rrd

-rw-r--r--  1 root   root     41K 10月 11 10:16 eth0.rrd

有的人可能會問,上面有兩個 DS,那 RRA 中究竟存的是那個 DS 的資料呢?實際上,這些 RRA 是共用的,你隻需建立一個 RRA,它就可以用于全部的 DS 。是以在定義 RRA 時不需要指定是給那個 DS 用的。

(4).RRA:CF:cf arguments

RRA的作用就是定義更新的資料是如何記錄的。比如我們每5分鐘産生一條重新整理的資料,那麼一個小時就是12條。每天就是288條。這麼龐大的資料量,一定不可能都存下來。肯定有一個合并(consolidate)資料的方式,那麼這個就是RRA的作用了。如下圖,

推薦一片關于rrdtool的好文章,寫的很細

RRD的一個目的是在一個環型資料歸檔中存儲資料。一個歸檔有大量的資料值或者每個已定義的資料源的統計,而且它是在一個RRA行中被定義的。當一個資料進入RRD資料庫時,首先填入到用 -s 選項所定義的步長的時隙中的資料,就成為一個pdp值,稱為首要資料點(Primary Data Point)。該資料也會被用該歸檔的CF歸并函數進行處理。可以把各個PDPs通過某個聚合函數進行歸并的歸并函數有這樣幾種:AVERAGE、MIN、MAX、LAST等。這些歸并函數的RRA指令行格式為:RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows。

什麼是 CF?

以上面的案例中第2個RRA 和 4,2,1,3 這4個 PDP 為例

  • AVERAGE :則結果為 (4+2+1+3)/4=2.5
  • MAX :結果為4個數中的最大值 4
  • MIN :結果為4個數中的最小值1
  • LAST :結果為4個數中的最後一個 3

同理,第三個RRA和第4個RRA則是每24個 PDP、每288個 PDP 合成為1個 CDP。

解釋度(Resolution)

這裡要提到一個 Resolution 的概念,在官方文檔中多處提到 resolution 一詞。Resolution 究竟是什麼?Resolutino 有什麼用?舉個例子,如果我們要繪制1小時的資料,也就是60分鐘,那麼我們可以從第一個RRA 中取出12個 CDP 來繪圖;也可以從第2個 RRA中取出3個 CDP 來繪圖。到底 RRDtool 會使用那個呢?讓我們看一下 RRA 的定義 :RRA:AVERAGE:0.5:4:600 。

Resolution 就等于 4 * step = 4 * 300 = 1200 ,也就是說 ,resolution 是每個CDP 所代表的時間範圍,或者說 RRA 中每個 CDP(記錄)之間的時間間隔。是以第一個 RRA 的 resolution 是 1* step=300,第2是 1200,第三個是 24*300=7200,第4個 RRA 是 86400 。

預設情況下,RRDtool 會自動挑選合适的 resolution 的那個 RRA 的資料來繪圖。我們大可不必關心它。但如果自己想取特定 RRA 的資料,就需要用到它了。關于 Resolution 我們還會在 fetch 和 graph 中提到它。

xff 字段

細心的朋友可能會發現,在 RRA 的定義中有一個數值,固定是 0.5 ,這個到底是什麼東東呢? 

這個稱為 xff 字段,是 xfile factor 的縮寫。讓我們來看它的定義 :

QUOTE:

The xfiles factor defines what part of a consolidation interval may be made up from *UNKNOWN* data while 

the consolidated value is still regarded as known. It is given as the ratio of allowed *UNKNOWN* PDPs to 

the number of PDPs in the interval. Thus, it ranges from 0 to 1 (exclusive)

這個看起來有點頭暈,我們舉個簡單的例子 :例如

CODE:RRA:AVERAGE:0.5:24:600

這個 RRA 中,每24個 PDP (共兩小時)就合成為一個 CDP,如果這 24 個 PDP 中有部分值是 UNKNOWN (原因可以很多),例如1個,那麼這個 CDP合成的結果是否就為 UNKNOWN 呢?

不是的,這要看 xff 字段而定。Xff 字段實際就是一個比例值。0.5 表示一個 CDP 中的所有 PDP 如果超過一半的值為 UNKNOWN ,則該 CDP 的值就被标為UNKNOWN。也就是說,如果24個 PDP中有12個或者超過12個 PDP 的值是 UNKNOWN ,則該 CPD 就無法合成,或者合成的結果為 UNKNOWN;如果是11個 PDP 的值為 UNKNOWN ,則該 CDP 的值等于剩下 13 個 PDP 的平均值。

如果一個 CDP 是有2個 PDP 組成,xff 為 0.5 ,那麼隻要有一個 PDP 為 UNKNOWN ,則該 PDP 所對應的 CDP 的值就是 UNKNOWN 了。

2.抓取資料

簡單說,就是用shell寫個腳本去不斷的收集資料。對于不懂shell編輯的博友可以去網上找點資料學習一下,很簡單的。下面是利用snmp來擷取進入網卡的流量。

1 2

[[email protected] ~]

# snmpget -v 2c -c public 192.168.18.201 ifInOctets.2

IF-MIB::ifInOctets.2 = Counter32: 57266195

上面的例子是使用snmpget來抓取192.168.18.201的網卡輸入流量,-v 2c表示snmp版本号,-c public snmp共同體名稱,192.168.18.201是這台主機的IP位址,ifInOctets.2是指eth0網卡的輸入流量,ifInOctets.1是指lo0網卡的輸入流量。從上面我們可以看出,eth0輸入的流量為57266195。下面我們來截取一下輸入流量,

1 2

[[email protected] ~]

# snmpget -v 2c -c public 192.168.18.201 ifInOctets.2 | sed -e 's/.*ter32: \(.*\)/\1/'

57463513

我們得到的值為57463513,這就是我們要的結果。我們隻要用shell腳本寫個循環就可以收集網卡的輸入流量了,再用rrdtool update指令将收集到的資料更新到RRD資料庫中即可。

當然,您不一定要使用snmpget,也可以使用snmpwalk、tcpdump等等抓取資料回來分析,說誇張點,凡是有變化的資料都可以經過處理變成我們要的資料,然後畫成圖表。

3.更新RRD資料庫資料

update 文法

1 2 3 4

rrdtool update filename [--template|-t ds-name[:dsname]...] N|timestamp:value[:value...]

filename RRD資料庫檔案名稱

--template|-t ds-name[:ds-name] 要更新RRD資料庫中資料源的名稱,其中-t指定資料源的順序

N|timestamp:value[:value...] 時間:要更新的值

案例:

1 2

[[email protected] ~]

#rrdtool update eth0.rrd 1381467942:60723022 或

[[email protected] ~]

# rrdtool update eth0.rrd N:60723022

其中,1381467942是目前的時間戳,可以用date +%s指令獲得,或者直接用N代替。60723022是目前要更新的流量資料,可以用shell腳本獲得。下面我們來檢視一下,更新的資料。

1

[[email protected] ~]

# rrdtool fetch eth0.rrd AVERAGE

4.繪制圖表

使用RRDtool 我們最關心什麼?當然是把資料畫出來了。雖然前面談了很多,但這些都是基礎來的。掌握好了,可以讓你在繪圖時更加得心應手。

graph 文法

1 2 3 4 5 6 7 8 9 10

rrdtool graph filename [option ...]

[data definition ...]

[data calculation ...]

[variable definition ...]

[graph element ...]

[print element ...]

其中的 data definiton、variable definition 、data calculation、分别是下面的格式,

DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<

time

>][:end=<

time

>][:reduce=<CF>]

VDEF:vname=RPN expression

CDEF:vname=RPN expression

其中 filename 就是你想要生成的圖檔檔案的名稱,預設是 png 。你可以通過選項修改圖檔的類型,可以有 PNG、SVG、EPS、PDF四種。

(1).DEF 是 Definition (定義)的意思。定義什麼呢?你要繪圖,總要有資料源吧?DEF 就是告訴 RRDtool 從那個 RRD 中取出指定。

為什麼還有一個 CF 字段?因為 RRA 有多種CF 類型,有些 RRA 可能用來儲存平均值、有些 RRA 可能用于統計最大值、最小值等等。是以你必須同時指定使用什麼 CF 類型的 RRA的資料。

至于 :start 和 :end 、:reduce 則用得比較少,最常用的就是 :step 了,它可以讓你控制 RRDtool 從那個 RRA 中取資料。

(2).VDEF 是 Variable Definition (變量定義)的意思。定義什麼呢?記得 MRTG 在圖表的下面有一個稱之為 Legend 的部分嗎?那裡顯示了1個或者2個 DS (MRTG 沒有 DS 一說,這裡是借用 RRDtool 的)的 “最大值”、“平均值”、“目前值”。 

RRDtool 中用 VDEF 來定義。這個變量專門存放某個 DS 某種類型的值,例如 eth0_in 的最大值、eht0_out 的目前值等。當你需要象MRTG 一樣輸出數字報表(Legend) 時,就可以在 GPRINT 子句(sub clause)中調用它。同樣它也需要用一個變量來存放數值。要注意的是,舊版 的 RRDtool 中是用另外一種格式來達到相同的目的。新版的 RRDtool 則推薦使用VDEF語句。但在使用過程中,卻發現 VDEF 的使用反而造成了困擾。 例如你有5個 DS 要畫,每個 DS 你都想輸出最大值、最小值、平均值 、目前值。 如果使用 VDEF ,則需要 4 * 5 = 20 個 VDEF 語句,這會造成極大的困擾。具體例子可以看第十一節“數字報表”部分。

(3).CDEF 是 Calculation Define 的意思。使用過MRTG 的都會體會到一點,MRTG 的計算能力實在太差了。例如你有兩個 Target ,一個是 eth0_in , 一個是 eth0_out,如果要把它們相加起來,再除以8,得出 bytes 為機關的值,如何計算呢?或者說你隻想看 eth0_in 中超過 10Mb/s 的那部分, 其餘的不關心,又如何實作呢?因為 MRTG 不能對它從 log 取出來的資料進行修改,隻能原原本本的表現,是以很難滿足我們的要求。而使用 CDEF , 這一切都可以很容易的實作。CDEF 支援很多數學運算,甚至還支援簡單的邏輯運算 if-then-else ,可以解決前面提到的第2個問題:如何隻繪制你所關 心的資料。不過這一切都需要熟悉 RPN 的文法.是以我們放到下一節介紹,這一節就介紹把 RRDtool 中的資料以圖表的方式顯示出來。

(4).其它選項分類

本部分我們按照官方文檔的方式,把選項分成幾大類,分為 :

  • Time range : 用于控制圖表的X軸顯示的起始/結束時間,也包括從RRA中提取指定時間的資料。
  • Labels :用于控制 X/Y 軸的說明文字。
  • Size :用于控制圖檔的大小。
  • Limits :用于控制 Y 軸的上下限。
  • Grid :用于控制 X/Y 軸的刻度如何顯示。
  • Miscellaneous :其他選項。例如顯示中文、水印效果等等。
  • Report :數字報表

注,需要說明的是,本博文中并不是列出了所有選項的用法,隻是列出較為常用的選項,如果想檢視所有選項的的用法,可以到官方站點下載下傳文檔。其實大部分選項我們都可以使用預設值不需要修改的。下面是常用選項,

1

rrdtool graph filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]

  • filename 要繪制的圖檔名稱
  • Time 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-limit value] Y軸正值高度[-l|--lower-limit value]Y軸負值高度 [-r|--rigid]
  • Data and variables
  • DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
  • CDEF:vname=RPN expression
  • VDEF:vname=RPN expression

好了,到這裡我們RRDTool指令工具的基本使用,就講解到這裡了更多詳細的内容請參考官方網站。好了,下面我們來示範一個完整的案例。

六、RRDTool繪圖案例

案例:利用RRDTool來繪制mysql伺服器查詢次數的曲線圖。

1.安裝mysql伺服器

1

[[email protected] ~]

# yum install -y mysql-server

2.啟動并測試

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

[[email protected] ~]

# chkconfig mysqld on

[[email protected] ~]

# service mysqld start

初始化 MySQL 資料庫: Installing MySQL system tables...

OK

Filling help tables...

OK

To start mysqld at boot 

time

you have to copy

support-files

/mysql

.server to the right place 

for

your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !

To 

do

so, start the server, 

then

issue the following commands:

/usr/bin/mysqladmin

-u root password 

'new-password'

/usr/bin/mysqladmin

-u root -h node1.

test

.com password 

'new-password'

Alternatively you can run:

/usr/bin/mysql_secure_installation

which

will also give you the option of removing the 

test

databases and anonymous user created by default. This is

strongly recommended 

for

production servers.

See the manual 

for

more

instructions.

You can start the MySQL daemon with:

cd

/usr

/usr/bin/mysqld_safe

&

You can 

test

the MySQL daemon with mysql-

test

-run.pl

cd

/usr/mysql-test

; perl mysql-

test

-run.pl

Please report any problems with the 

/usr/bin/mysqlbug

script!

[确定]

正在啟動 mysqld:                     [确定]

[[email protected] ~]

# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection 

id

is 2

Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and

/or

its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and

/or

its

affiliates. Other names may be trademarks of their respective

owners.

Type 

'help;'

or 

'\h'

for

help. Type 

'\c'

to 

clear

the current input statement.

mysql> show databases;

+--------------------+

| Database      |

+--------------------+

| information_schema |

| mysql       |

test

|

+--------------------+

3 rows 

in

set

(0.00 sec)

mysql>

3.建立RRD資料庫檔案

1 2 3 4 5 6 7 8

[[email protected] ~]

# 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

[[email protected] ~]

# ll -h

總用量 620K

-rw-------. 1 root root 970 8月 17 18:50 anaconda-ks.cfg

-rw-r--r--. 1 root root 16K 8月 17 18:50 

install

.log

-rw-r--r--. 1 root root 4.1K 8月 17 18:48 

install

.log.syslog

-rw-r--r-- 1 root root 294K 10月 11 15:57 mysql.rrd

-rw-r--r-- 1 root root 294K 10月 10 21:53 rrdtool-1.3.8-6.el6.x86_64.rpm

4.抓取資料

1 2

[[email protected] ~]

# mysql --batch -e "show global status like 'com_select'" | awk '/Com_select/{print $2}'

5

5.更新RRD資料庫

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

[[email protected] ~]

# vim getselect.sh

#!/bin/bash

#

while

true

do

SELECT=`mysql --batch -e 

"show global status like 'com_select'"

awk

'/Com_select/{print $2}'

`

rrdtool update mysql.rrd N:$SELECT

sleep

3

done

[[email protected] ~]

# bash -n getselect.sh

[[email protected] ~]

# bash -x getselect.sh

true

++ mysql --batch -e 

'show global status like '

\

''

com_select

'\''

'

++ 

awk

'/Com_select/{print $2}'

+ SELECT=10

+ rrdtool update mysql.rrd N:10

sleep

3

true

++ 

awk

'/Com_select/{print $2}'

++ mysql --batch -e 

'show global status like '

\

''

com_select

'\''

'

+ SELECT=11

+ rrdtool update mysql.rrd N:11

sleep

3

true

++ mysql --batch -e 

'show global status like '

\

''

com_select

'\''

'

++ 

awk

'/Com_select/{print $2}'

+ SELECT=12

+ rrdtool update mysql.rrd N:12

注,讓這個腳本一直執行着。

6.建立一個測試資料庫

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

[[email protected] ~]

# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection 

id

is 55

Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and

/or

its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and

/or

its

affiliates. Other names may be trademarks of their respective

owners.

Type 

'help;'

or 

'\h'

for

help. Type 

'\c'

to 

clear

the current input statement.

mysql> create database testdb;

Query OK, 1 row affected (0.01 sec)

mysql> use testdb;

Database changed

mysql> create table tb1 (

id

int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name char(50) NOT NULL);

Query OK, 0 rows affected (0.02 sec)

mysql> show tables;

+------------------+

| Tables_in_testdb |

+------------------+

| tb1       |

+------------------+

1 row 

in

set

(0.00 sec)

mysql>

7.建立一個腳本不斷的插入資料并查詢

1 2 3 4 5 6 7 8 9 10

[[email protected] ~]

# vim insert.sh

#!/bin/bash

#

for

in

{1..200000}; 

do

mysql -e 

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

mysql -e 

"SELECT * FROM testdb.tb1"

&> 

/dev/null

done

~

[[email protected] ~]

# bash -n insert.sh

[[email protected] ~]

# bash -x insert.sh

8.檢視一下RRD資料庫更新的資料

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

[[email protected] ~]

# rrdtool fetch -r 3 mysql.rrd AVERAGE

1381478757: -nan

1381478760: -nan

1381478763: -nan

1381478766: -nan

1381478769: -nan

1381478772: -nan

1381478775: 2.7153386392e-01

1381478778: 3.2831536999e-01

1381478781: 3.2891623754e-01

1381478784: 3.2705226490e-01

1381478787: 3.2799497906e-01

1381478790: 3.2750147283e-01

1381478793: 3.2962107218e-01

1381478796: 3.3022497969e-01

1381478799: 3.3027211905e-01

1381478802: 3.3020369194e-01

1381478805: 3.2946024073e-01

1381478808: 3.2988230260e-01

1381478811: 3.2969005472e-01

1381478814: 3.2974230463e-01

1381478817: 3.3001057711e-01

1381478820: 3.3019278582e-01

1381478823: 3.3083777490e-01

1381478826: 3.3015850009e-01

1381478829: 3.2968813815e-01

1381478832: 3.3021007195e-01

1381478835: 3.2890877932e-01

1381478838: 3.2919982365e-01

1381478841: 3.2820752812e-01

1381478844: 3.2498916047e-01

1381478847: 3.2435105446e-01

1381478850: 3.2631508451e-01

1381478853: 3.2927988387e-01

1381478856: 3.3061808059e-01

1381478859: 3.3065099981e-01

1381478862: 3.3079060547e-01

1381478865: 3.2993297013e-01

1381478868: 3.2998088978e-01

1381478871: 3.3045720109e-01

1381478874: 3.3052361682e-01

1381478877: 3.3021445518e-01

1381478880: 3.3033678729e-01

1381478883: 3.3017146110e-01

1381478886: 3.2932443118e-01

1381478889: 3.2872916025e-01

1381478892: 3.2942230122e-01

1381478895: 3.3004157568e-01

1381478898: 3.3035752652e-01

1381478901: 3.3026495130e-01

1381478904: 4.2927608935e-01

1381478907: 5.6199888336e-01

1381478910: 3.2960053815e-01

1381478913: 3.3019513627e-01

1381478916: 3.3008973582e-01

1381478919: 3.3023471404e-01

1381478922: 3.3044897038e-01

1381478925: 3.3025127245e-01

1381478928: 3.2999671137e-01

1381478931: 3.2995130475e-01

1381478934: 3.3001845566e-01

1381478937: 3.3004261932e-01

1381478940: 3.2985954162e-01

1381478943: 3.2962262303e-01

1381478946: 3.3033462847e-01

1381478949: 3.3000997317e-01

1381478952: 3.3023836505e-01

1381478955: 3.2987551061e-01

1381478958: 3.3038940726e-01

1381478961: 3.3047901095e-01

1381478964: 3.2999606597e-01

1381478967: 3.3021352982e-01

1381478970: 3.2998445954e-01

1381478973: 3.3029458891e-01

1381478976: 3.3009257605e-01

1381478979: 3.3008453893e-01

1381478982: 3.2998650516e-01

1381478985: 3.3014434356e-01

1381478988: 3.2950044395e-01

注,大家可以看到現在已經有很多的資料了,下面我們來簡單的制作一查詢曲線圖。

9.制作查詢曲線圖

1 2

[[email protected] ~]

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

497x174

10.取出mysql.png圖檔并檢視

推薦一片關于rrdtool的好文章,寫的很細
推薦一片關于rrdtool的好文章,寫的很細

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

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