Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1055715
  • 博文数量: 171
  • 博客积分: 55
  • 博客等级: 民兵
  • 技术积分: 2077
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 10:11
个人简介

pugna

文章分类

全部博文(171)

文章存档

2021年(4)

2020年(1)

2019年(4)

2018年(5)

2017年(7)

2016年(9)

2015年(36)

2014年(8)

2013年(96)

2012年(1)

分类: LINUX

2015-12-24 10:55:33

原文地址:白话--rrdtool相关基础 作者:exp07

    参考文章较多,这里不一一列举,在查看官方文档和不少牛人的文章后,尽量加入自己的白话理解。

    RRDtool --“Round Robin Database tool”
   
    所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是‘.rrd’。

 RRDtool 的特殊之处

A) 首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得RRDtool看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。

B) RDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的。

C) 其他数据库只是被动的接受数据, RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of  change),并存储该结果。

D) RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN 代替,其他数据库则不会这样。

一、rrdtool的相关规划

    1、想要以什么方法来取得数据?是通过 SNMP 还是 shell 、perl?

    2、每个对象的检测时间是多长时间一次?

    3、
是一个RRD文件中包括多个检测对象(DS),还是分成多个RRD文件 ?RRDtool 提供了tune操作,可以增加监测对象或者删除 RRD 文件中的某个对象,而且绘图时也可以指定要画的是那个对象,这点看个人喜欢而定。

    4、如何统计取得的数据?

    5、
如何保存/统计这些数据?

   
每日统计图(5分钟平均)  : 600 个,大约2天的时间
    每周统计图(20分钟平均) : 600 个,大约8天的时间
    每月统计图 (2小时平均) : 600 个,50 天的时间
    每年统计图 (1天平均) :730 个, 2年的时间

    6、要以什么方式绘图?line(线型)、area(区域)
   
二、使用rrdtool画图的步骤

    很简单,为了得到最后自己所希望的图,需要经历哪些阶段?
    首先,需要建立rrd数据库,也就是产生一个rrd格式的
数据库文件;
    其次,用某种手段把这个rrd文件在web页面上显示出来。

三、不知道哪些命令使用哪些参数怎么办?不理解参数的运行情况怎么办?
    看官方文档:
    一时看不明白,建议下载到自己的服务器上去,需要查的时候查询一下。不过我的理解是部门术语不理解的时候,就去各bbs上抓哪些大虾的示例或者解释了,多对比一下。

四、如何建rrd数据库
介绍一下create命令的使用  
rrdtool create filename
[--start|-b start time]
[--step|-s step]
[DS:ds-name:DST:heartbeat:min:max]
// DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
[RRA:CF:xff:steps:rows]

我们用一个官方例子对整个语法进行解释(以下都用这个例子说明参数的使用):
rrdtool create target.rrd
--start 1023654125
--step 300
DS:mem:GAUGE:600:0:671744
RRA:AVERAGE:0.5:12:24
RRA:AVERAGE:0.5:288:31
简单的先说吧:
create 很容易理解,就是创建一个新的RRD数据库文件以存储信息。
filename习惯上会以 .rrd 结尾,请记住这个数据库文件的名字。
--start 给出 RRDtool 的第一个记录的起始时间。你可以指定为 1970 年至今的秒数(参数为-b `date -d "1970/01/01" +%s`),如果你不指定,那么起始时间默认就是
    RRDtool 不会接受任何采样时间小于或者等于指定时间的数据。也就是说 –-start指定了数据库最早的那个记录是从什么时候开始的。如果update 操作中给出的时间在 –-start 之前,则 RRDtool拒绝接受。--start 选项也是可选的。 如果你想指定--start 为1天前,可以用 --start $(date -d '1 days ago' +%s)

--step 采集数据的间隔时间,习惯上我们会设 300 (秒),当然你可以自行调整,这也是RRD的优势所在。但是采集周期不应该过短也不应小于你的update rrd文件周期,否则可能会造成服务器负载过重。


    后面两个参数需要慢慢理解,把语法和例子拿下来对比一下,就可能明白了。
[DS:ds-name:DST:heartbeat:min:max]
// DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
对比例子
DS:mem:GAUGE:600:0:671744
下面以例子来说明:
DS:用来声明数据源的,也可以理解为声明数据变量的关键字。这个是必须写的,不能按照你的意愿修改成其他表述方式。
官方英文解释是这样的:
DS (Data Source) is the actual variable which relates to the parameter on the device that has to be monitored.
DS-NAME:变量名,可以理解为你给这个数据源起的助记符(简称DSN)。当每一个刷新周期到来的时候,数据文档中各变量对应的值就会被更新。这个变量对应的值在官方文档中也叫做主要数据点――PDP(Primary Data Point)。
DST:DS的类型,通常有:GAUGE, COUNTER, DERIVE, 和ABSOLUTE 四种,下面依次介绍:


GAUGE:
我们用的最多的就是GAUGE了,它的中文解释是:测量。在这里它表示实际的值。比如说输入次序为98 100 98,那么输出顺序也是98 100 98。它没有“平均”的概念,RRDtool 收到值之后直接存入 RRA 中
COUNTER:
必须是递增的,除非是计数器溢出(overflows)。在这种情况下,RRDtool 会自动修改收到的值。例如网络接口流量、收到的packets 数量都属于这一类型。累计值,自己进行计算,比如说输入次序为98 100 98,那么输出顺序也是2 -2,怎么出来的这两个数值呢?100-98 98-100,其实就是两个差值,它表示的是经过一个刷新周期的变化率。
DERIVE:
和 COUNTER 类似。但可以是递增,也可以递减,或者一会增加一会儿减少。也是累计值,不同的是它不存在负值,最小的是0,不如-2那么它就只划0,结果为 2 0
ABSOLUTE:
ABSOLUTE 比较特殊,它每次都假定前一个interval的值是0,再计算平均值。如同COUNTER,但COUNTER可能overflow(数值过大),所以会取绝对值
补充:COUNTER/DERIVE/AVSOLVTE 虽然都是取差值,但会再除以两次间隔间的秒数。
例,两次间隔间为300秒,那画出来的就是 2/300,-2/300 的值
   
   给出一个例子再帮助理解:

Values = 300, 600, 900, 1200 实际值输入值(每隔300S输入一个)
Step = 300 seconds 刷新周期
COUNTER DS = 1, 1, 1, 1 COUNTER定义的DS的值
DERIVE DS = 1, 1, 1, 1 DERIVE定义的DS的值
ABSOLUTE DS = 1, 2, 3, 4 ABSOLUTE定义的DS的值
GAUGE DS = 300, 600, 900, 1200 GAUGE定义的DS的值

heartbeat 心跳有效期
比如在例子中,我们定义了心跳有效时间是600秒,也就是两个刷新周期。举个例子,在12点的时候没有产生数据,那么前后300S(共600S)的平均值就会绘成12点的值,但如果在两个刷新周期内,都没有接收到数据更新,那么这个时候,必须往数据文档中写入一个(UN)UNKNOWN值。这是  RRDTool的一个特别的地方。要知道MRTG在处理网络中断的时候,记录的是0值。这个0和UN还是有一定区别的。

in:max 记录数据的最小值和最大值
DS数值的有效范围,超出就是UN喽。也可以写成 U:U 代表不限范围。
小技巧:将数据源建立方式记为 "三文字,三数字"

如果要对ds进行计算,需要用到COMPUTE,这个比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。这里的格式应该为: DS:ds-name:COMPUTE:rpn-expression , 后面对这个再详细解释吧

DS讲完了就该讲RRA了,那么什么是RRA呢?
RRA:更简单,它的作用就是定义更新的数据是如何记录的,RRA 即  Round Robin Archive,Archive是什么,存档。比如我们每5分钟产生一条刷新的数据,那么一个小时就是12条。每天就是288 条。这么庞大的数据量,一定不可能都存下来。肯定有一个合并(consolidate)数据的方式,那么这个就是RRA的作用了。
下面具体介绍怎么应用RRA:
使用方法:RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
RRA:用以声明RRAs的关键字
CF:consolidation function 合并方式,包含四类:
AVERAGE, MIN,MAX, LAST //平均值,最大值,最小值,最后一笔
上面说过了,经过一个刷新周期,会获得一个主数据点(PDP),将若干个PDPs使用合并方式(CF)合并后会产生一个合并数据点CDP(consolidated data point)。
xff:xfiles factor 和unkown数据有关,很多资料都取0.5
step:有step条PDP合并形成一条CDP
row:记录的合并数据点CDP条数

我们在例子中对RRA是这样定义的:
RRA:AVERAGE:0.5:12:24 //1天
RRA:AVERAGE:0.5:288:31 //1月
对于第一个RRA,12条的PDP(每经过一个刷新周期产生一个PDP)经过CFed(AVERAGE),也就是取平均值,产生一个CDP,24个  CDPs存档。我们一起来计算一下时间,如果一个周期是300秒,那么12个PDP的产生时间就是一个小时,也就是一个小时产生一个CDP。24个  CDPs时间就是一天。说明这条通过这条RRA,我们可以取得一天的数据值。一天后,又经过一个小时。就会产生第25条,那么如何记录这个第25条数据呢?根据我们这个RRA的定义,它将会替代第一条CDP的位置。我们通过下面这个图来说明:


实例(检测某核心交换的端口)(create_nic_7609.sh)
/usr/local/rrd/bin/rrdtool create /www/rrd/NIC_7609.rrd -s 300 \
DS:ifInOctets1:COUNTER:600:U:U \
DS:ifInOctets2:COUNTER:600:U:U \
DS:ifInOctets9:COUNTER:600:U:U \
DS:ifInOctets11:COUNTER:600:U:U \
DS:ifInOctets14:COUNTER:600:U:U \
DS:ifInOctets53:COUNTER:600:U:U \
DS:ifOutOctets1:COUNTER:600:U:U \
DS:ifOutOctets2:COUNTER:600:U:U \
DS:ifOutOctets9:COUNTER:600:U:U \
DS:ifOutOctets11:COUNTER:600:U:U \
DS:ifOutOctets14:COUNTER:600:U:U \
DS:ifOutOctets53:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:4800 \
RRA:AVERAGE:0.5:6:2400 \
RRA:AVERAGE:0.5:24:1200 \
RRA:AVERAGE:0.5:288:600 \
RRA:MAX:0.5:1:4800 \
RRA:MAX:0.5:6:2400 \
RRA:MAX:0.5:24:1200 \
RRA:MAX:0.5:288:600


我们举例来看
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603 \
RRA:AVERAGE:0.5:24:603 \
RRA:AVERAGE:0.5:288:800 \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800
解释一下,首先你要记得step我们设置为300秒,那么
0.5:1:603
因为我们将step设置为300秒,若原计算时间点为12:00,记录时11:57:30~12:02:30的平均值为主,这个值若在此时间点內只有一笔资料的话,其意即是平均值,所以此一值即表共要记录几笔,603是指要存603笔,超過603筆,則最早一笔將被移出。
0.5:6:603 仅就6解释,取6笔资料(每笔为step值,在此意即5分钟)为平均值( 30 分钟), 存 603 笔
0.5:24:603 24 即2小時
0.5:288:800 288 即1天
请注意,不是0.5:1:603中的1 就是五分钟,这个是依据你的--step值而定,如果--step 3600,那0.5:6:603这一行就是六小时合起來的平均值了。若将 AVERAGE 换成MIN/MAX 的意义则是取该时间点中 (如上例之5min/30min/2hr..)之最大值或最小值,而通常在监测系统时最大值与平均值是比较有实际意义的。下面这个图来帮助你记忆。

RRA:MIN:0.5:1:600 \
RRA:MIN:0.5:6:700 \
RRA:MIN:0.5:24:775 \
RRA:MIN:0.5:288:797


阅读(1687) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~