[微软技术] rrdtools

Oct 25th, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/10/25/rrdtools.html

大多的时候都是使用 RRD 来存放监控的数据库。因为这是个环形数据库,所以写到最后就会从开始的位置写起来。
做一个监控系统,都会经历的步骤,就是使用 RRD 的步骤。创建 RRD 的文件,采集数据,存入 RRD ,显示成图象。

Perl 有一个RRDs.pm 来操作 RRD 的模块,在 RRD 最常用的几个操作是 fetch,update,graph,分别对应相关的上面讲的作用,update 是更新 RRD 存的内容, graph 是用来显示成图片的方法.
使用这个和在 Linux 下操作 rrdtool 指令和选项基本一样。

基本的使用象下面这样∶

#!/usr/bin/perl
use RRDs;
my $rrdFile = 'test.rrd';

RRDs::create($rrdfile,@OPTIONS);

这个等同于 shell 命令下的

rrdtool create test.rrd [OPTIONS]

这在 Perl 上都有对应的操作。

创建 RRD 文件

Perl 创建基本是 RRD 文件,是它最复杂的方法之一,如果详细了解了怎么创建,相信你会对 rrd 了解多了的。从下面可以见到 create 时主要有三个部分的参数,普通参数,DS 参数,RRA 的参数。

#!/usr/bin/perl
use RRDs;
my $file = 'test.rrd';

if ( ! -f $file ) {
    eval {
        RRDs::create(
            $file,
            '--step', '300',
            'DS:num:GAUGE:600:U:U',
            'DS:sub:GAUGE:600:U:U',
            'RRA:AVERAGE:0.5:1:1440',  #5分, 5日
            'RRA:AVERAGE:0.5:6:1008', #30分, 21日
            'RRA:AVERAGE:0.5:24:1344', #2时间, 112日
            'RRA:AVERAGE:0.5:288:2500', #24时间, 500日
            'RRA:MAX:0.5:1:1440',  #5分, 5日
            'RRA:MAX:0.5:6:1008', #30分, 21日
            'RRA:MAX:0.5:24:1344', #2时间, 112日
            'RRA:MAX:0.5:288:2500', #24时间, 500日
        );
        my $ERR=RRDs::error;
        die $ERR if $ERR;
    };
    die "init failed: $@" if $@;
}

开始之前,我们需要先了解几个东西,
Define Data Sources (Inputs)

DS 是指我们要准备的 Data Source.象上面的 num,sub 是这笔记录所取的名字, GAUGE 是指这个资料怎么计算,下面可以见到常见的  GAUGE 、COUNTER 、DERIVE、 ABSOLUTE 这些方式
600 是秒数的有效期(heart beat),会计算在这段时间内的平均值,没有的话,就会显示 UN.

Define Archives (Outputs)

其实这个就是所谓的 RRA,这个全称叫 Round Robin Archive,是指资料在 rrd 内的存放的方法给取出来时使用.
 

创建时的格式如下:

rrdtool create filename [--start|-b start time][--step|-s step]
                [DS:ds-name:DST:dst arguments]
                [RRA:CF:cf arguments]

