RRDtool簡體中文教程 v1.01 – 2

RRDtool簡體中文教程 v1.01 – 2

 

前期規劃

**********************************************************************************************************************
注 :該教程參考瞭如下內容 :
A
)官方文檔 :http://oss.oetiker.ch/rrdtool/doc/index.en.html
B
abel 兄的大作 :http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
               http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者 :ailms <ailms{@}263{dot}net>
版本 :v1
最後修改 :2006/11/18 0:06
**********************************************************************************************************************

可能大家會覺得奇怪,做個 RRDtool 還要規劃什麼?俗話說:磨刀不誤砍柴工。好的規劃必須具備靈活性、可擴展性,否則會給

將來的使用帶來不少的麻煩。我們先談一下 MRTG 的規劃,再談 RRDtool 的規劃。

一)MRTG 的前期規劃

A
想要監測監測什麼對象?並列出一個清單;

B
想要以什麼方法來取得數據?是通過 SNMP 還是 shell perl 。如果使用 SNMP ,監測對象所在主機  

  
SNMP 服務安裝了嗎?是否配置完畢;

C
每個對象的監測時間是多長時間一次?並以此對監測對象進行分類。例如筆者本人共用 MRTG 監測了 80 多個對象,並根據

   
內容分成四類 :

   
重要狀態方面 : 例如 HACMP 的切換動作監控;Oracle 服務的狀態;LVM 中的 vg 是否在線;服務器是否宕機等。這些監

                          
測對象對於一個系統的運行來說都是十分重要的,一旦發生故障,需要立即處理的。所以對於這類對象,按最

                          
小時間間隔(5分鐘一次)設置

   I/O
性能方面 :主要是 I/O 吞吐量、I/O 服務時間方面的監測。這類對象是7分鐘一次

   
次要狀態方面 :例如 cpu利用率、內存利用率、在線人數、溫度、撥號用戶人數等。20分鐘一次

   
利用率方面 : 由於實際應用的問題,所以對利用率比較關心。單獨拎出來做一塊監測。主要是監控Oracle 的各個表空間的利

                       
用率,以及LVM磁盤系統各個分區的利用率。每25分鐘一次

   
監控機本身 :負責監控的監控機本身也需要監控。主要監控當前監測的對象數量,以及系統負荷。這類就30分鐘一次。


D
每個對象一個 cfg 文件?還是全部集中在一個 cfg 文件中呢?我本人還是比較傾向於每個 Target一個 cfg 文件,每個 cfg 中都定

      
WorkdirLanguage 這兩個選項。針對上面的5個分類,建立5大的”cfg 文件,再利用 MRTG 中的   Include 功能導入一個個

      “
小的、具體的 cfg 文件。這樣當日後對某個監測對象進行修改時(例如修改數據的獲取腳本,或者修改圖片的外觀),可以單獨測試

     
該對象。不用連同其他對象也一起跑一次,節省不少時間。如果想取消那個對象的監測,在前面提到的那個大的”cfg 文件中,把對應

      
Include 語句註釋掉就可以了,是不是更方便呢?

E
爲個監控對象起一個合適的名稱。一般用 <host_iterm> 的方式。這一步也滿重要的。一開始不注意,隨便給個名字,等到後來自己都

搞不清楚了,建議一開始就規劃好。如果要使用 MRTG 的告警功能,就更應該好好規劃了,要不然收到告警郵件都不知道是那個對象,那個機

器出現問題,白白浪費時間。

F
是否需要用到 MRTG 的告警功能。MRTG 有告警功能,可以設置輸入/出的最大值,最小值。超過限制就會調用 ThreshProgI ThreshProgO

選項指定的程序。我一般用發送郵件和HTML配合的方式。下面是告警部分的截圖 :




  

差不多也就這些了,就可以開始動手寫 script 了。

二)RRDtool 的前期規劃

RRDtool
的前期規劃相對多一點,因爲 RRDtool 很多東西需要自己設定。除了上述 MRTG 考慮的幾點之外,我一般還考慮以下幾點 :

