rrdtool(Round Robin Database)
流程
- rrdtool create 创建rrd数据库
- rrdtool update 更新数据库中的值
- rrdtool graph 画图
名词解释
在阅读以下内容之前,先来个名词解释,方便回头查阅
RRA: Round Robin Archives 可理解为RRD中的小归档;
CF: Consolidation Functions 归并函数;
DS: Data Source 数据源;
DST: Data Source Type 数据源类型;
PDP: Primary Data Point 由数据源得到的数据点;
CDP: Consolidation Point 由CF计算得到的数据点;
打个比方
隔壁王大爷是个报纸收藏爱好者,每天都会从邮递员小哥那儿(DS)拿到今天的报纸如xx报,xx报等(DST)。这时间一长啊,王大爷开始发愁这报纸怎么放啊,不能老丢在一堆儿啊,还想时不时地翻翻旧报纸,回味回味青涩时光呢。想个法。。。。。。
王大爷就想了个发儿,我找个屋子(RRD)专门放这些报纸,里面放几排书架(RRA),嘿,你还别说,有点图书室的霉味了。那该怎么摆呢?
a) 近几天的报纸看的比较多,那就最近10的每天(CF)都留着放到书架1(RRA1)---10张
b) 最近一个月呢?那就取最近30天的每三天有大事情的那一天(CF)报纸留着放书架2(RRA2)---10张
c)最近一年呢?那就取最近300天,每10天第一天(CF)的报纸留着放书架3(RRA3)---10张
d)......
这样啊王大爷一间屋子总存有最近10年的报纸,超期的就卖了,因为屋子装不下。
这样的方法好是好,可是苦了王大爷得每天整理啊~~~
其实以上也就是RRD的大致思路了,您需要的就是熟悉下每个参数了
image.png
-
rrdtool create
这个函数用于创建RRD数据库,需要哪些内容呢?名字,多久取值一次,从哪取值,值的类型呢,超时了咋办。怎么归档呢:多久合并一次,存储多少合并记录等等。。。
rrdtool create filename [--start|-b start time] [--step|-s step] [--template|-t template-file] [--source|-r source-file] [--no-overwrite|-O] [--daemon|-d address] [DS:ds-name[=mapped-ds-name[[source-index]]]:DST:dst arguments] [RRA:CF:cf arguments]
官方参数给了这么多,其实常用的也只是:
-s 表示step,多久取一次值;
DS:ds-name:{GAUGE | COUNTER | DERIVE | DCOUNTER | DDERIVE | ABSOLUTE}:heartbeat:min:max
这个表示数据源类型,心跳时间(过了就给unknown),值的范围(最小,最大);
RRA:{AVERAGE | MIN | MAX | LAST}:xff:steps:rows 表示归档的属性:归并函数,unknown值最大占比,步长(n个step),步数(即大小)
xff:表示当该RRA的时间间隔内unkown值占比为多少时,归并之后的值被记为unknown.
来个栗子:
rrdtool create temperature.rrd --step 300 \
DS:temp:GAUGE:600:-273:5000 \
RRA:AVERAGE:0.5:1:1200 \ // 这里对1个PDP取 average,实际就是一个 PDP
RRA:MIN:0.5:12:2400 \ // 12个PDP min 构成1个CDP,RRA存有2400个CDP的RRA
RRA:MAX:0.5:12:2400 \ // 12个PDP max 构成1个CDP,RRA存有2400个CDP的RRA
RRA:AVERAGE:0.5:12:2400 // 12个PDP average 构成一个CDP,RRA存有2400个CDP的RRA
-
rrdtool update
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--skip-past-updates|-s] [--daemon|-d address] [--] N:value[:value]... timestamp:value[:value]... at-timestamp@value[:value]...
这个函数主要用于更新数据,要添加数据:1. 时间点 2.数据
参数常用的是:
{**N** | *timestamp*}**:***value*[**:***value*]...
栗子呢
rrdtool update demo1.rrd N:3.44:3.15:U:23
在当前时刻(N)插入4个值:3.44,3.15,unknown,23;
rrdtool update demo2.rrd 887457267:U 887457521:22 887457903:2.7
在887457267(Unix时间戳)插入unknown,......
rrdtool update demo3.rrd -- -5:21 N:42
在前5s的时间点插入21,当前时刻插入42(当使用负值时,需要加入--)
-
rrdtool graph
这个函数主要定义绘制图形的一些参量:数据范围,图形等,具体参考:rrdtool graph
rrdtool graph|graphv filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]
常用的就是:
-t 定义标题
-s 定义起始时间
DEF:定义数据范围
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]
文中图片引用自:https://blog.51cto.com/freeloda/1307492
Q&A:
Q1:现在有一个RRD file,想找出一段时间范围内的MAX,MIN,AVERAGE等数据,怎么解决?
-
rrdtool fetch
用法:
rrdtool fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end|-e end] [--align-start|-a] [--daemon|-d address]
fetch
函数主要用在graph
里面,用来从RRDs中拿到数据,使用fetch
时,会尝试匹配resolution
解析度; -
间接利用 rrdtool graph
关于rrdgraph_data里DEF
,CDEF
,VDEF
的概念:
这三个命令主要是从RRD文件里提取数据,变更数据形式,或者找出其中的最大最小值等信息; -
DEF
<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>][:daemon=<address>]
e.g.
DEF:lasta=file.rrd:a:LAST
DEF:lastb=file.rrd:b:LAST
主要定义了如何从RRD file中取数据,如:ds,RRA,resolution,cf 等,返回是一个序列 -
CDEF
vname=RPN expression
e.g.
CDEF:lasttotal=lasta,lastb,+
对DEF
,CDEF
进行深加工,返回是一个序列 -
VDEF
vname=RPN expression
e.g.
VDEF:overallmaxtotal=maxtotal,interval
返回一个值
Ref1-stackoverflow
Ref2-stackoverflow
解析度(RESOLUTION)
解析度是RRD里很重要的概念,类似于分辨率的含义,用于表示一个RRA所能存储的时间粒度,对于RRA,数据总是存储在特定的时间节点,如当以5min为step,则存储的unix timestamp的值总是为300的整数倍。
rrdtool fetch subdata.rrd AVERAGE -r 15m -s -1h
这个语句要取得subdata.rrd
的AVERAGE
归档,resolution
为15min
,starttime
为过去1小时;但是很有可能取到的是其他解析度的RRA,因为开始与结束时间不匹配上述原则。
公众号关注哈施特的一天
,一起学习呀!|
网友评论