首页 > 代码库 > SNMP和rrdtool详解介绍

SNMP和rrdtool详解介绍

     snmp全称simple network manage protocol,snmp能够通过简单的命令获取远程主机上的服务状况,以实现对远程服务的监控。snmp至今经历了3个版本,snmpv1,snmpv2,snmpv3。snmp简单工作原理就是监控端的一台主机向被监控端的一台主机发出命令,被检控端的主机在本机上安装服务能够识别到监控端主机发过来的命令并给予反馈信息。由于这种监控的局限性,保证被监控端的主机只识别指定主机发来的监控信息,双方需要建立识别的信息,这就是communite的作用。在snmpv1版本中提供了3种communite方式,分别是read-only,read-write和trap。read-only就是监控端只能接受到被监控端发过来的信息;read-write就是监控端可以直接操作被监控端的主机,例如关机等操作;trap就是被监控端可以主动发出信息告知监控端来监控自己。snmpv2相对于v1版本在功能上做了强大的改动,但基本功能并没有改变。snmpv3版本在认证方面做了更加安全的防范措施,并且在数据传输方面也大大增强了其安全性。但是,目前使用的最多的依然是snmpv1的版本。

    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"
      最终生成的图片如下: