时间序列数据库rrdtool简介

2022-04-26 00:00:00 数据 数据库 时间 数据源 副本

一 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

  1. 相关文章