文档章节

时间序列数据库rrdtool简介

costaxu
 costaxu
发布于 2016/03/23 11:04
字数 2625
阅读 321
收藏 0

一 rrdtool数据库是什么

rrdtool是一个数据库。奇葩的一点是,作为一个数据库,它不是sql,也不是nosql。这是因为,它保存的所有的数据都是基于时间的。我觉得从某种意义上来说,它是一个<timestamp, value>数据库。

在下面这样的一个时间序列中(假如0 5 10 15 20 是时间标尺):

0-----5------10-----15-----20-----25-----30----->

0.1----0.2----0.3---0.4----0.5----0.6----0.7

你的数据就像随着时光不停向前流淌。。。

面对这样的数据的存储和查询,可能存在着几个问题?

1 时间戳取整的问题。也就是说数据点之间的间隔无论大小是多少,比如60s,那么你所有的应用程序来写数据库的时候,必须用同样的方式进行时间戳的取整换算。

比如你想插入一条数据<1458891844, 0.1>。

为了让数据点按照一定规律排列,你得把时间戳进行一些换算。

当然你可以进行最简单的换算,例如对于60为单位向下取整。

但无论能如何换算,你必须有一个统一的算法。这样的算法,无论存在客户端和服务端都需要一定的工作。比如在客户端你得提供一个库进行换算,如果任由所有的应用程序自己换算,谁也不知道能否确保大家按照统一的算法。

2 时间点的聚合的问题。

0-----5------10-----15-----20-----25-----30----->

0.1----0.2----0.3---0.4----0.5----0.6----0.7

还是以这样的数据序列为例。

这个时间序列是以5秒钟为一个刻度来保存数据的。如果客户端可能需要按10秒钟、30秒钟甚至60秒钟为刻度来取数据。你该如何应付?

对于普通的数据库,那么自然只有两种选择,一种是先计算。一种可行的算法就是就是在应用程序在插入数据的时候将数据保存一份缓存在内存中,再通过单独的线程定时(10秒、30秒、60秒)周期性的计算,然后再存储这些数据。

这当然不是优雅的做法。

3 两条甚至多条时间序列的合并问题。

这个问题实际上是一个常见的现实问题,可能任何做时间序列存储的人都无法逃避。

例如你是一个石油制造商,你有两个油井。每个油井的产油量都是一条时间序列记录下每天的产量。如果有一天你突然想知道你的每天的总产量?

恐怕问题还会更复杂。

4 存储空间的问题

随着时间而膨胀的数据无疑会占用越来越多的存储空间。而可能对于你来说所关注的只是近期的一些数据,那么你就得定期删除掉一些遥远的数据。

也许你会问一个问题为什么要我来做这样的事情?

rrdtool的全称是round robin database tool。每个rrdtool数据库文件,只保存一条时间序列。每隔一段时间,它都会保存下数据的一个副本。随着时间的推移,保存的副本会越来越多,查询的速度也会越来越慢,如何应对呢?rrdtool的办法是无论如何我只保留固定数量的副本,如果超过这个量,我就会渐渐抛弃最先保存的数据副本。

1 rrdtool的对外接口

rrdtool对外提供一个数据的命令行工具rrdtool。这个命令行工具和svn git等工具的用法也是差不多的。都是用

rrdtool 子命令 文件名 参数1 参数2 。。。

这样的格式提供的。

常用的命令有: rrdtool create 创建数据库

rrdtool info 查看数据库的信息

rrdtool graph 绘图或者输出数据

rrdtool dump 输出整个数据库的数据

2安装

###centos等

sudo yum install -y rrdtool-devel

###debian等 [TODO]

###编译安装

如果你需要一些rrdtool的新的功能,例如用json输出数据,你就得编译安装一个新版本了。(可能gentoo等滚动的Linux版本的软件库中有最新版本的rrdtool)

首先你得安装一些第三方的库:

sudo yum install pcre-devel glib2-devel libpng-devel libxml2-devel pango -y

然后编译安装

./configure --prefix=/usr/local/rrdtool-1.5.5/;make

configure中可能会检测到你缺少一些库,自己需要寻找一下。

二 创建数据库

rrdtool create

创建数据库是使用下面的命令:

rrdtool create success_download_count.rrd --step 60 DS:speed:GAUGE:120:0:10000 RRA:AVERAGE:0.5:1:60

success_download_count.rrd是数据库的存放位置。一般来说rrd是默认的后缀名。你可以把数据库放在任何的位置都可以。

--step 60 是数据副本的间隔。单位是秒

DS:speed:GAUGE:120:0:10000 数据源的定义。

RRA:AVERAGE:0.5:1:60 是RRA的定义

1 数据源

DS:speed:GAUGE:120:0:10000 数据源的定义。

DS是DataSource的缩写。

speed是数据源的名字,可以任意指定。最长19字符,只能允许 [a-zA-Z0-9_]这些字符。

GAUGE是数据源的类型。GAUGE表示标量。

还有其他的类型如COUNTER表示计数器(只能递增)等。

COMPUTER表示计算。可以用逆波兰表达式来表示计算公式