我们现在来详细分析这些参数,我们根据上面三行,可以分成三个基本的部分
(1. 基本参数(filename [--start|-b start time][--step|-s step])

  • filename : rrd 的文件名
  • –step: 数据的更新频率,默认为 300s (–step)
  • –start: 数据的开始时间,默认是现在

(2. DS 参数(DS:ds-name:DST:dst arguments)

DS 的详细格式是:
DS:ds-name:DST:Heartbeat:Min:Max
如上:'DS:num:GAUGE:600:U:U'
  • DS: 指明这是 DS 的属性
  • num: DS 的名字为 num,
  • GAUGE: 指这个部分的数据类型,所有的类型如下

    • Counter: 这是一个累计的值,必须是正数.
    • Derive:   这个和 Counter 基本一样,但可以处理负数
    • Absolute: 这个数值是相对的值,以第一笔资料来对比
    • Gauge:  这个类型用得最多,是直接的数值
  • 600: 数据的有效的范围,单位是 s.注意如果指定时间内没有 update ,就会出面UNKN画图就会不全。所以需要非常注意这个地方,另外这个时间的设置,需要为step的倍数
  • U:U: 有效的最大值和最小值都是无限 U.

(3. RRA 的格式

RRA 的详细格式为:

RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows

如上:'RRA:AVERAGE:0.5:1:1440',

  • RRA: 声明这是 RRA 的属性
  • AVERAGE: 存什么样的值,有四种可以选择平均值(AVERAGE),最小值(MIN),最大值(MAX),最后的值(LAST),在这是平均值
  • 0.5: 连续性,是指可以有 50% 的合并的数据点是 UNKNOWN.
  • 1: 时间特性,steps 这是指当一个 steps (300s) 做为一笔记录,因为 steps 为 300s 也就是 5 分钟,所以每 5 分钟存一笔记录
  • 1440: 笔数,以一个步长做一步记录,一共存 1440 笔记录

如上'RRA:AVERAGE:0.5:6:1008'

为什么还要拿这个出来讲,主要是有些不同,我们看"6:1008",也就是讲当上面那个 RRA 记录了 6 笔数据时,这个才会执行,也就是 30 分钟,一共记录 1008 笔。因为是平均值,所以会拿这 6 笔记录做平均。还有这 6 笔记录合并时,有个 0.8 的概念,也就是讲需要记录进来 80% 的数据才能计算平均值,不然就为空。所以 6 * 0.8 = 0.48 约为 5 笔记录。最少要 5 笔记录这个数据才能组成一个 CDP 。
 
RRA 的笔数(rows),密度(steps)的整个周期的关系

多个 RRA 的关系

更新 RRD 的资料

在 Perl 中进行数据的更新(Update)非常容易,基本这个的选项最少,和命令行版一样简洁.

在 Perl 中进行 update 时的使用的方法如下:

RRDs::update(
    $file,
    '-t', 'num:sub',
    '--', join(':', 'N', $number, $subtract),
);
my $ERR=RRDs::error;
die $ERR if $ERR;

上面这个还是比较容易理解,-t 是用来指定要更新的模板中的有那些 DS 需要更新。上面的[]表示可选,其中 N|timestamp 表示,要么你需要使用Unix time ,在 Perl 中直接使用 time() 函数,如果在 Shell 中,使用 `date +%s` 来取得这个时间.也可以直接使用 N。使用 N 时,会使用当前时间来更新.
基本的更新的格式:

rrdtool update filename --template|-t ds-name:ds-name:...
      time|N:value[:value...]

从 RRD 输出图象

#!/usr/bin/perl
use RRDs;

my $rrdpath = 'test.rrd';
my $png     = "test.png";

my (@opt, @GraphOpt, @GraphDraw)
push @GraphOpt,
        "-i",
        "--alt-autoscale-max",
        "--imgformat","PNG",
        "--width","400",
        "--height","120",
        "--lower-limit","0",
        "--base","1000",
        "--vertical-label","bits per second";

push @GraphDraw,
        "AREA:in#00CF00:in ",
        "GPRINT:in:LAST: cur\\: %8.2lf %s / ",
        "GPRINT:in:AVERAGE:ave\\: %8.2lf %s / ",
        "GPRINT:in:MAX:max\\: %8.2lf %s \\n",
        "LINE:out#002A97:out ",
        "GPRINT:out:LAST:cur\\: %8.2lf %s / ",
        "GPRINT:out:AVERAGE:ave\\: %8.2lf %s / ",
        "GPRINT:out:MAX:max\\: %8.2lf %s";

push @opt,
        "--start" , "-8hour", "--title" , "traffic";

push @opt,@GraphOpt
        "DEF:inb=$eth0_rrd:in:AVERAGE",
        "DEF:outb=$eth0_rrd:out:AVERAGE",
        "CDEF:in=inb,8,*",
        "CDEF:out=outb,8,*",
        @GraphDraw;

my ($argv,$xsize,$ysize) = RRDs::graph($png, @opt);
if ($ERROR = RRDs::error) {
    die $ERROR;
}

在 Linux 中可以使用 rrdtool info test.rrd 来查看建议的 rrd 的信息

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
Tags:
No comments yet.