`

RRDTool 存储原理简介

阅读更多

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

 
电脑内存和  CPU 使用情况

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

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

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

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

 
圆环

创建 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 开始计时,以秒为间隔的一个整数值。

如图所示:

 
时间轴

A点是从 1970-01-01 00:00:00 开始经过0秒后到达的时间点;

B点是从 1970-01-01 00:00:00 开始经过658108920秒后到达的时间点 1990-11-09 00:02:00;

C点是从 1970-01-01 00:00:00 开始经过1458763813秒后到达的时间点 2016-03-23 20:10:13。

所以,start-time 是一个代表时间点的整数值,表示 RRD 数据库记录的监测值从这个时刻开始。

[--step|-s step]

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

 
每隔60秒获取监测值

 

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

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

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

1、GAUGE

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

 
温度变化曲线

2、COUNTER

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

 
汽车里程表

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

 
汽车里程监测

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

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

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

3、ABSOLUTE

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

 
微信未读消息监测
 
微信未读消息

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

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

4、DERIVE

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

 
水库水位监测

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

[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) 的话,那么将有:


1 x 60分钟 x 24小时 x 365天 = 525600

个平均值。

这样数据量就比使用原始值降低了60倍!这种经过计算平均值后得到的数据称为归档值。

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

同理,如果我们把每小时监测的3600个原始数据点计算一个归档平均值的话,数据点就只有24 x 365 = 8760个了。这就是绘图展示监测情况的时候要使用 RRA 归档数据的原因。

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

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

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

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

这里还涉及到两个基本概念:

PDP (Primary Data Point) 原始数据点

CDP (Consolidation Data Point) 归档数据点

由上述介绍可以知道:一个 CDP 由多个 PDP 经过归档函数计算得到。

在定义 RRA 的时候,一般的语法为:

RRA:CF:xff:steps:rows

表示使用{AVERAGE | MIN | MAX | LAST}中的一个归档函数  CF (Consolidation Function)。

xff 是 xfiles 因子(factor),表示超过多少比率的有效 PDP 才可以计算出 CDP,通常为0.5。

如果我们设置 xff 为 0.5,即有大于50%的有效监测值就可以在这些有效值上计算出归档值,否则这段时间内的归档值记为 UNKNOWN。

例如,我们监测的10个时间点中,因为某些原因其中4个无法获取监测值,即监测值为 UNKNOWN,那么还剩6个有效的监测值,这时候有效率为60%,所以可以获得归档值。

steps 表示多少个 PDP 计算出一个 CDP,例如,在每秒获取一个监测值的实例中,steps = 60 表示每60个原始数据计算一个归档数据,即一分钟一个数据点;steps = 3600 表示每3600个原始数据计算一个归档数据,即一小时一个数据点。

 rows 表示多少个 CDP 组成一个 RRA。

通常一个 RRD 数据库可以有多个不同精度的 RRA,其中周期( steps * rows)最长的的 RRA 同时也规定了 RRD 的周期,这就是开头说的:RRD 数据库在创建的时候就已经定义好大小。

使用命令创建一个名为 test.rrd 的 RRD 数据库:

rrdtool create test.rrd

--step 300

DS:miles:COUNTER:600:0:1024

RRA:AVERAGE:0.5:2:8

RRA:AVERAGE:0.5:4:7

 
RRD 数据库模型(U 表示 UNKNOWN)

--step 300

表示监测时间间隔为5分钟。

DS:miles:COUNTER:600:0:1024

表示数据源的名称 为 miles,数据源类型(DST) 为 COUNTER,数据源的 heartbeat 周期为 600秒,如果一个 heartbeat 时间周期内监测数据还没有获取到,那么 RRD 自动将监测值设置为 UNKNOWN,数据源的最小值为0,最大值为1024,如果获得的监测值不在这个范围, RRD 自动将监测值设置为 UNKNOWN。

RRA:AVERAGE:0.5:2:8

定义了一个 RRA :归档函数是求平均值 AVERAGE,xff 因子是 0.5,每2个监测值 PDP 将计算一个归档值 CDP,总共存储 8 个 CDP,所以这个 RRA 的时间周期是 300s x 2 x 8 = 4800s。

如上图示例可知,CDP(RRA1-AVG) 的各项值为 

(1+2)/2 = 1.5

(3+4)/2 = 3.5

......

 

RRA:AVERAGE:0.5:4:7

定义了一个 RRA :归档函数是求平均值 AVERAGE,xff 因子是 0.5,每4个监测值 PDP 将计算一个归档值 CDP,总共存储 7 个 CDP,所以这个 RRA 的时间周期是 300s x 4 x 7 = 8400s。

如上图示例可知,CDP(RRA2-AVG) 的各项值为

(1+2+3+4)/4 = 2.5

(5+6+7+8)/4 = 6.5

......

 

上述两个 RRA 中,最长时间周期为 8400s,由于 RRD 定义的监测周期为 300s,所以这个 RRD 将存储 8400/300 = 28个监测值。

因为 RRA 的长度 rows 也是定义好的,所以随着时间推移,监测值越来越多的时候,RRA 的内容也随之变化:

 
时间推移

当 RRDTool 绘制监测图表的时候,会优先选取精度(solution)高的 RRA 数据,上图示例中,显然 RRA1-AVG 的精度要高于 RRA2-AVG,或者说更接近原始数据。

但是,一个前提条件是所选的 RRA 能够覆盖我们希望图表展示的时间周期,上图示例中 RRA1-AVG 只覆盖了 第5-20个监测点,所以当我们希望看到从第1-20个监测点的数据时,只能选择 RRA2-AVG 了,虽然它精度不如 RRA1-AVG,但至少它覆盖到了我们希望看到的时间周期。

所以,在实际应用场景中,我们通常会定义多个 RRA,覆盖时间周期短的精度高,比如最近一天的监测值;覆盖时间周期长的精度低,比如最近一年的监测值。

以上是 RRD 数据库的内部存储原理,那么如何更新它的存储值呢?

通常,我们会借用外部程序,如 Shell、Python、Ruby等脚本语言,获取被监测对象的数值,然后使用 RRDTool update 命令存储监测值,例如:

rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363 ......

表示时间点920804700时,被监测对象数值为12345

表示时间点920805000时,被监测对象数值为12357

表示时间点920805300时,被监测对象数值为12363

......

最后,要展示监测数据了,RRDTool 内置了绘图表功能,你可以直接使用类似以下的命令行输出一张 png 图片:

rrdtool graph myrouter-day.png --start -86400 

DEF:inoctets=myrouter.rrd:input:AVERAGE 

DEF:outoctets=myrouter.rrd:output:AVERAGE 

AREA:inoctets#00FF00:"In traffic" 

LINE1:outoctets#0000FF:"Out traffic"

上述命令表示:创建一张名为 myrouter-day.png 的图片,监测时间从一天前(60x60x24=86400)开始的路由器进出流量统计。其中流进流量使用区域图(AREA),颜色为绿色(#00FF00);流出流量使用一个像素宽的曲线图(LINE1),颜色为蓝色(#0000FF)。

但是,RRDTool 也可以将数值输出,然后我们使用第三方的绘图工具,绘制监测图,这样可以在 WEB 上更灵活的展示监测数值。

如下图所示,就是 Open-Falcon 使用 RRDTool 存储监测数据,然后获取监测数据在网页上绘制趋势图:

 
服务器负载监测


 

rel: https://www.jianshu.com/p/b925b1584ab2

分享到:
评论

相关推荐

    rrdtool-1.2.26.tar.gz

    RRDtool,全称为Round Robin Database Tool,是由Tobias Oetiker开发的一款开源数据存储和图形化工具,它专为时间序列数据库设计,广泛应用于系统监控、网络管理等领域。本文将深入探讨RRDtool的核心功能、工作原理...

    rrdtool-1.7.2.tar.gz

    《rrdtool-1.7.2:Linux系统的高效数据监控与存储利器》 rrdtool,全称为“Round Robin Database Tool”,...通过深入理解rrdtool的工作原理和使用技巧,IT管理员能更好地掌握系统的运行状态,提升系统性能和稳定性。

    rrdtool-1.2.15-cygwin-1.5.20.zip

    rrdtool,全称为Round Robin Database Tool,是由Tobias Oetiker开发的一款强大的时序数据存储和图形化工具,主要用于收集、存储、检索和展示时间序列数据。该工具以其高效、灵活的特点,广泛应用于系统监控、网络...

    rrdtool lib

    学习rrdtool lib,你需要了解基本的RRD数据结构,掌握API调用方式,理解其时间序列数据处理的原理。此外,熟悉基本的命令行用法有助于更好地理解和调试程序。rrdtool的官方文档和社区资源是很好的学习资料。 总结来...

    rrdtool工具包

    **RRDTool简介** RRDTool的主要功能是创建和维护一种特殊类型的数据库,称为"圆环形数据库"(Round Robin Database),这种数据库能够高效地存储时间序列数据。RRDTool的设计目标是将存储空间和计算资源的使用降到...

    RRDTool 教程

    RRDTool,全称为“Round Robin Database Tool”,是由Tobias Oetiker开发的一款开源工具,主要用于创建、更新和查询时间...记得实践是检验真理的唯一标准,动手操作RRDTool的各项功能,才能真正理解其工作原理和优势。

    rrdtool-1.0.50.tar.gz

    解压后,我们可以看到包含Makefile、src、doc等多个目录和文件,这些文件包含了源代码、文档、配置脚本等,是编译和理解rrdtool工作原理的基础。 三、编译环境准备 在编译rrdtool前,确保系统已经安装了必要的依赖...

    php_rrdtool.tar.gz

    本文将详细阐述PHP_RRDTool的使用原理、功能特点以及如何在实际项目中部署和应用。 一、PHP_RRDTool简介 PHP_RRDTool是由PHP编写的扩展,其核心是利用RRDTool的强大功能。RRDTool由Tobias Oetiker开发,是一款开源...

    rrdtool 1.6.0

    1. **数据存储**:rrdtool支持多种数据源类型,如GAUGE(无符号单点取值)、COUNTER(递增计数)、DERIVE(速率计算)等,可根据需求选择合适的数据类型。 2. **更新与整合**:可以定期或按需更新数据,并使用内置...

    rrdtool-1.2.27.tar.gz

    《RRDTool 1.2.27:Cacti监控系统的重要组件》 RRDTool,全称为“Round Robin Database Tool”,是由Tobi Oetiker开发的一款...通过理解RRDTool的工作原理和特点,我们可以更好地利用它来维护和优化我们的网络环境。

    rrdtool-1.5.5.tar.gz

    RRDtool的工作原理是通过一种称为"round robin"的数据库结构,有效地存储和管理大量的时间序列数据,即使在长时间跨度下也能保持数据的紧凑性。 在安装RRDtool-1.5.5时,首先需要解压"rrdtool-1.5.5.tar.gz",这...

    rrdtool-1.2.11.tar.gz

    在本篇中,我们将深入探讨 rrdtool 的核心功能、工作原理以及1.2.11版本的主要特性。 1. **rrdtool 的基本概念** - **Round Robin**:这是 rrdtool 数据存储的核心机制。它将数据以固定的时间间隔(称为步长)...

    rrdtool-1.4.5.tar.gz

    rrdtool,全称为Round Robin Database Tool,是由Tobi Oetiker开发的一款强大的时间序列数据库工具,它专用于收集、存储、查询以及绘制有关网络、系统和其他监控数据的图形。在rrdtool 1.4.5版本中,我们看到了许多...

    rrdtool-1.2.23.tar.gz

    在本篇文章中,我们将深入探讨RRDTool的核心特性、工作原理以及如何利用1.2.23版本进行数据处理。 一、RRDTool核心特性 1. 数据压缩:RRDTool采用了独特的数据压缩技术,能够在不丢失精度的情况下,有效节省存储...

    rrdtool-1.7.2-hppa_32-11.31.depot.gz

    总的来说,RRDTool-1.7.2-hppa_32-11.31是一个在HP-UX环境下进行时间序列数据管理的强大工具,虽然它可能不再受支持,但了解其工作原理和使用技巧对于熟悉RRDTool家族的其他版本以及理解监控系统的基础架构仍然...

    RRD与JRobin

    JRobin的文件结构和工作原理在"JRobin简介_files"中有所说明。 "监控CPU的使用情况.html"和"监控CPU的使用情况_files"提供了关于如何跟踪和分析CPU使用情况的具体步骤,无论你是使用RRDTool还是JRobin,这些知识都...

    Cacti搭配Nagios攻略

    2. 数据存储层:MySQL存储配置信息和元数据,RRDtool存储和处理监控数据。 3. 数据采集层:Net-SNMP负责SNMP协议的数据采集,也可以通过自定义脚本进行扩展。 四、Cacti安装步骤 1. 在全新安装的Linux系统中,选择...

    cacti087e_f5_bigip-20100628-yrg.zip

    【标题】"cacti087e_f5_bigip-20100628-yrg.zip" 指的是一个特定版本的Cacti监控模板与F5 Big-...这涉及到的知识点包括Cacti的安装与配置、RRDTool的数据存储原理、F5 Big-IP设备的监控指标、以及XML模板的解析与应用。

    cacti+nagios完美部署

    本文将详细介绍 Cacti 和 Nagios 的完美部署,包括 Cacti 和 RRDTool 的安装部署、Cacti 的架构图、Cacti 的工作原理图、Cacti 的优点和缺点等。 一、Cacti 和 RRDTool 的安装部署 Cacti 是一个基于 PHP 的网络...

    关于rrd文件大量并发写的I/O问题调研(二)

    5. **RRDtool的源码分析**:作者可能深入研究了RRDtool的源码,找出其在处理并发写入时的关键瓶颈,并提出了改进方案。 6. **替代方案**:除了优化RRD,还可能探讨了其他时间序列数据库,如InfluxDB或OpenTSDB,...

Global site tag (gtag.js) - Google Analytics