基于SNMP数据采集模块的设计和实现
发布时间:2008/5/29 0:00:00 访问次数:997
1 对象访问方法
mib中的每个对象都有一个惟一的对象标识符(oid),该标识符由所在mib树中的位置决定。通过snmp获取被管对象的信息,实际上并不是访问一个mib对象,而是访问对象的一个特定实例。由于对象类型有标量对象、表对象(行对象和列对象)之分,因此对于他们实例的访问存在差别。
1.1 标量对象
标量对象与其实例是一一对应的,即一个标量对象只有一个对象实例。为了统一对象实例的标识,同时区分对象和对象实例,snmp规定不属于表的标量对象的实例标识符由他的对象标识符加上0组成。对于标量对象实例的访问,可以通过调用snmp++类库(hp公司提供的snmp开发包)中的snmp::get()函数来实现。
1.2 列对象
在mib定义中,表对象和行对象的访问状态是“无法访问”。对于列对象来说,他的实例是一组用列对象标识符(columnoid)和行索引值(rowindexvalue)联合标识的实例。列对象标识符,是用来惟一标识列对象的oid。行索引值由一个或多个列对象对应实例的值组成。
列对象的每一个实例可以看作是表中指定列对应位置的元素。表中元素的位置可以用行坐标和列坐标表示,相应地,列对象的行坐标可以用rowindexvalue表示,列坐标用columnoid表示。同一列元素有相同colum-noid,同一行元素有相同rowindexvalue。表中元素可以通过如下公式进行标识:oid=columnoid+rowindex-value。snmp定义了访问列对象实例的方法:顺序访问和随机访问。
(1) 顺序访问
mib对象的标识符是按字典顺序排列的,对于他们的实例也是按字典顺序进行排列。利用这种特性,可以通过调用snmp++类库中的snmp::get_next()函数遍历获得一列或一个表甚至是整个mib的结构。这种方法适合在未知被管设备mib结构的前提下搜索和访问对象。
(2) 随机访问
由于列对象实例由columnoid和rowindexvalue共同标识,所以先要根据被指定为行索引的列对象获取他(们)的实例值确定特定实例的rowindexvalue,在此基础上联合已知columnoid组成特定实例的完整oid,据此利用snmp::get()获取相应的值。这里要指出一点,行索引本身也是一个或多个列对象,所以先要分别遍历各个列对象的所有实例,然后根据特定实例所在列的位置确定出rowindexvalue(由同一位置的列对象实例值按指定顺序组成)。由于同一行元素具有相同rowindexvalue,只需遍历(利用snmp::get_next()函数)某一列对象获取实例的完整oid(利用vb::get_old()函数),根据(oid-columnoid)即可确定rowindexoid。可见,随机访问列对象某个实例的过程其实是顺序访问列对象和标量对象访问的结合。
2 数据采集策略
管理站从被管设备中采集数据有两种方式:主动访问被管对象和被动接收告警信息。主动访问被管对象是指管理进程(管理站中)通过snmp协议发起对被管对象的请求,被管设备中的代理进程则响应该请求。被动接收告警信息是指管理进程监听陷阱端口(通常为udp162端口),接收来自代理的告警信息。代理进程会在预定义事件发生时向管理进程发出trap报文。
对于主动访问来说,根据访问对象的性质,可以分为静态信息和动态信息。对于静态信息来说,一经配置基本上保持不变,因此没必要在每一次采集过程中都对他进行轮询操作,只有当他发生变化时进行必要的访问以保证信息的有效。对于动态信息来说,他是随着设备的运行情况做出相应的调整,以实时地反映设备的状态或是性能信息。为了能跟踪设备性能参数的变化情况或是及时反映设备的运行状态,有必要对被管对象进行轮询操作,但是这里就存在一个采集频率的问题。
数据采集频率的确定,是一个与网络带宽权衡的过程。采集频率过低,占用网络资源相对较少,但是数据的更新周期相对较大,不能反映参数的真实变化情况;采集频率过高,数据更新自然较快,但是在采集周期内所占用的网络资源就会很
1 对象访问方法
mib中的每个对象都有一个惟一的对象标识符(oid),该标识符由所在mib树中的位置决定。通过snmp获取被管对象的信息,实际上并不是访问一个mib对象,而是访问对象的一个特定实例。由于对象类型有标量对象、表对象(行对象和列对象)之分,因此对于他们实例的访问存在差别。
1.1 标量对象
标量对象与其实例是一一对应的,即一个标量对象只有一个对象实例。为了统一对象实例的标识,同时区分对象和对象实例,snmp规定不属于表的标量对象的实例标识符由他的对象标识符加上0组成。对于标量对象实例的访问,可以通过调用snmp++类库(hp公司提供的snmp开发包)中的snmp::get()函数来实现。
1.2 列对象
在mib定义中,表对象和行对象的访问状态是“无法访问”。对于列对象来说,他的实例是一组用列对象标识符(columnoid)和行索引值(rowindexvalue)联合标识的实例。列对象标识符,是用来惟一标识列对象的oid。行索引值由一个或多个列对象对应实例的值组成。
列对象的每一个实例可以看作是表中指定列对应位置的元素。表中元素的位置可以用行坐标和列坐标表示,相应地,列对象的行坐标可以用rowindexvalue表示,列坐标用columnoid表示。同一列元素有相同colum-noid,同一行元素有相同rowindexvalue。表中元素可以通过如下公式进行标识:oid=columnoid+rowindex-value。snmp定义了访问列对象实例的方法:顺序访问和随机访问。
(1) 顺序访问
mib对象的标识符是按字典顺序排列的,对于他们的实例也是按字典顺序进行排列。利用这种特性,可以通过调用snmp++类库中的snmp::get_next()函数遍历获得一列或一个表甚至是整个mib的结构。这种方法适合在未知被管设备mib结构的前提下搜索和访问对象。
(2) 随机访问
由于列对象实例由columnoid和rowindexvalue共同标识,所以先要根据被指定为行索引的列对象获取他(们)的实例值确定特定实例的rowindexvalue,在此基础上联合已知columnoid组成特定实例的完整oid,据此利用snmp::get()获取相应的值。这里要指出一点,行索引本身也是一个或多个列对象,所以先要分别遍历各个列对象的所有实例,然后根据特定实例所在列的位置确定出rowindexvalue(由同一位置的列对象实例值按指定顺序组成)。由于同一行元素具有相同rowindexvalue,只需遍历(利用snmp::get_next()函数)某一列对象获取实例的完整oid(利用vb::get_old()函数),根据(oid-columnoid)即可确定rowindexoid。可见,随机访问列对象某个实例的过程其实是顺序访问列对象和标量对象访问的结合。
2 数据采集策略
管理站从被管设备中采集数据有两种方式:主动访问被管对象和被动接收告警信息。主动访问被管对象是指管理进程(管理站中)通过snmp协议发起对被管对象的请求,被管设备中的代理进程则响应该请求。被动接收告警信息是指管理进程监听陷阱端口(通常为udp162端口),接收来自代理的告警信息。代理进程会在预定义事件发生时向管理进程发出trap报文。
对于主动访问来说,根据访问对象的性质,可以分为静态信息和动态信息。对于静态信息来说,一经配置基本上保持不变,因此没必要在每一次采集过程中都对他进行轮询操作,只有当他发生变化时进行必要的访问以保证信息的有效。对于动态信息来说,他是随着设备的运行情况做出相应的调整,以实时地反映设备的状态或是性能信息。为了能跟踪设备性能参数的变化情况或是及时反映设备的运行状态,有必要对被管对象进行轮询操作,但是这里就存在一个采集频率的问题。
数据采集频率的确定,是一个与网络带宽权衡的过程。采集频率过低,占用网络资源相对较少,但是数据的更新周期相对较大,不能反映参数的真实变化情况;采集频率过高,数据更新自然较快,但是在采集周期内所占用的网络资源就会很