120表示heartbeat时间,单位是秒。时间序列数据库对于数据存储的时间是有要求的,两次数据更新的时间不能超过heartbeat时间,否则该数据点的值将被记录为NaN,表示数据点不存在。

DS中的数据点被成为PDP = Primary Data Point。

0 最小值。如果不想设置,则设置为U。

10000 最大值。如果不像设置,则设置为U。

数据源类型 COMPUTE

[todo]

2 RRA

RRA:AVERAGE:0.5:1:60

RRA = round robin archive。实际的存储在RRA。

AVERAGE表示数据落地的计算方式。RRA中也存在多个数据副本。它的一个数据副本是对于DS中的多个数据副本的一个合并。有AVERAGE, MIN, LAST, MAX这集中合并计算的方式。

0.5 这个是容错率,也是可以容忍的PDP最大的丢失率。如果一段时间内数据副本缺失率在0.5一下,那么这个数据副本依然可以被计算。否则不可计算,标识为数据不存在。

1 step,表示由多少个Primary Data Point组合成为一个RRA中的数据点。1表示1对1。

60 表示数据的副本数量。

3 rra和ds有什么区别

rra是真正的存储。rra = round robin archive

DS不是真正的物理存储,它只是一个逻辑上的概念。

4 一个rrd文件中有多个ds吗?

可以

三 更新数据 rrdtool update

rrdtool update xxx.rrd N:0.1

N代表当前时间戳。当然你也可以填写一个数字的时间戳。例如1601342121

四 修复数据rrdtool restore

rrdtool restore data.xml download_count.rrd , 注意restore之前,rrd文件必须删除。

五 数据的输出rrdtools graph

rrdtool graph是rrdtool的绘图的功能。它可以把数据库中保存的数据按照要求输出成一张图片。

当然也可以只输出数据(json格式或者xml格式)。利用数据你就可以引入任何你想要的绘图方法。

rrdtool graph --imgformat PNG 
--width 600 
--height 100 
--start -3600 
--end -1 
--vertical-label download 
--title download 
--lower-limit 0 
DEF:download1.0=1.0.rrd:d1:AVERAGE
DEF:download2.0=2.0.rrd:d1:AVERAGE 
LINE1:download1.0#FF0000:download1.0 
LINE1:download2.0#0000FF:download2.0

height和width的单位像素。定义的是实际数据区的大小。 By default, the width and height of the canvas (the part with the actual data and such). This defaults to 400 pixels by 100 pixels.

--start -3600 开始时间。负数表示从现在开始倒推。

--end -1 结束时间

--vertical-label download 指标的名称。显示在图片的左边那一列。

--title download 图片的名称。显示在图片上方那一行。

--lower-limit 0 竖轴的最小值。

1 DEF

DEF的定义是

DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]

为了简单理解DEF,可以把DEF理解成图上的一条线(或者是一片区域也可以)。他的主要目的是直接把数据库中的一些数据拿出来展示。

DEF:download1.0=1.0.rrd:d1:AVERAGE

定义了一条download1.0的曲线。它来自于1.0.rrd这个数据库的d1这个数据源。利用AVERAGE的方式进行聚合。

2 区域的显示方法

rrdtool graph aggregate.png --imgformat PNG --width 600 --height 100 --start -3600 --end -1 --vertical-label download --title download --lower-limit 0 DEF:download1=1.0.rrd:d1:AVERAGE DEF:download2=2.0.rrd:d1:AVERAGE AREA:download1#FF0000:download1.0:STACK  AREA:download2#0000FF:download2.0:STACK

3 CDEF

CDEF比DEF更加高级一点。可以对曲线进行计算。

例如: 计算两个值的比率

rrdtool xport 
--start -300 
--end -1 
DEF:xx=1.0.rrd:d1:AVERAGE 
DEF:yy=2.0.rrd:d1:AVERAGE  
CDEF:aa=xx,yy,/ 
XPORT:aa:"1.0 2.0rate" 
XPORT:xx:"1.0" 
XPORT:yy:"2.0"

4 展示一些数据的概要

rrdtool graph 
download.png 
--imgformat PNG 
--width 600 
--height 100 
--start -3600 
--end 1452654360 
--vertical-label download_count 
--title download_count 
--lower-limit 0 
DEF:download=download_count.rrd:speed:AVERAGE   
VDEF:avg=download,AVERAGE 
LINE1:download#0000FF:download 
GPRINT:avg:"%6.2lf"
rrdtool graph download.png \
--imgformat PNG \
--width 600 \
--height 100 \
--start end-3600 \
--end 1452654360 \
--vertical-label download_count \
--title download_count \
--lower-limit 0 \
DEF:download=download_count.rrd:speed:AVERAGE   \
VDEF:avg=download,AVERAGE \
VDEF:max=download,MAXIMUM \
VDEF:min=download,MINIMUM \
VDEF:last=download,LAST \
LINE1:download#0000FF:download \
GPRINT:avg:"AVG\: %6.2lf" \
GPRINT:max:"MAX\: %6.2lf" \
GPRINT:min:"MIN\: %6.2lf" \
GPRINT:last:"CURRENT\: %6.2lf"
rrdtool graph success_download_count.png \
--imgformat PNG \
--width 600 \
--height 100 \
--start end-3600 \
--end 1452654360 \
--vertical-label success_download_count \
--title success_download_count \
--lower-limit 0 \
DEF:download=success_download_count.rrd:speed:AVERAGE   \
VDEF:avg=download,AVERAGE \
VDEF:max=download,MAXIMUM \
VDEF:min=download,MINIMUM \
VDEF:last=download,LAST \
LINE1:download#0000FF:success_download \
GPRINT:avg:"AVG\: %6.2lf" \
GPRINT:max:"MAX\: %6.2lf" \
GPRINT:min:"MIN\: %6.2lf" \
GPRINT:last:"CURRENT\: %6.2lf"