A
是一個 RRD 文件中包括多個監測對象(DS),還是分成多個 RRD 文件 ?RRDtool 提供了 tune 操作,可以增加監測對象或者刪除 RRD

件中的某個對象,而且繪圖時也可以指定要畫的是那個對象,這點看個人喜歡而定。

B
如何統計取得的數據 :MRTG 是固定的,5分鐘、20分鐘、2小時、1天。RRDtool 則可以自己設置

C
如何保存/統計這些數據 :這是和 MRTG 不同的地方。MRTG log 的建立和維護是自動的,RRDtool 的數據存放

   
則需要自己定義。但我們可以參照 MRTG 的方式:

每日統計圖(5分鐘平均)   600 個,大約2天的時間

每週統計圖(20分鐘平均) : 600 個,大約8天的時間

每月統計圖 (2小時平均) : 600 個,50 天的時間

每年統計圖 (1天平均) :730 個, 2年的時間

D
要以什麼方式繪圖 :MRTG 只有曲線(LINE)和方塊(AREA)兩種;RRDtool 除了這兩種外,還有一種是 STACK 方式。就是在前一個曲線或者方

塊的基礎上繪圖圖,而不是直接從 X 軸開始繪圖。這樣繪製出來的圖比較清晰,不會出現交叉的現象,但此時 Y 軸的值等於當前對象的值加上前一

個繪圖對象的值。例如前一個對象(cpu 的系統進程利用率)的值是10,採用的是 AREA 方式繪圖。當前對象(cpu 的用戶級進程的利用率)是5

採用的是 STACK 方式,則“cpu的用戶級進程利用率對應的Y軸刻度是10+5=15;所以如果不加說明,別人可能會誤解。

三)實際例子

A
搞清楚究竟想要監測什麼對象 :監測本地主機的網絡流量。包括 eth0 lo 接口的流量。

B
想要以什麼方法來取得數據 :sar 也可以統計網卡接口的流量。但這裏我們用 SNMP ,訪問 ifInOctets ifOutOctets

假設腳本名稱是 get_eth0_traffic.sh get_lo_traffic.sh

C
每個對象的監測時間是多長時間一次 :5分鐘

D
是採用一個 RRD 文件還是多個 :2 RRD 文件,一個是 eth0.rrd,一個是 lo.rrd

E
爲每個監測對象起名 :分別是 eth0_in ,eth0_out ,lo_in ,lo_out

F
統計頻率 :5分鐘、20分鐘、2小時、1

G
如何保存統計數據 :600個、600個、600個、730

H
要以什麼方式繪圖 :目前暫不考慮該問題。等到實際繪圖時再體驗。

注 :實際上我們可以把數據的插入、繪圖一起做到 get_eth0_traffic.sh get_lo_traffic.sh 中,但目前這兩個腳本只是負責取數據並輸出而已,

           
到最後我們再把這些功能合併到一起。


四)下面是腳本的內容

[Copy to clipboard]

CODE:

[root@dns1 bob]# cat get_eth0_traffic.sh
#!/bin/bash

#
首先取得 eth0 接口的 ifIndex
index=$(snmpwalk -IR localhost RFC1213-MIB::ifDescr |grep eth0|cut -d '=' -f 1|cut -d '.' -f 2)

#
再通過 snmp 協議取得 ififInOctets ifOutOctets 的值
#
由於在 /etc/snmp.conf 中配置了 defVersion defCommunity ,所以 snmpget 命令不用指定這兩個參數

eth0_in=$(snmpget -IR -Os localhost ifInOctets.${index}|cut -d ':' -f 2|tr -d '[:blank:]')
eth0_out=$(snmpget -IR -Os localhost ifOutOctets.${index}|cut -d ':' -f 2 |tr -d '[:blank:]')
echo $eth0_in
echo $eth0_out

[root@dns1 bob]#



[Copy to clipboard]

CODE:

[root@dns1 bob]# cat get_lo_traffic.sh   
#!/bin/bash
#
首先取得 eth0 接口的 ifIndex

