作者: ecsun 鏈接:http://papa.javaeye.com/blog/226506 發(fā)表時(shí)間: 2008年08月11日
聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!
網(wǎng)絡(luò)管理通常包括配置、故障、性能、計(jì)費(fèi)和安全5個(gè)方面的管理功能。網(wǎng)管系統(tǒng)通過(guò)數(shù)據(jù)采集模塊采集各個(gè)被管設(shè)備中的對(duì)象,經(jīng)處理后為各個(gè)網(wǎng)管應(yīng)用程序所用。網(wǎng)絡(luò)管理各個(gè)功能的實(shí)現(xiàn),都是建立在對(duì)各種管理信息采集的基礎(chǔ)之上,數(shù)據(jù)采集是實(shí)現(xiàn)網(wǎng)絡(luò)管理的前提和基礎(chǔ)。面對(duì)大量需要采集的管理信息,構(gòu)建一個(gè)穩(wěn)定高效的數(shù)據(jù)采集模塊對(duì)于實(shí)施可靠的網(wǎng)絡(luò)管理具有舉足輕重的作用。目前,數(shù)據(jù)采集主要有如下幾種方式:基于簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)、基于網(wǎng)絡(luò)探針 (Probe)、基于網(wǎng)絡(luò)流(Net-flow)。由于SNMP協(xié)議已成為事實(shí)上的網(wǎng)絡(luò)管理標(biāo)準(zhǔn),受到眾多網(wǎng)絡(luò)設(shè)備廠商的支持,且有標(biāo)準(zhǔn)函數(shù)接口支持,實(shí)現(xiàn)簡(jiǎn)單,因此現(xiàn)在普遍采用SNMP進(jìn)行網(wǎng)絡(luò)管理系統(tǒng)開(kāi)發(fā)。本文針對(duì)基于SNMP數(shù)據(jù)采集方式中存在的效率問(wèn)題,提出了面向數(shù)據(jù)類型的采集策略,同時(shí)采用多線程技術(shù)實(shí)現(xiàn)對(duì)不同被管設(shè)備的訪問(wèn),大大提高了數(shù)據(jù)采集的效率,并且減少了冗余數(shù)據(jù)的重復(fù)采集。
1 對(duì)象訪問(wèn)方法
MIB中的每個(gè)對(duì)象都有一個(gè)惟一的對(duì)象標(biāo)識(shí)符(OID),該標(biāo)識(shí)符由所在MIB樹(shù)中的位置決定。通過(guò)SNMP獲取被管對(duì)象的信息,實(shí)際上并不是訪問(wèn)一個(gè)MIB對(duì)象,而是訪問(wèn)對(duì)象的一個(gè)特定實(shí)例。由于對(duì)象類型有標(biāo)量對(duì)象、表對(duì)象(行對(duì)象和列對(duì)象)之分,因此對(duì)于他們實(shí)例的訪問(wèn)存在差別。
1.1 標(biāo)量對(duì)象
標(biāo)量對(duì)象與其實(shí)例是一一對(duì)應(yīng)的,即一個(gè)標(biāo)量對(duì)象只有一個(gè)對(duì)象實(shí)例。為了統(tǒng)一對(duì)象實(shí)例的標(biāo)識(shí),同時(shí)區(qū)分對(duì)象和對(duì)象實(shí)例,SNMP規(guī)定不屬于表的標(biāo)量對(duì)象的實(shí)例標(biāo)識(shí)符由他的對(duì)象標(biāo)識(shí)符加上0組成。對(duì)于標(biāo)量對(duì)象實(shí)例的訪問(wèn),可以通過(guò)調(diào)用SNMP++類庫(kù)(HP公司提供的SNMP開(kāi)發(fā)包)中的 Snmp::get()函數(shù)來(lái)實(shí)現(xiàn)。
1.2 列對(duì)象
在MIB定義中,表對(duì)象和行對(duì)象的訪問(wèn)狀態(tài)是“無(wú)法訪問(wèn)”。對(duì)于列對(duì)象來(lái)說(shuō),他的實(shí)例是一組用列對(duì)象標(biāo)識(shí)符(ColumnOID)和行索引值 (RowIndexValue)聯(lián)合標(biāo)識(shí)的實(shí)例。列對(duì)象標(biāo)識(shí)符,是用來(lái)惟一標(biāo)識(shí)列對(duì)象的OID。行索引值由一個(gè)或多個(gè)列對(duì)象對(duì)應(yīng)實(shí)例的值組成。
列對(duì)象的每一個(gè)實(shí)例可以看作是表中指定列對(duì)應(yīng)位置的元素。表中元素的位置可以用行坐標(biāo)和列坐標(biāo)表示,相應(yīng)地,列對(duì)象的行坐標(biāo)可以用 RowIndexValue表示,列坐標(biāo)用ColumnOID表示。同一列元素有相同Colum-nOID,同一行元素有相同 RowIndexValue。表中元素可以通過(guò)如下公式進(jìn)行標(biāo)識(shí):Oid=ColumnOID+RowIndex-Value。SNMP定義了訪問(wèn)列對(duì)象實(shí)例的方法:順序訪問(wèn)和隨機(jī)訪問(wèn)。
(1) 順序訪問(wèn)
MIB對(duì)象的標(biāo)識(shí)符是按字典順序排列的,對(duì)于他們的實(shí)例也是按字典順序進(jìn)行排列。利用這種特性,可以通過(guò)調(diào)用SNMP++類庫(kù)中的Snmp:: get_next()函數(shù)遍歷獲得一列或一個(gè)表甚至是整個(gè)MIB的結(jié)構(gòu)。這種方法適合在未知被管設(shè)備MIB結(jié)構(gòu)的前提下搜索和訪問(wèn)對(duì)象。
(2) 隨機(jī)訪問(wèn)
由于列對(duì)象實(shí)例由ColumnOID和RowIndexValue共同標(biāo)識(shí),所以先要根據(jù)被指定為行索引的列對(duì)象獲取他(們)的實(shí)例值確定特定實(shí)例的RowIndexValue,在此基礎(chǔ)上聯(lián)合已知ColumnOID組成特定實(shí)例的完整Oid,據(jù)此利用Snmp::get()獲取相應(yīng)的值。這里要指出一點(diǎn),行索引本身也是一個(gè)或多個(gè)列對(duì)象,所以先要分別遍歷各個(gè)列對(duì)象的所有實(shí)例,然后根據(jù)特定實(shí)例所在列的位置確定出RowIndexValue (由同一位置的列對(duì)象實(shí)例值按指定順序組成)。由于同一行元素具有相同RowIndexValue,只需遍歷(利用Snmp::get_next()函數(shù))某一列對(duì)象獲取實(shí)例的完整Oid(利用Vb::get_old()函數(shù)),根據(jù)(Oid-ColumnOID)即可確定RowIndexOid。可見(jiàn),隨機(jī)訪問(wèn)列對(duì)象某個(gè)實(shí)例的過(guò)程其實(shí)是順序訪問(wèn)列對(duì)象和標(biāo)量對(duì)象訪問(wèn)的結(jié)合。
2 數(shù)據(jù)采集策略
管理站從被管設(shè)備中采集數(shù)據(jù)有兩種方式:主動(dòng)訪問(wèn)被管對(duì)象和被動(dòng)接收告警信息。主動(dòng)訪問(wèn)被管對(duì)象是指管理進(jìn)程(管理站中)通過(guò)SNMP協(xié)議發(fā)起對(duì)被管對(duì)象的請(qǐng)求,被管設(shè)備中的代理進(jìn)程則響應(yīng)該請(qǐng)求。被動(dòng)接收告警信息是指管理進(jìn)程監(jiān)聽(tīng)陷阱端口(通常為UDP162端口),接收來(lái)自代理的告警信息。代理進(jìn)程會(huì)在預(yù)定義事件發(fā)生時(shí)向管理進(jìn)程發(fā)出Trap報(bào)文。
對(duì)于主動(dòng)訪問(wèn)來(lái)說(shuō),根據(jù)訪問(wèn)對(duì)象的性質(zhì),可以分為靜態(tài)信息和動(dòng)態(tài)信息。對(duì)于靜態(tài)信息來(lái)說(shuō),一經(jīng)配置基本上保持不變,因此沒(méi)必要在每一次采集過(guò)程中都對(duì)他進(jìn)行輪詢操作,只有當(dāng)他發(fā)生變化時(shí)進(jìn)行必要的訪問(wèn)以保證信息的有效。對(duì)于動(dòng)態(tài)信息來(lái)說(shuō),他是隨著設(shè)備的運(yùn)行情況做出相應(yīng)的調(diào)整,以實(shí)時(shí)地反映設(shè)備的狀態(tài)或是性能信息。為了能跟蹤設(shè)備性能參數(shù)的變化情況或是及時(shí)反映設(shè)備的運(yùn)行狀態(tài),有必要對(duì)被管對(duì)象進(jìn)行輪詢操作,但是這里就存在一個(gè)采集頻率的問(wèn)題。
數(shù)據(jù)采集頻率的確定,是一個(gè)與網(wǎng)絡(luò)帶寬權(quán)衡的過(guò)程。采集頻率過(guò)低,占用網(wǎng)絡(luò)資源相對(duì)較少,但是數(shù)據(jù)的更新周期相對(duì)較大,不能反映參數(shù)的真實(shí)變化情況;采集頻率過(guò)高,數(shù)據(jù)更新自然較快,但是在采集周期內(nèi)所占用的網(wǎng)絡(luò)資源就會(huì)很大,增加網(wǎng)絡(luò)設(shè)備的負(fù)擔(dān),甚至有可能會(huì)影響到正常的網(wǎng)絡(luò)通信。因此在確定數(shù)據(jù)采集的頻率時(shí),必須根據(jù)實(shí)際的網(wǎng)絡(luò)帶寬資源進(jìn)行考慮,同時(shí)還要考慮被管設(shè)備中被管對(duì)象的數(shù)量。
在動(dòng)態(tài)信息的訪問(wèn)過(guò)程中,還存在另一個(gè)問(wèn)題。如果按照串行操作,依次訪問(wèn)所有設(shè)備的被管對(duì)象,由于對(duì)象數(shù)目眾多,將會(huì)占用很長(zhǎng)的處理時(shí)間(甚至超出既定的采集周期,這個(gè)問(wèn)題也是確定采集頻率需要考慮的),導(dǎo)致訪問(wèn)工作不能正常進(jìn)行。為了保證管理進(jìn)程能夠在采集周期內(nèi)完成對(duì)所有被管對(duì)象的訪問(wèn),這里采用多線程技術(shù)來(lái)完成對(duì)象的訪問(wèn)工作。對(duì)于同一被管設(shè)備,采用獨(dú)立的子線程進(jìn)行訪問(wèn),這樣一來(lái)既可以保證在一定周期內(nèi)完成對(duì)所有被管對(duì)象的訪問(wèn),也使得各個(gè)子線程保持相對(duì)的獨(dú)立性,互不干擾。
在對(duì)象訪問(wèn)過(guò)程中,為減少管理進(jìn)程和代理進(jìn)程之間報(bào)文交換的次數(shù),可以將不同對(duì)象綁定到同一個(gè)協(xié)議數(shù)據(jù)單元(PDU)的變量列表中,或是采用SNMPv2中新增加的GetBulkRequest-PDU。文獻(xiàn)[5]和[6]中還討論了有效獲取MIB對(duì)象的方法。
3 數(shù)據(jù)采集模塊的設(shè)計(jì)和實(shí)現(xiàn)
針對(duì)不同的數(shù)據(jù)采集方式,采用不同線程來(lái)完成數(shù)據(jù)采集工作。
3.1 告警信息接收線程
對(duì)于告警信息的被動(dòng)接收,管理進(jìn)程單獨(dú)開(kāi)啟一個(gè)線程用來(lái)專門監(jiān)聽(tīng)陷阱端口,接收并處理所有來(lái)自網(wǎng)管代理的告警(Trap)消息。在網(wǎng)絡(luò)管理過(guò)程中,無(wú)論在性能管理、故障管理、還是安全管理等功能域,告警功能都是很重要的。這里主要利用SNMP Trap機(jī)制實(shí)現(xiàn)實(shí)時(shí)告警功能。
3.2 靜態(tài)信息獲取線程
對(duì)于靜態(tài)信息的采集,管理進(jìn)程同樣為他單獨(dú)開(kāi)啟一個(gè)線程來(lái)進(jìn)行靜態(tài)信息的收集。由于靜態(tài)信息不隨設(shè)備的運(yùn)行而變化(一般不進(jìn)行手工設(shè)置,靜態(tài)信息保持不變),就沒(méi)有必要重復(fù)地訪問(wèn)這類信息。本線程就是依據(jù)這一點(diǎn),在對(duì)所有靜態(tài)對(duì)象訪問(wèn)一次之后,將采集到的管理信息入庫(kù)存儲(chǔ)。應(yīng)用程序?qū)@類數(shù)據(jù)的操作只需訪問(wèn)本地?cái)?shù)據(jù)庫(kù)即可。如此就減少了對(duì)非實(shí)時(shí)變化信息的訪問(wèn),同時(shí)也減少了冗余信息的存儲(chǔ)。要指出一點(diǎn),靜態(tài)信息的改變一般是由于手工配置引起的,因此需要跟蹤配置操作對(duì)相應(yīng)的信息做出及時(shí)的更新。
3.3 動(dòng)態(tài)信息輪詢線程
對(duì)于動(dòng)態(tài)信息的采集,管理進(jìn)程也開(kāi)啟一個(gè)主線程用來(lái)專門負(fù)責(zé)動(dòng)態(tài)信息的輪詢工作。為了保證數(shù)據(jù)的實(shí)時(shí)性,就需要按照一定的時(shí)問(wèn)間隔定時(shí)訪問(wèn)被管對(duì)象以獲取最新的數(shù)據(jù)。對(duì)有關(guān)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分析,就能掌握動(dòng)態(tài)信息的變化趨勢(shì),為故障管理、性能管理、計(jì)費(fèi)管理等網(wǎng)絡(luò)管理功能提供必要的數(shù)據(jù)支持。
為了使訪問(wèn)工作在規(guī)定的時(shí)間間隔內(nèi)完成,避免串行執(zhí)行帶來(lái)的長(zhǎng)周期問(wèn)題,采用多個(gè)輪詢子線程各自負(fù)責(zé)屬于自己的管理對(duì)象子集。所有輪詢子線程的工作結(jié)束后,這一次的訪問(wèn)工作便完成,即輪詢主線程進(jìn)入等待,直到下一次輪詢點(diǎn)的到來(lái)或是接收到終止輪詢主線程的命令。
4 結(jié)語(yǔ)
數(shù)據(jù)采集模塊是網(wǎng)管系統(tǒng)對(duì)整個(gè)網(wǎng)絡(luò)實(shí)時(shí)有效、可靠管理的前提和基礎(chǔ)。本文首先分析了利用SNMP++開(kāi)發(fā)包實(shí)現(xiàn)MIB對(duì)象訪問(wèn)的方法。在此基礎(chǔ)上,根據(jù)不同的數(shù)據(jù)采集對(duì)象性質(zhì),對(duì)數(shù)據(jù)采集策略進(jìn)行了探討,提出了面向不同對(duì)象類型采用多線程技術(shù)進(jìn)行數(shù)據(jù)采集的方法。最后,結(jié)合實(shí)際開(kāi)發(fā)工作,對(duì)數(shù)據(jù)采集模塊(特別是其中的動(dòng)態(tài)信息輪詢線程)做了詳細(xì)的介紹。本文提供了一個(gè)高效、穩(wěn)定的數(shù)據(jù)采集方案,并已在實(shí)際的網(wǎng)管系統(tǒng)中得到應(yīng)用,取得了較好的效果。
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
JavaEye推薦