zoukankan      html  css  js  c++  java
  • RRDTool 存储原理简介——基于时间序列的环型数据库

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

    RRDTool 是一套监测工具,可用于存储和展示被监测对象随时间的变化情况。比如,我们在 Windows 电脑上常见的内存和 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 开始计时,以秒为间隔的一个整数值。所以,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) 的话,这样数据量就比使用原始值降低了60倍!这种经过计算平均值后得到的数据称为归档值。

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

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

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

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

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

  • 相关阅读:
    数据结构>堆栈的使用 小强斋
    数据结构>图的存储结构 小强斋
    数据结构>图的基本术语 小强斋
    java使用JNDI 获取weblogic配置的数据源 连接数据库 小强斋
    java使用JNDI 获取weblogic配置的数据源 连接数据库 小强斋
    数据结构>队列 小强斋
    C++实现平方的安全方法(redis的实现)
    jmeter性能测试使用示例
    redis学习总结1
    java NIO使用示例
  • 原文地址:https://www.cnblogs.com/bonelee/p/6236962.html
Copyright © 2011-2022 走看看