绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
时间序列数据库rrdtool简介
2022-04-26 10:55:57

一 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. 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格式)。利用数据你就可以引入任何你想要的绘图方法。

  1. rrdtool graph --imgformat PNG
  2. --width 600
  3. --height 100
  4. --start -3600
  5. --end -1
  6. --vertical-label download
  7. --title download
  8. --lower-limit
  9. DEF:download1.=1.0.rrd:d1:AVERAGE
  10. DEF:download2.=2.0.rrd:d1:AVERAGE
  11. LINE1:download1.#FF0000:download1.
  12. LINE1:download2.#0000FF:download2.

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  DEF:download1=1.0.rrd:d1:AVERAGE DEF:download2=2.0.rrd:d1:AVERAGE AREA:download1#FF0000:download1.:STACK  AREA:download2#0000FF:download2.:STACK

3 CDEF

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

例如: 计算两个值的比率

  1. rrdtool xport
  2. --start -300
  3. --end -1
  4. DEF:xx=1.0.rrd:d1:AVERAGE
  5. DEF:yy=2.0.rrd:d1:AVERAGE
  6. CDEF:aa=xx,yy,/
  7. XPORT:aa:"1.0 2.0rate"
  8. XPORT:xx:"1.0"
  9. XPORT:yy:"2.0"

4 展示一些数据的概要

  1. rrdtool graph
  2. download.png
  3. --imgformat PNG
  4. --width 600
  5. --height 100
  6. --start -3600
  7. --end 1452654360
  8. --vertical-label download_count
  9. --title download_count
  10. --lower-limit
  11. DEF:download=download_count.rrd:speed:AVERAGE
  12. VDEF:avg=download,AVERAGE
  13. LINE1:download#0000FF:download
  14. GPRINT:avg:"%6.2lf"
  1. rrdtool graph download.png \
  2. --imgformat PNG \
  3. --width 600 \
  4. --height 100 \
  5. --start end-3600 \
  6. --end 1452654360 \
  7. --vertical-label download_count \
  8. --title download_count \
  9. --lower-limit \
  10. DEF:download=download_count.rrd:speed:AVERAGE \
  11. VDEF:avg=download,AVERAGE \
  12. VDEF:max=download,MAXIMUM \
  13. VDEF:min=download,MINIMUM \
  14. VDEF:last=download,LAST \
  15. LINE1:download#0000FF:download \
  16. GPRINT:avg:"AVG\: %6.2lf" \
  17. GPRINT:max:"MAX\: %6.2lf" \
  18. GPRINT:min:"MIN\: %6.2lf" \
  19. GPRINT:last:"CURRENT\: %6.2lf"
  1. rrdtool graph success_download_count.png \
  2. --imgformat PNG \
  3. --width 600 \
  4. --height 100 \
  5. --start end-3600 \
  6. --end 1452654360 \
  7. --vertical-label success_download_count \
  8. --title success_download_count \
  9. --lower-limit \
  10. DEF:download=success_download_count.rrd:speed:AVERAGE \
  11. VDEF:avg=download,AVERAGE \
  12. VDEF:max=download,MAXIMUM \
  13. VDEF:min=download,MINIMUM \
  14. VDEF:last=download,LAST \
  15. LINE1:download#0000FF:success_download \
  16. GPRINT:avg:"AVG\: %6.2lf" \
  17. GPRINT:max:"MAX\: %6.2lf" \
  18. GPRINT:min:"MIN\: %6.2lf" \
  19. GPRINT:last:"CURRENT\: %6.2lf"

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

  1. rrdtool graph success_download_and_download_count.png \
  2. --imgformat PNG \
  3. --width 600 \
  4. --height 100 \
  5. --start end-3600 \
  6. --end 1452654360 \
  7. --vertical-label download_count \
  8. --title download_count \
  9. --lower-limit \
  10. DEF:download=download_count.rrd:speed:AVERAGE \
  11. DEF:success_download=success_download_count.rrd:speed:AVERAGE \
  12. VDEF:download_avg=download,AVERAGE \
  13. VDEF:download_max=download,MAXIMUM \
  14. VDEF:download_min=download,MINIMUM \
  15. VDEF:download_last=download,LAST \
  16. VDEF:sdownload_avg=success_download,AVERAGE \
  17. VDEF:sdownload_max=success_download,MAXIMUM \
  18. VDEF:sdownload_min=success_download,MINIMUM \
  19. VDEF:sdownload_last=success_download,LAST \
  20. LINE1:download#0000FF:success_download \
  21. GPRINT:download_avg:"AVG\: %6.2lf" \
  22. GPRINT:download_max:"MAX\: %6.2lf" \
  23. GPRINT:download_min:"MIN\: %6.2lf" \
  24. GPRINT:download_last:"CURRENT\: %6.2lf" \
  25. LINE1:success_download#FF00FF:success_download \
  26. GPRINT:sdownload_avg:"AVG\: %6.2lf" \
  27. GPRINT:sdownload_max:"MAX\: %6.2lf" \
  28. GPRINT:sdownload_min:"MIN\: %6.2lf" \
  29. GPRINT:sdownload_last:"CURRENT\: %6.2lf"

两条曲线相除

  1. rrdtool graph success_download_rate.png \
  2. --imgformat PNG \
  3. --width 600 \
  4. --height 100 \
  5. --start end-3600 \
  6. --end 1452654360 \
  7. --vertical-label "success_download_rate percentage" \
  8. --title success_download_rate \
  9. --lower-limit \
  10. DEF:download=download_count.rrd:speed:AVERAGE \
  11. DEF:success_download=success_download_count.rrd:speed:AVERAGE \
  12. CDEF:success_rate=success_download,download,/,100,* \
  13. VDEF:avg=success_rate,AVERAGE \
  14. VDEF:max=success_rate,MAXIMUM \
  15. VDEF:min=success_rate,MINIMUM \
  16. VDEF:last=success_rate,LAST \
  17. LINE1:success_rate#00FFFF:success_download_rate \
  18. GPRINT:avg:"AVG\: %6.2lf%%" \
  19. GPRINT:max:"MAX\: %6.2lf%%" \
  20. GPRINT:min:"MIN\: %6.2lf%%" \
  21. GPRINT:last:"CURRENT\: %6.2lf"

rrdcache有什么用

[TODO]

转载于:https://my.oschina.net/costaxu/blog/645840

分享好友

分享这个小栈给你的朋友们,一起进步吧。

RRDtool
创建时间:2022-04-26 10:31:50
RRDtool
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • gaokeke123
    专家
戳我,来吐槽~