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