rrd文件导入mysql_RRDtool入门详解

本文介绍了RRDtool的基本概念和工作原理,包括其固定大小的存储空间、数据对象、存储与归档策略。文章还提到了RRDtool在监控系统中的应用,并展示了如何创建RRD文件以及处理数据更新和归档的策略。此外,文章讨论了RRDtool的 heartbeat 概念,以及RRA(Round Robin Archive)在数据完整性中的作用。
摘要由CSDN通过智能技术生成

---------------原创内容,转载请注明出处。------------

一、概述

RRDtool(round-robin database tool),即轮询式数据库工具(注:并不等同于计算机中的轮询调度算法),采用固定大小的空间来存储数据,设定一个指针,随数据的读写移动,指向最后更新的数据的位置。

很多资料中都将存储数据的数据库空间看做一个圆,这个圆没有起点也没有终点,因此只需一个固定大小的空间即可实现数据的持续读写。这个空间就是使用 "rrdtool create"命令后创建出的以“.rrd”后缀结尾的文件。

RRDtool很有特色的一方面在于它不仅可以扮演后台的角色来存储数据,同时又给我们提供了丰富的工具来创建出精美的统计图表,兼任前端的角色。

安装:

linux一般可以直接使用yum或者apt-get来直接安装。

$ sudo yum install rrdtool (centos)

$ sudo apt-get install rrdtool (ubuntu)

也可以到官方下载各操作系统(包括windows)的安装包,或者下载源码自己编译。

image2016-1-11%2013%3A39%3A7.png?version=1&modificationDate=1452496124000&api=v2

二、数据对象

RRDtool针对处理的是时序型数据(time-series data),比如网络带宽,温度,CPU负载等等这些和时间相关联的数据或者说指标。很多优秀的监控系统都采用RRDtool作为DBMS或者作为绘图工具,比如 Ganglia、MRTG、Xymon、Zenoss、open-falcon等等。可见RRDtool在处理监控指标方面得天独厚的优势。

三、RRDtool存储与归档原理

RRDtool存储数据的方式和常见的关系型数据库有很大的不同:

RRDtool的每个rrd文件大小,一经创建便固定,而传统的关系型数据库的文件大小则是随着数据的写入而逐渐增大的

RRDtool在接收到数据的同时会进行计算合并,并存储计算后结果

RRDtool要求定时更新数据,同时数据库中对出现“异常”的值使用UNKNOWN代替。

为了实现定时更新,RRDtool规定一个时间间隙(interval),经过interval就会进行数据库更新,比如上面的图中的interval就是1min。这个interval在RRDtool中被命名为step,在使用create命令创建rrd文件时,作为一个必须使用的选项来规定rrd数据库所采用的interval,而且这个值之后不允许再改变。如:

image2016-1-11%2014%3A39%3A32.png?version=1&modificationDate=1452496124000&api=v2

.....(注:此处只是作为演示,并不是一个合法的完整的create命令)

上面的命令第一行比较容易理解(注:实际命令并没有换行,这里便于演示使用“\”来分隔),下面来解释一下第二行各个参数的含义,

image2016-1-11%2014%3A24%3A58.png?version=1&modificationDate=1452496124000&api=v2

DS(Data Source):定义数据来源,换句话说就是我们要检测的指标,这里使用cpu_load(检测cpu负载)来作为DS的名字。GAUGE是数据源的类型(DST:Data Source Type)

常见的数据源类型:

为了便于理解,可以认为它就是我们创建MySQL时定义的一列(当然这非常不准确):

image2016-1-11%2014%3A34%3A23.png?version=1&modificationDate=1452496124000&api=v2

先跳过heartbeat这个参数,来看后两个参数。min max、顾名思义就是用来规定数据值的合理存储范围,对于cpu负载,我将其设置为0~100.对于不确定界限的值,可以使用U来代替。也就是说,如果接收到的数据在这个范围内,就会被认为是good value,被数据库接收并插入。否则就会被认为是坏值,作为unknown插入。

最后看heartbeat,对应上面示例命令的120。这个其实是RRDtool收集数据的一种策略,前面提到过RRDtool每经过step长的时间间隙,就会进行一次数据库更新,并将刷新的值插入到数据库中,我们称这个值为(PDP: Primary Data Point).但是这样的话就会产生问题----如果我在指定的间隙没有收集到数据,数据库就会收集不到值,怎么处理呢?RRDtool中将这一类“坏值”统一作为unknown插入数据库中,稍微想一下就会知道作为unknown,在统计的时候会更加精确,因为可以直接将这些unknown剔除,而不是不分青红皂白的将所有的“0”全部剔除(针对于某些将数据坏值处理为0的数据库)。

unknown的处理就万无一失了吗?答案很显然是否定的,在实际收集数据时,我们很难保证在准确的时间点收集到数据。因此RRDtool提出了heartbeat这样一个概念,表示一个时间跨度,也就是说,只要在这个时间跨度内,数据库更新收集到了数据,那么就可以插入这个值,否则将值作为unknown插入。也就是说在上面的示例命令中,只要在两分钟内收集到了数据,就会作为PDP更新到数据库中。如果超过了heartbeat给定的时间,那么就作为unknown插入数据库。

现在在shell中输入上面这个不完整的命令,来看看shell会给我们返回什么样的错误信息。

image2016-1-11%2014%3A59%3A4.png?version=1&modificationDate=1452496124000&api=v2

错误提示,你必须至少定义一个RRA(Round Robin Archive)。那么什么是RRA呢?前面介绍过RRD特殊的存储方式,我在学习的时候就在想:持续读写数据,是如何保证数据的完整性?数据轮询了一次后,必然会导致新数据对旧数据的覆盖,那么又如何来查询之前收集到但是已经被后来覆盖的数据呢?----很显然,RRA就是提供这样一种功能的归档策略,是RRD的核心,可以把它当做关系型数据库中的视图来理解。也就是说,我们怎样来查看数据以及如何将收集到的数据绘成图表,都是通过对这个RRA("视图")来定义的。但是从另一方面来讲,这应该也算是RRDtool的一种缺陷吧,上面的错误消息告诉我们,在创建的时候就必须要至少定义一个RRA,也就是要求我们在创建RRD数据库的时候就必须事先规定好将来要如何来查询处理这些数据。

完整的RRDtool create命令:

image2016-1-11%2015%3A19%3A30.png?version=1&modificationDate=1452496642000&api=v2

此时查看当前文件夹,就会看到一个rrd文件,即rrd_intro.rrd:

image2016-1-11%2015%3A20%3A19.png?version=1&modificationDate=1452496690000&api=v2

下面来介绍RRA部分的命令:

image2016-1-11%2015%3A23%3A39.png?version=1&modificationDate=1452496891000&api=v2

image2016-1-11%2015%3A32%3A32.png?version=1&modificationDate=1452497424000&api=v2

RRA官方文档定义:An archive consists of a number of data values or statistics for each of the defined data-sources (DS).

也就是说,创建RRA后,RRA就是被DS所共用的,不需要指定DS。同时,这个归档文件中包含一系列的数据和统计信息,那么这些信息是如何得到的呢?

---通过CF(Consolidation Function)整合方法,将数据按照一定的规则归档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值