index=$(snmpwalk -IR localhost RFC1213-MIB::ifDescr |grep lo|cut -d '=' -f 1|cut -d '.' -f 2)
lo_in=$(snmpget -IR -Os localhost ifInOctets.${index}|cut -d ':' -f 2|tr -d '[:blank:]')
lo_out=$(snmpget -IR -Os localhost ifOutOctets.${index}|cut -d ':' -f 2 |tr -d '[:blank:]')
echo $lo_in

echo $lo_out
[root@dns1 bob]#


再把這2個腳本放入 crontab 中,每5分鐘執行一次

[Copy to clipboard]

CODE:

*/5 * * * * /home/bob/get_eth0_traffic.sh
*/5 * * * * /home/bob/get_lo_traffic.sh


不過這樣會有討厭的郵件產生,也可以在腳本中用 while true 循環,配合 sleep 300 讓腳本一直運行,而不是重複啓動腳本。具體選擇那樣你自己決定。

當所有的準備工作都完成後,就可以開始考慮建庫了。

建立 RRD 數據庫

**********************************************************************************************************************
注 :該教程參考瞭如下內容 :
A
)官方文檔 :http://oss.oetiker.ch/rrdtool/doc/index.en.html
B
abel 兄的大作 :http://bbs.chinaunix.net/viewthread.php?tid=552224&highlight=rrdtool
http://bbs.chinaunix.net/viewthread.php?tid=552220&highlight=rrdtool
作者 :ailms <ailms{@}263{dot}net>
版本 :v1
最後修改 :2006/11/17 17:35
**********************************************************************************************************************


準備工作都做完了,腳本也寫完了,就可以開始建庫了。建庫實際上就是建立後綴名爲 .rrd RRD 文件。

一)語法格式

[Copy to clipboard]

CODE:

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


其中 filename DS 部分和 RRA 部分是必須的。其他兩個參數可免。

二)參數解釋

A
<filename> 默認是以 .rrd 結尾,但也以隨你設定。

B
--step 就是 RRDtool “期望每隔多長時間就收到一個值。和 MRTG interval 同樣含義。默認是5分鐘。我們的腳本也應該是

     
5分鐘運行一次。

C
--start 給出 RRDtool 的第一個記錄的起始時間。RRDtool 不會接受任何採樣時間小於或者等於指定時間的數據。也就是說 –-start

  
指定了數據庫最早的那個記錄是從什麼時候開始的。如果 update 操作中給出的時間在 –-start 之前,則 RRDtool拒絕接受。--satrt 選項也是
  
  
可選的。按照 我們在前一篇中的設定,則默認是當前時間減去 600*300秒,也就是50個小時前。 如果你想指定--start 1天前,可以用

[Copy to clipboard]

CODE:

--start $(date -d '1 days aog' +%s)


注意,--start 選項的值必須是 timestamp 的格式。

D
DS DS 用於定義 Data Soure 。也就是用於存放腳本的結果的變量名(DSN)

  
就是我們前面提到的 eth0_in ,eth0_out, lo_in , lo_out DSN 1-19 個字符,必須是 0-9,a-z,A-Z

E
DST DST 就是 Data Source Type 的意思。有 COUNTERGUAGEDERIVEABSOLUTECOMPUTE 5種。

            
由於網卡流量屬於計數器型,所以這裏應該爲 COUNTER

F
RRA RRA 用於指定數據如何存放。我們可以把一個RRA 看成一個表,各保存不同 interval 的統計結果

G
PDP Primary Data Point 。正常情況下每個 interval RRDtool 都會收到一個值;RRDtool 在收到腳本給來的值後 會計算出另外

  
一個值(例如平均值),這個 值就是 PDP ;這個值代表的一般是“xxx/的含義。注意,該值不一定等於RRDtool   收到的那個值。除非是
  
   GAUGE
,可以看下面的例子就知道了   

H
CF CF 就是 Consolidation Function 的縮寫。也就是合併(統計)功能。有 AVERAGEMAXMINLAST 四種

  
分別表示對多個PDP 進行取平均、取最大值、取最小值、取當前值四種類型。具體作用等到 update 操作時 再說。