合并两条线并展示legend中含有最大值最小值的方法

rrdtool graph success_download_and_download_count.png \
--imgformat PNG \
--width 600 \
--height 100 \
--start end-3600 \
--end 1452654360 \
--vertical-label download_count \
--title download_count \
--lower-limit 0 \
DEF:download=download_count.rrd:speed:AVERAGE   \
DEF:success_download=success_download_count.rrd:speed:AVERAGE   \
VDEF:download_avg=download,AVERAGE \
VDEF:download_max=download,MAXIMUM \
VDEF:download_min=download,MINIMUM \
VDEF:download_last=download,LAST \
VDEF:sdownload_avg=success_download,AVERAGE \
VDEF:sdownload_max=success_download,MAXIMUM \
VDEF:sdownload_min=success_download,MINIMUM \
VDEF:sdownload_last=success_download,LAST \
LINE1:download#0000FF:success_download \
GPRINT:download_avg:"AVG\: %6.2lf" \
GPRINT:download_max:"MAX\: %6.2lf" \
GPRINT:download_min:"MIN\: %6.2lf" \
GPRINT:download_last:"CURRENT\: %6.2lf" \
LINE1:success_download#FF00FF:success_download \
GPRINT:sdownload_avg:"AVG\: %6.2lf" \
GPRINT:sdownload_max:"MAX\: %6.2lf" \
GPRINT:sdownload_min:"MIN\: %6.2lf" \
GPRINT:sdownload_last:"CURRENT\: %6.2lf"

两条曲线相除

rrdtool graph success_download_rate.png \
--imgformat PNG \
--width 600 \
--height 100 \
--start end-3600 \
--end 1452654360 \
--vertical-label "success_download_rate percentage" \
--title success_download_rate \
--lower-limit 0 \
DEF:download=download_count.rrd:speed:AVERAGE   \
DEF:success_download=success_download_count.rrd:speed:AVERAGE   \
CDEF:success_rate=success_download,download,/,100,* \
VDEF:avg=success_rate,AVERAGE \
VDEF:max=success_rate,MAXIMUM \
VDEF:min=success_rate,MINIMUM \
VDEF:last=success_rate,LAST \
LINE1:success_rate#00FFFF:success_download_rate \
GPRINT:avg:"AVG\: %6.2lf%%" \
GPRINT:max:"MAX\: %6.2lf%%" \
GPRINT:min:"MIN\: %6.2lf%%" \
GPRINT:last:"CURRENT\: %6.2lf"

rrdcache有什么用

[TODO]

© 著作权归作者所有

costaxu

costaxu

粉丝 147
博文 56
码字总数 86451
作品 0
深圳
程序员
私信 提问
开源的企业级监控系统 Cacti 简介

Cacti是一款网络流量监测图形分析工具,把LAMP的功能都结合起来,用于网络流量监控,操作起来非常方便!让我们认识下Cacti简介及工作流程。 一、Cacti简介 1. cacti是用php语言实现的一个软件...

寰宇01
2018/08/13
0
0
Ossim下RRDTool实战

Ossim下RRDTool实战 RRDtool 就是使用类似的方式来存放数据的工具,RRDtool 所使用的数据库文件的后缀名是.rrd(主要在 OSSIM系统的/var/lib/ossim/rrd/、/var/lib/munin/alienvault/目录、/...

OSSIM
2015/06/18
0
0
应用开源工具监控企业局域网安全:原理及准备工作

一监控分类 在Linux系统上的系统监测所采用的方式基本上有两种, 第一种,通过SNMP协议结合数据采集软件来实现: 这种方法所涉及的架构一般包括两部分,其中一部分是被监测服务器,另外一部分...

蓝蝶飞扬
2014/03/17
0
0
Cacti 1.2.0 发布,网络流量监测图形分析工具

Cacti 1.2.0 已发布。Cacti 是一套基于 PHP、MySQL、SNMP 及 RRDTool 开发的网络流量监测图形分析工具。 Cacti 是 RRDTool 的完整前端,它存储所有必要的信息来创建图形,并在 MySQL 数据库中...

麦老师
01/03
0
0
fatal error: rrd.h: No such file or directory

ubuntu安装rrdtool提示rrd.h找不到 root@vfast-virtual-machine:~/python# pip3 install rrdtool Collecting rrdtool Downloading https://files.pythonhosted.org/packages/21/cc/26370aad2......

珊子的木瓜
2018/05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部