首页 > 代码库 > SNMP和rrdtool详解介绍
SNMP和rrdtool详解介绍
snmp有一个非常重要的概念就是MIB(management infromation base),全称管理信息库。它是网络管理数据的标准,在这个标准里规定了网络代理设备必须保存的数据项目,数据类型,以及允许在每个数据项目中的操作。所有数据采用树形结构保存。当前广泛使用的是第二版MIB,称为MIB-II。任何一台主机都会提供一个MIB-II。
NMS = Network Management System网络管理系统。是SNMP中的控制端,也是网络管理的发起者。Agent代理,为被管理的设备提供SNMP的能力,负责设备与NMS的通信。
关于snmp的软件包有两个,一个是net-snmp和net-snmp-utils,前面那个是被监控端需要用到的工具,后面那个是监控端用到的命令。但是如果监控端需要用到trap功能的时候,在监控端上还需要装net-snmp这个包才行。由于下面的功能全是在本机上介绍的。所以直接把这两个包全部装在本机上。yum install net-snmp net-snmp-utils。可以使用rpm -ql net-snmp查看安装snmp时所装的所有文件。使用netstat -tunpl | grep snmp可以发现snmp监听在tcp的199和udp的161端口上。如果监控端还要启动trap功能的话,还需要把snmptrapd这个服务器启动起来。service snmptrapd start。snmptrapd默认监听在udp的162端口上面。可以通过snmpwalk -v 2c -c public localhost来对一个主机上资源获取服务器上的资源状况。snmpwalk的支持的命令和参数非常多,可以获取到的资源状况也非常多。
snmp的默认配置文件在/etc/snmp/snmpd.conf文件中。这个文件中有如下的信息可以改变指定监控的主机和community:
#sec.name source community
com2sec notConfigUser default public
默认就是允许所有的主机通过这个public到我们的主机上进行监控,显示这是不安全的做法,因为是本机自己监视自己,所以可以改成:
com2sec notConfigUser 127.0.0.1 qiguopublic ,而所有的mibs库全部放在/usr/share/snmp/mibs/目录下面。
RRDtool是指Round Robin Database 工具(环状数据库)。Round robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环,这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头,这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。我们使用RRDtool来处理RRD数据库。使用它向RRD数据库存储提取数据。通过对RRDtool工具的使用可以绘图来达到流量图监控的目的。
rrdtool在linux上是不自带的,需要自己手动安装,这里我们采用源码包的方式来安装rrdtool。准备的软件包是rrdtool-1.4.5.tar.gz。下面开始安装过程:
tar xf rrdtool-1.4.5.tar.gz
cd rrdtool-1.4.5
./configure --prefix=/usr/local/rrdtool
make && make install
为了使用的方式。把/usr/local/rrdtool/bin加如path环境变量
vi ~/.bash_profile
加上PATH=$PATH:$HOME/bin:/usr/local/rrdtool/bin
source .bash_profile重新读取配置文件
下面是使用RRDtool的一些常用选项,通过这些选项便可生成绘图。
1.使用rrdtool创建各种类型、特性的RRD环型数据库
rrdtool create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]
这个语法的作用是创建一个初始化的rrdtool数据库文件;filename就是要创建的文件的名称;--start time设定rrd数据库加入第一个数据时的时间,默认是10秒前;--step step时间跨度,表示每隔多少时间接受一个数据;DS指定一个数据源,一个数据源可以聚合多次;RRA指定如何做聚合,归档的。
DS:ds-name:DST:dst arguments具体介绍如下:
DS固定格式,表示数据源;
ds-name数据源的名称,这个名称要唯一,并且最长最多只能19个字符
DST数据源的类型,数据源的类型有GAUGE,COUNTER,DERIVE,ABSOLUTE,COMPUTE5个参数
GAUGE表示初A始值,保存一个数据原来的值,不做任何改变
COUNTER表示相对值,通常都是相对上一个数据的值,而且必须比上一个数据的值要大。
DERIVE给COUNTER一样,但是没有counter的限制
ABSOLUTE根据原始值来取得一个相对的值
COMPUTE用于存放对RRD中的其他数据源进行公式计算的结果
dst arguments数据源类型的参数,默认有3个参数heartbeat,min,max
heartbeat表示当数据到来的时候,最长多少时间内认为其是对应槽内的数据
min表示保存到来的数据的最小值,如果不知道最小值默认可以使用U
max表示保存到来的数据的最大值,如果不知道最大值默认可以使用U
RRA:CF:cf arguments具体介绍如下:
RRA关键字
CF聚合函数,有4种聚合的类型,AVERAGE、MIN、MAX、LAST。分别表示平均,最小,最大,当前。
cf arguments聚合函数的参数,默认格式为xff:steps:rows
xff表示指定unknown的比例为多大时候,把他定义为unkown
steps表示聚合函数对几个PDP做一次聚合
rows表示一共保存多少个聚合的结果
例:
rrdtool create test.rrd --step 5 DS:qiguo:GAUGE:8:U:U RRA:AVERAGE:0.5:1:17280 RRA:AVERAGE:0.5:10:3456 RRA:AVERAGE:0.5:100:1210
上例设置了一个名为 test.rrd的RRD,它每5秒接收一个随机值。如果超过8秒没有提供数据,值变为*UNKNOWN*。其可以接受任何的值。本例中同时还定义了几个归档区。第一个RRA归档区存储1天内的随机值(17280*5)。第二个RRA存储两天内的平均值(3456*10 *5),第三个存储一周内的平均值(100*5*1210)
rrdtool info test.rrd可以查看test.rrd的具体内容。
2.为rrd环型数据库提供数据:
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] ...]
filename为要更新的RRD数据库的名称。
--template|-t ds-name[:ds-name]... :-t ds-name要更新RRD数据库中数据源的名称
N|timestamp:value[:value...]:时间:要更新的值...
例:
while true;done
rrdtool update test.rrd N:$RANDOM
sleep(5);
done
rrdtool fetch -r 5 test.rrd AVERAGE可以查看为rrd环形数据库生成的数据
-r表示多少时间生成一次数据
3.绘制rrd环型数据库中的采集到的数据
rrdtool graph filename [option ...] [data definition ...] [data calculation ...] [variable definition ...]
[graph element ...] [print element ...]
filename 要绘制的图片名称
Time range时间范围
[-s|--start time]启始时间
[-e|--end time]结束时间
[-S|--step seconds]步长
[-t|--title string]图片的标题
[-v|--vertical-label string] Y轴说明
[-w|--width pixels] 显示区的宽度
[-h|--height pixels]显示区的高度
[-j|--only-graph]只绘制图像
[-u|--upper-limit value] Y轴正值最大值
[-l|--lower-limit value] Y轴负值最小值
[-r|--rigid]固定Y轴的值,不进行缩放
[-A|--alt-autoscale]自动缩放
[-J|--alt-autoscale-min]只自动缩放最小值
[-M|--alt-autoscale-max]只自动缩放最大值
[-N|--no-gridfit]不显示网格线
[data definition ...]data and variables获取画图的数据,格式如下:
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
vname定义一个变量保存数据
rrdfile就是前面生成的rrd文件
ds-name就是数据源的名称
CF就是聚合函数
step表示每过多长时间获取数据
LINE[width]:value[#color][:[legend]]
LINE指定画线条图,默认使用LINE1
value表示以前面DEF定义的变量vname为值进行画图
color表示画出来的图的颜色
legend表示对应图下面的文本信息
例:
rrdtool graph qiguo.png -s 1400129745 -t Test -v YTest DEF:mytest=test.rrd:qiguo:AVERAGE:step=5 LINE1:mytest#FF0000:testline
注:这里的1400129745是通过上面rrdtool fetch根据观察而生成的时间戳数字
上述实例就生成了一个从timestamp开始的一个名为qiguo.png的线条图。图片如下:
但是图片只有一条信息,那么如何在一个图片上绘制两条不同的线呢?
只需要绘图的时候多生成一个绘图数据和绘图函数即可:
rrdtool graph qiguo2.png -s 1400130895 -t Test -v YTest DEF:mytest=test.rrd:qiguo:AVERAGE:step=5 DEF:mytest2=test.rrd:qiguo:AVERAGE:step=50 LINE1:mytest#FF0000:testline LINE2:mytest2#00FF00:test2line
图片如下:
但是我们观察rrdtool的官方站点的时候很多图下面都有最大值,最小值,当前值等。那么需要使用另一个函数GPRINT来完成。默认格式GPRINT:vname:CF:format
vname是打印那个变量对应的值
CF是聚合函数
format是显示的格式
例:
rrdtool create test.rrd --step 5 DS:qiguo:GAUGE:8:U:U RRA:AVERAGE:0.5:1:17280 RRA:MIN:0.5:1:17280 RRA:MAX:0.5:1:17280 RRA:LAST:0.5:1:17280
写一个脚本while.sh,让它执行
while true;done
rrdtool update test.rrd N:$RANDOM
sleep(5);
done
rrdtool graph qiguo4.png -s 1400133115 -t Test -v YTest DEF:mytest=test.rrd:qiguo:AVERAGE:step=5 DEF:max=test.rrd:qiguo:MAX:step=5 DEF:min=test.rrd:qiguo:MIN:step=5 DEF:last=test.rrd:qiguo:LAST:step=5 LINE1:mytest#FF0000:testline GPRINT:last:LAST:"cur\:%6.2lf" GPRINT:min:MIN:"min\:%6.2lf" GPRINT:max:MAX:"max\:%6.2lf"
最终生成的图片如下: