三、RRD資料庫更新執行個體
在簡易入門(一)中已經介紹過update 命令:它使用1個或多個參數,其格式為: : . 如果你知道可以用一個 N 表示當前的時間,你一定會高興的。或者你可以用Perl中的 time 函數來指定時間:
perl: perl -e ‘print time, “\n” ‘
shell: date +%s
四、SNMP相關知識
我可以想像到只有少數的人能夠每5分鐘從他們的汽車中讀取一次真實的資料。其他人不得不清算其他類型的計數器。你可以測量印表機列印的頁數,咖啡機做的咖 啡杯數,計算使用的電流的裝置,都可以。遞增的計數器可以被監視,並且用你已經學會的方法被繪製成映像。稍後我們就能夠監視像溫度計這樣的值了。
大多數對RRDtool感興趣的人會使用一個跟蹤網路裝置傳輸資料量的計數器。這樣我們下一步就來作這個。我們會從解釋如何收集資料開始。
有些人會說有些工具可以協助你收集資料。他們是對的!不過,我感覺理解這些工具不是必須的非常重要。在你能夠確定為什麼事情發生了錯誤,你要知道他們是如何工作的。
本例中使用的工具在本文檔前面非常簡短地提到過,它就是所謂的SNMP。它是與連網裝置交談的方式。
下面用到的工具名為 snmpget ,以下是關於它是如何工作的說明:
snmpget device password OID
或
snmpget -v[version] -c[password] device OID
剛開始學習SNMP時,它看起來有些令人困惑。在你看到MIB管理資訊基時,就不會那麼困難了。MIB是用來描述資料的倒狀樹,它有只有一個根結 點,並且由根結點開始有多個分支。這些分支都以另一個結點終結,他們繼續向下分支,如此繼續。所以的分支都有一個名稱,它們構成了一個我們能夠沿著往下的 路徑。我們所沿著的這些分支都被命名了:iso, org, dod, internet, mgmt 和mib-2.這些名稱也可以用數字方式記錄,就像 1 3 6 1 2 1。
iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)
有些程式會使用前置點 . , 令人感到許多困惑。在一個OID中並 沒有前置點。為了顯示OID縮記法和OID完整記法的區別,(通常約定)在使用OID的完整記法時使用前置點。通常這些程式在返回資料給你時,會省略卻缺 省的部分。這些程式有的有幾個預設首碼,這會讓事情顯得更加糟糕。
Ok, lets continue to the start of our OID: we had 1.3.6.1.2.1 From there, we are especially interested in the branch interfaces which has number 2 (e.g., 1.3.6.1.2.1.2 or 1.3.6.1.2.1.interfaces).
好了,我們繼續OID的初步學習:我們有一個1.3.6.1.2.1的OID,我們對(其下面的) interface 分支特別感興趣,其編號為2(例如:1.3.6.1.2.1.2 或 1.3.6.1.2.1.interface)。
首先,我們得要有幾個SNMP的程式。先看看你的OS平台上是否有已編譯好的軟體包。這是最便捷的方式。如果沒有,你就得下載原始碼、並編譯。互連網上到處都是原始碼、程式。你可以用你喜歡的任何方式、搜尋引擎來找到相關的資訊。
假設你已經有了這些程式。先試著收集大多數系統都有的資料。記住:那些引起我們興趣的樹,它上面的部分都有一個簡略名。
在此我會給出一個在Fedora Core 3作業系統上可用的例子。如果對你的作業系統不可用,請查看snmp的手冊,並作相應的調整讓它能夠運行。
snmpget -v2c -c public myrouter system.sysDescr.0
該裝置應當回應其自身的描述,該描述可能是一個空的。只有在你從某個裝置獲得響應後,你才能夠繼續。其中可能需要使用不同的口令、或者不同的裝置。
snmpget -v2c -c public myrouter interfaces.ifNumber.0
snmpwalk -v2c -c public myrouter interfaces.ifTable.ifEntry.ifDescr
如果該命令返回一系列的介面,這就對了。以下是該命令啟動並執行返回結果的例子:
[user@host /home/alex]$ snmpwalk -v2c -c public cisco 2.2.1.2
interfaces.ifTable.ifEntry.ifDescr.1 = "BRI0: B-Channel 1"
interfaces.ifTable.ifEntry.ifDescr.2 = "BRI0: B-Channel 2"
interfaces.ifTable.ifEntry.ifDescr.3 = "BRI0" Hex: 42 52 49 30
interfaces.ifTable.ifEntry.ifDescr.4 = "Ethernet0"
interfaces.ifTable.ifEntry.ifDescr.5 = "Loopback0"
對於cisco裝置,我想監視 ‘Ethernet0` 介面,從上面的輸出結果能夠看到該介面的編號是 4。 我試著運行如下命令:
[user@host /home/alex]$ snmpget -v2c -c public cisco 2.2.1.10.4 2.2.1.16.4
interfaces.ifTable.ifEntry.ifInOctets.4 = 2290729126
interfaces.ifTable.ifEntry.ifOutOctets.4 = 1256486519
這樣,我就有兩個OID需要監視,他們是(這次使用完整記法):
1.3.6.1.2.1.2.2.1.10
和
1.3.6.1.2.1.2.2.1.16
這兩個OID都有介面編號4。
別被糊弄了,我可不是試一次就搞定的。我花了一些資料來搞清這些數字都是什麼意思。把這些編號轉換成標題文字大有協助… 至少在大家談論MIB和OID時,你知道他們是什麼東西。別忘了介面編號(如果它不是附屬介面,就是0),如果用snmpget沒有得到響應,試試 snmpwalk。
五、應用RRDtool的執行個體
rrdtool create myrouter.rrd \
DS:input:COUNTER:600:U:U \
DS:output:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:600 \
RRA:AVERAGE:0.5:6:700 \
RRA:AVERAGE:0.5:24:775 \
RRA:AVERAGE:0.5:288:797 \
RRA:MAX:0.5:1:600 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797
接下來要做的就是收集資料並把它儲存起來。以下是一個例子。它是用偽碼寫的,你得根據OS調整後讓它能夠運行。:
while not the end of the universe
do
get result of
snmpget router community 2.2.1.10.4
into variable $in
get result of
snmpget router community 2.2.1.16.4
into variable $out
rrdtool update myrouter.rrd N:$in:$out
wait for 5 minutes
done
在收集了1天的資料後,試著用下面的命令建立映像::
rrdtool graph myrouter-day.png --start -86400 \
DEF:inoctets=myrouter.rrd:input:AVERAGE \
DEF:outoctets=myrouter.rrd:output:AVERAGE \
AREA:inoctets#00FF00:"In traffic" \
LINE1:outoctets#0000FF:"Out traffic"
這會產生一個具有1天流量值的映像。1天有24(小時)x60(分鐘)x60(秒)。我們從目前時間-86400秒開始。我們用DEF把輸入和輸出位元組數定義成myrouter.rrd資料庫中的的平均值,並且繪製輸入資料流量區和輸出資料流量線。