I
CDP Consolidation Data Point RRDtool 使用多個 PDP 合併爲(計算出)一個 CDP。也就是執行上面 的CF 操作後的結果。這個值就是存入 RRA

  
的數據,繪圖時使用的也是這些數據。


三)再說 DST

DST
的選擇是十分重要的,如果選錯了 DST ,即使你的腳本取的數據是對的,放入 RRDtool 後也是錯誤的,更不用提畫出來的圖是否有意義了。

如何選擇 DST 看下面的描述 :

A
COUNTER :必須是遞增的,除非是計數器溢出(overflows)。在這種情況下,RRDtool 會自動修改收到的值。例如網絡接口流量、收到的

       packets
數量都屬於這一類型。

B
DERIVE:和 COUNTER 類似。但可以是遞增,也可以遞減,或者一會增加一會兒減少。

C
ABSOLUTE ABSOLUTE 比較特殊,它每次都假定前一個interval的值是0,再計算平均值。

D
GAUGE GAGUE 和上面三種不同,它沒有平均的概念,RRDtool 收到值之後字節存入 RRA

E
COMPUTE COMPUTE 比較特殊,它並不接受輸入,它的定義是一個表達式,能夠引用其他DS並自動計算出某個值。例如

[Copy to clipboard]

CODE:

DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:bytes,8,*


eth0_bytes 每得到一個值,eth0_bits 會自動計算出它的值:將 eth0_bytes 的值乘以 8 。不過 COMPUTE 型的 DS 有個限制,只能應用
  
  
它所在的 RRD DS ,不能引用其他 RRD DS COMPUTE DS 是新版本的 RRDtool 纔有的,你也可以用 CDEF 來實現該功能。
      
     
F
AVERAGE 類型適合於看平均情況,例如一天的平均流量,。所以 AVERAGE 適用於需要知道 ‘xxx/這樣的需求。但採用 AVERAGE 型時,你並不知道

      
在每個 CDP 中(假設30分鐘平均,6PDP組成)之中,流量具體是如何變化的,什麼時候高,什麼時候低。這於需要用到別的統計類型了

G
MAXIMUM MINIMUM不適用想知道“xxx/這樣的需求,而是適用於想知道某個對象在各個不同時刻的表現的需求,也就是着重點在於各個時間點。

     
也就是所謂的趨勢了,還是上面的例子,如果採用 MAXIMUM 或者 MINIMUM CF ,可以看出接口在每個 CDP 的週期內最高是達到多少,最低又是多

     
少,如果是 AVERAGE 的話,有可能前5 PDP 都很均勻,但最後一個 PDP 的值發生很大的突變。這時候如果用 AVERAGE 可能是看不出來的,因爲突變的部

     
分被平均分配到整個時間段內了,所以看不出突變這一現象;但如果用 MAXIMUM 就可以清楚的知道在該 CDP 的週期內,曾經有達到某個值的時候。所以用

       MAXIMUM
或者 MINIMUM 就可以知道某個對象在某個時間段內最大達到多少,最低低到什麼程度。

      
例如要看某個接口在一天內有沒有超過50Mb 流量的時候就要用 MAXIMUM

  
例如要看磁盤空間的空閒率在一天內有沒有低於 20% 的時候就要用 MINIMUM

    H
LAST 類型適用於累計的概念,例如從xxx時候到目前共累計xxxx 這樣的需求。例如郵件數量,可以用 LAST 來表示 30 分鐘內總共收到多少個郵件,同

     
LAST 也沒有平均的概念,也就是說不適用於 ‘xxx/這樣的需求,例如你不能說平均每秒鐘多少封郵件這樣的說法;同樣也不適用於看每個週期內的變化,

     
例如30分鐘內共收到100封郵件,分別是 :第一個5分鐘20封,第二個5分鐘30封,第三個5分鐘沒有,第45分鐘10封,第55分鐘也沒有,第65分鐘
     
      40
