RRDTool 存储原理简介——基于时间序列的环型数据库

时间:2021-03-09 04:56:19

转自:http://www.jianshu.com/p/b925b1584ab2

RRDTool是一套监测工具,可用于存储和展示被监测对象随时间的变化情况。比如,我们在 Windows 电脑上常见的内存和 CPU 使用情况。

RRD 全称是 Round Robin Database ,即「环型数据库」。顾名思义,它是一种循环使用存储空间的数据库,适用于存储和时间序列相关的数据。

RRD 数据库在被创建的时候就已经定义好了大小,当空间存储满了以后,又从头开始覆盖旧的数据,所以和其他线性增长的数据库不同,RRD 的大小可控且不用维护。

你可以把 RRD 理解为一个有时间刻度的圆环,每个刻度上可以存储一个数值,同时有一个从圆心指向最新存储值的指针。

可以想象,随着时间推移,指针会绕着圆心一直移动下去,当它指向下一个刻度后,就可以在那个位置上存储一个新的数值。但是,指针只能绕一个方向前进,假设你存储了时刻3的监测值,那就不能再存储时刻2的监测值了。如下图所示:

RRDTool 存储原理简介——基于时间序列的环型数据库
圆环

创建 RRD 基本语法

rrdtool create filename 

[--start|-b start-time]

[--step|-s step]

[DS:ds-name:DST:dst-arguments]

[RRA:CF:xff:step:rows]

其中

rrdtool create filename

表示使用 rrdtool 命令 create 创建一个名为 filename 的数据库文件,通常 RRD 数据库文件的后缀为 .rrd ,但是你随便使用文件名也不会有影响。

--start|-b start-time

这个选项表示 RRD 数据库的起始 (start/begin) 时间点为 start-time,这是一个从 1970-01-01 00:00:00 开始计时,以秒为间隔的一个整数值。所以,start-time 是一个代表时间点的整数值,表示 RRD 数据库记录的监测值从这个时刻开始。

[--step|-s step]

这个选项表示监测的时间间隔,即多久时间去获取一次被监测对象的数值,默认值为5分钟(300秒)。比如,我们可以从10:00开始每60秒去获取一次电脑内存的使用值,这个时候 step 就是 60,获取到的数值如下图所示:

RRDTool 存储原理简介——基于时间序列的环型数据库
每隔60秒获取监测值

[DS:ds-name:DST:dst-arguments]

这个选项用来定义数据源(Data Source)属性,包括数据源名称 ds-name,比如我们可以给监测内存使用率的数据源命名为 memory-rate。

还要定义数据源类型(Data Source Type),常用的有以下4种数据源类型,分别是:

1、GAUGE

实测值,RRD 将如实记录,比如温度变化曲线:

RRDTool 存储原理简介——基于时间序列的环型数据库
温度变化曲线

2、COUNTER

计数值,这是一个只增不减的正整数。比如,汽车行驶里程,从汽车第一次上路开始,里程就从0开始不断增长。

汽车里程表

假设每隔30分钟监测一次汽车里程,当 RRD 收到 COUNTER 类型的数据时,并不会像 GAUGE 类型那样直接存储,而是计算变化率:

RRDTool 存储原理简介——基于时间序列的环型数据库
汽车里程监测

计算原理: (12121km - 12100km) / (10:30 - 10:00) = 11000m / 1800s = 6.11m/s

所以,RRD 对于 COUNTER 类型的数据源存储的是变化率,对于上述里程表而言就是行驶速度。

(注:第一个存储值为 UNKNOWN,因为没有更早的数据,所以没有变化可言)

3、ABSOLUTE

ABSOLUTE 类型存储的也是变化率,假设我们正在微信和好友聊天,每五分钟我们会看一下有没有新消息,如果有的话就立即处理,这样未读提醒就会变为0,然后下一个五分钟后继续看未读新消息数,会得到这样一个监测表:

RRDTool 存储原理简介——基于时间序列的环型数据库
微信未读消息

计算原理:120条 / 300秒 = 0.4条/秒

这样我们就可以知道一段时间内聊天快慢的情况,数值越大表示5分钟内收到的未读消息越多,聊天也就越火热。

4、DERIVE

DERIVE 类型存储的也是变化率,和 COUNTER 类型不同的是,监测值可以增长也可以下降,例如水库的水位监测:

RRDTool 存储原理简介——基于时间序列的环型数据库
水库水位监测

可以看到水位一时升高,一时降低,通过计算变化率能够监测某一时段水位正在升高还是降低,以及相应的速度。

[RRA:CF:xff:step:rows]

RRA (Round Robin Archive) 是用来定义 RRD 数据库归档模型,RRDTool 绘图展示监测情况的时候就从 RRA 中获取数据。

为什么不直接获取存储的原始数据来绘图呢?

这得从监测场景的实际需求出发,通常我们对最近一小时或一天的监测数据最关心,对于一个月或者一年以上的监测数据有个大概的认知就可以。

假设我们每秒监测一次某台服务器 CPU 使用率,那么一年后将获得:

1 x 60秒 x 60分钟 x 24小时 x 365天 = 31536000

个监测值。

如果这么多数据点在一张图表上展示,即使一个数据点只占一个像素,你也可以想象得多长的图片才能完整展示监测数据。

但是,如果我们把每60秒监测的60个原始数据点计算出一个平均值 AVERAGE(d1,d2,d3,...,d60) 的话,这样数据量就比使用原始值降低了60倍!这种经过计算平均值后得到的数据称为归档值。

虽然丧失了一定的精度,但是并不影响我们观察一年来的变化趋势。

RRD 提供的归档方法有4种,除了上述的计算平均值 AVERAGE 方法外,还有:

计算最大值 MAX(d1,d2,d3,...dn) = 最大的那个监测值

计算最小值 MIN(d1,d2,d3,...dn) = 最小的那个监测值

计算最后值 LAST(d1,d2,d3,...dn) = 最后的那个监测值