前期規劃
**********************************************************************************************************************
注 :該教程參考瞭如下內容 :
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 中都定
義 Workdir、Language 這兩個選項。針對上面的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 中,但目前這兩個腳本只是負責取數據並輸出而已,
到最後我們再把這些功能合併到一起。
四)下面是腳本的內容
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]#
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分鐘執行一次
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 文件。
一)語法格式
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天前,可以用
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 的意思。有 COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5種。
由於網卡流量屬於計數器型,所以這裏應該爲 COUNTER 。
F) RRA :RRA 用於指定數據如何存放。我們可以把一個RRA 看成一個表,各保存不同 interval 的統計結果
G)PDP :Primary Data
Point 。正常情況下每個 interval RRDtool 都會收到一個值;RRDtool 在收到腳本給來的值後 會計算出另外
一個值(例如平均值),這個 值就是 PDP ;這個值代表的一般是“xxx/秒”的含義。注意,該值不一定等於RRDtool 收到的那個值。除非是
GAUGE ,可以看下面的例子就知道了
H) CF :CF 就是 Consolidation Function 的縮寫。也就是合併(統計)功能。有
AVERAGE、MAX、MIN、LAST 四種
分別表示對多個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並自動計算出某個值。例如
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分鐘平均,6個PDP組成)之中,流量具體是如何變化的,什麼時候高,什麼時候低。這於需要用到別的統計類型了
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分鐘沒有,第4個5分鐘10封,第5個5分鐘也沒有,第6個5分鐘
40封。如果用 MAXIMUM 或者 MINIMUM 就不知道在30分鐘內共收到100封郵件,而是得出30和0。所以 LAST 適用於每隔一段時間被觀察 對象就會復位的
情況。例如每30分鐘就收一次郵件,郵件數量就是 LAST 值,同時現有的新郵件數量就被清零;到下一個30分鐘再收一次郵件,又得到一個 30 分鐘的 LAST 值。
這樣就可以得得出“距離上一次操作後到目前爲止共xxx”的需求。(例如距離上一次收取郵件後又共收到100封新郵件)
四)DST 實例說明
這樣說可能還是比較模糊,可以看下面的例子,體會一下什麼是 DST 和 PDP :
QUOTE:
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
五)開始建庫
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 是 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天
[root@dns1 root]#
注:上面第2-4個 RRA的記錄數實際上應該是 700,775,790,而不是 600,600,730。
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年的數據
檢查一下結果
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
以第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
中取出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)
這個看起來有點頭暈,我們舉個簡單的例子 :例如
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 了