封。如果用 MAXIMUM 或者 MINIMUM 就不知道在30分鐘內共收到100封郵件,而是得出300。所以 LAST 適用於每隔一段時間被觀察 對象就會復位的
     
     
情況。例如每30分鐘就收一次郵件,郵件數量就是 LAST 值,同時現有的新郵件數量就被清零;到下一個30分鐘再收一次郵件,又得到一個 30   分鐘的 LAST 值。
     
     
這樣就可以得得出距離上一次操作後到目前爲止共xxx”的需求。(例如距離上一次收取郵件後又共收到100封新郵件)

四)DST 實例說明

這樣說可能還是比較模糊,可以看下面的例子,體會一下什麼是 DST PDP  

QUOTE:

Values = 300, 600, 900, 1200        # 假設 RRDtool 收到4個值,分別是3006009001200

Step = 300 seconds                    # step
300

COUNTER = 1,1, 1,1                 #
300-0/300,(600-300/300,(900-600/300,(1200-900/300 ,所以結果爲 1111

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

ABSOLUTE = 1,2,3,4                # (300-0)/300,(600-0)/300 , (900-0)/300, (1200-0)/300
,所以結果爲 1234

GAUGE = 300,600,900,1200       # 300 , 600 ,900 ,1200
不做運算,直接存入數據庫


所以第一行的 values 並不是 PDP ,後面4行纔是 PDP


五)開始建庫

[Copy to clipboard]

CODE:

[root@dns1 root]# rrdtool create eth0.rrd /
> --start $(date –d ‘1 days ago’ +%s) /
> --step 300 /
> DS:eth0_in:COUNTER:600:0:12500000 / #   600
heartbeat0 是最小值;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分鐘。方法是對4PDP取平均,
> RRA:AVERAGE:0.5:24:600 /   #
同上,但改爲24個,也就是24*5=120分鐘=2小時。
> RRA:AVERAGE:0.5:288:730 #
同上,但改爲288個,也就是 288*5=1440分鐘=1
[root@dns1 root]#  


注:上面第2-4 RRA的記錄數實際上應該是 700775790,而不是 600600730
600 samples of 5 minutes   (2 days and 2 hours)= 180000
秒 (2.08天)
700 samples of 30 minutes (2 days and 2 hours, plus 12.5 days)= 1260000
秒 (14.58天 ,2周)
775 samples of 2 hours (above + 50 days) = 5580000
秒 (64.58 天,2個月)
797 samples of 1 day    (above + 732 days, rounded up to 797) = 68860800
秒(2年)
可以看出每個 RRA 都存儲了相應單位2倍時間的數據,例如每天的 RRA 存儲2天的數據,每週的 RRA 存儲2周的數據,每月的 RRA 存儲2個月的數據,每年的 RRA 存儲2年的數據



檢查一下結果

[Copy to clipboard]

CODE:

root@dns1 bob]# ll -h eth0.rrd
-rw-r--r-- 1 root     root       41K 11
19 23:16 eth0.rrd
[root@dns1 bob]#


有的人可能會問,上面有兩個 DS,那 RRA 中究竟存的是那個 DS 的數據呢?實際上,這些 RRA 是共用的,你只需建立一個 RRA,它就可以用於全部的 DS

所以在定義 RRA 時不需要指定是給那個 DS 用的。


六)什麼是 CF

以第2RRA 4213 4 PDP 爲例

AVERAGE
:則結果爲 (4+2+1+3)/4=2.5

MAX
:結果爲4個數中的最大值 4

MIN
:結果爲4個數中的最小值1

LAST
:結果爲4個數中的最後一個 3

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

七)解釋度(Resolution

這裏要提到一個 Resolution 的概念,在官方文檔中多處提到 resolution 一詞。Resolution 究竟是什麼?Resolutino 有什麼用?

舉個例子,如果我們要繪製1小時的數據,也就是60分鐘,那麼我們可以從第一個RRA 中取出12 CDP 來繪圖;也可以從第2 RRA

中取出2 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)


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

[Copy to clipboard]

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章