要了解rrdtool如何使用就要先从rrd的数据存储方式开始,rrdtool就是为了操作这个数据库的工具,抄来下面一段文字解释。

0x01 什么是rrd数据库

所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有 很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的 是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。 这样整个存储空间的大小就是一个固定的数值。所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是'.rrd。如下图,

0x02 创建rrdtool create

单纯从理论上了解rrdtool实在有难度,DS、DST、RRA、PDP、CF、CDP等关键字直接懵倒一片,其实这些关键字都来自于rrd数据库的创建语句。既然是创建了,那就是和rrd数据库的结构相关了

* create - create a new RRD

rrdtool create filename [--start|-b start time]
[--step|-s step]
[--no-overwrite|-O]
[DS:ds-name:DST:dst arguments]
[RRA:CF:cf arguments]

各个名词的解释可以参考http://freeloda.blog.51cto.com/2033581/1307492,这博文写得很通俗易懂

个人理解,在DS中虽然指定了每个时间间隔是多少,但是并没有说明整个DS有多大,可以存储多少数据,所以DS是一个临时存储的位置

最终RRA才是所谓的rrd数据库,cd arguments中有setps指定了多少个PDP聚合成一个CDP,rows表示有多少个CDP,这里就已经固定了RRA包含几个CDP,创建之后大小就不变,致使rrd文件大小也不改变

[root@localhost22 ~]# rrdtool create --start 1459017812 --step 3  test.rrd DS:ds1:GAUGE:6:U:U RRA:AVERAGE:0.5:2:600

查看当前的时间是date +%s,上面创建了一个时间间隔为3s的时间槽(--step 3),然后RRA中每2个PDP聚合一次AVERGAE(每个CDP跨度就是6s了),一共创建了600个,即记录了一个小时的数据。

查看当前rrd文件,使用fetch 指定聚合方式和开始时间

[root@localhost22 ~]# rrdtool fetch test.rrd AVERAGE -r 2 -s 1459018002
ds1

1459018008: -nan
1459018014: -nan
1459018020: -nan
1459018026: -nan
1459018032: -nan
1459018038: -nan

可以看到时间间隔6s,没有任何数据,接下来要插入数据

0x03 插入数据rrdtool update

往rrd文件中插入数据的命令是rrdtool update

* update - update an RRD

rrdtool update filename
[--template|-t ds-name:ds-name:...]
[--daemon <address>]
time|N:value[:value...]

at-time@value[:value...]

[ time:value[:value...] ..]

两个主要选项一个就是数据源的顺序,这个顺序对应上后面需要插入数值的顺序,另一个就是"时间:值",当前时间可以用N代替

[root@localhost22 ~]# rrdtool update test.rrd N:`echo $RANDOM`

上面的只是更新一次数据,写个循环,让其不断更新

[root@localhost22 ~]# cat test.sh
while(true)
do
  sleep 3         //每隔3s插入数据
  rrdtool update test.rrd N:`echo $RANDOM`
done

然后执行该脚本,一段时间后,查看rrd文件 ,-r 2为解析度(表示两个PDP聚合,如果指定其他解析度是创建时RRA没有的,取相近的)

[root@localhost22 ~]# rrdtool fetch test.rrd AVERAGE -r 2 -s 1459019604          
ds1

1459019610: 2.4833740297e+04
1459019616: 1.0401318901e+04
1459019622: 2.2809431869e+04
1459019628: 1.4484339557e+04
1459019634: 1.3323151010e+04
1459019640: 1.7158955025e+04
1459019646: 1.1848137257e+04
1459019652: 2.7713005683e+04
1459019658: 2.2571123781e+04
1459019664: 1.8554102312e+04

0x04 绘图rrdtool graph

rrd数据文件有了数据就可以绘图了,看一下rrdtool graph的参数,太多了!%>_<%

* graph - generate a graph from one or several RRD

rrdtool graph filename [-s|--start seconds] [-e|--end seconds]

[-x|--x-grid x-axis grid and label]
[-Y|--alt-y-grid] [--full-size-mode]
[-y|--y-grid y-axis grid and label]
[-v|--vertical-label string] [-w|--width pixels]
[--right-axis scale:shift] [--right-axis-label label]
[--right-axis-format format]
[-h|--height pixels] [-o|--logarithmic]
[-u|--upper-limit value] [-z|--lazy]
[-l|--lower-limit value] [-r|--rigid]
[-g|--no-legend] [--daemon <address>]
[-F|--force-rules-legend]
[-j|--only-graph]

[-n|--font FONTTAG:size:font]
[-m|--zoom factor]
[-A|--alt-autoscale]
[-M|--alt-autoscale-max]
[-G|--graph-render-mode {normal,mono}]
[-R|--font-render-mode {normal,light,mono}]
[-B|--font-smoothing-threshold size]
[-T|--tabwidth width]
[-E|--slope-mode]
[-P|--pango-markup]
[-N|--no-gridfit]
[-X|--units-exponent value]
[-L|--units-length value]
[-S|--step seconds]
[-f|--imginfo printfstr]
[-a|--imgformat PNG]
[-c|--color COLORTAG#rrggbb[aa]]
[--border width
[-t|--title string]
[-W|--watermark string]
[DEF:vname=rrd:ds-name:CF]

[CDEF:vname=rpn-expression]
[VDEF:vdefname=rpn-expression]
[PRINT:vdefname:format]
[GPRINT:vdefname:format]
[COMMENT:text]
[SHIFT:vname:offset]
[TEXTALIGN:{left|right|justified|center}]
[TICK:vname#rrggbb[aa][:[fraction][:legend]]]
[HRULE:value#rrggbb[aa][:legend]]
[VRULE:value#rrggbb[aa][:legend]]
[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]
[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]
[PRINT:vname:CF:format] (deprecated)
[GPRINT:vname:CF:format] (deprecated)
[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)

[-s|--start time]启始时间
[-e|--end time]结束时间 
[-S|--step seconds]解析度
[-t|--title string]图片的标题 
[-v|--vertical-label string] Y轴标签
[-w|--width pixels] 显示区的宽度(像素)
[-h|--height pixels]显示区的高度 (像素)
[-j|--only-graph]只绘制图像
[-u|--upper-limit value] Y轴最大值
[-l|--lower-limit value] Y轴最小值
[-r|--rigid]固定Y轴的值,不进行缩放
[-A|--alt-autoscale]自动缩放
[-J|--alt-autoscale-min]只自动缩放最小值
[-M|--alt-autoscale-max]只自动缩放最大值
[-N|--no-gridfit]不显示网格线

[-x|--x-grid x-axis grid and label]  指定横轴特性,基准网格线单位(时间):值:主网格线单位:值:x轴标签显示间隔(单位):值:后两位是时间格式
[-y|--y-grid y-axis grid and label]

[-c|--color COLORTAG#rrggbb[aa]]指定相关颜色,COLORTAG(BACK/CANVAS/SHADEA/SHADEB/GRID/FONT/AXIS/FRAME/ARROW)
[-n|--font FONTTAG:size:font]自定义字体库,指定路径
[-a|--imgformat PNG] 输出格式
[-W|--watermark string] 水印

[data definition ...]data and variables获取画图的数据,格式如下:
DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time]    varname自定义变量保存rrd某个数据源取得的数据,CF指定数据源的哪一个聚合结果(哪个RRA)

LINE[width]:value[#color][:[legend]]  线条粗细:前面DEF定义的变量vname#颜色:图下面的颜色方块文本信息

[GPRINT:vname:CF:format]  图下面的数值信息

[root@localhost22 ~]# rrdtool graph test.png --step 3 --start=1459019604 DEF:vtest=test.rrd:ds1:AVERAGE LINE:vtest#ff0000:'date'

RRDTool 三个命令的使用的更多相关文章

  1. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  3. linux下查看当前用户的 三个命令

    linux下查看当前用户的 三个命令 1,whoami; 2,id -un; 3,who -H  可以列出当前所有的    NAME (用户名)    LINE (窗口列表)    TIME(开启时间 ...

  4. iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)

    使用终端命令行将本地项目代码上传到github上进行托管 对于IOS开发者来说,Github的使用是必须要掌握的一种技能,而把项目由本地上传到Github有多种方式 1.开发工具Xcode配置Git, ...

  5. [转]Linux中set,env和export这三个命令的区别

    转自:http://www.2cto.com/os/201306/223758.html Linux中set,env和export这三个命令的区别   set命令显示当前shell的变量,包括当前用户 ...

  6. 三个命令解决ASTGO服务器重启后各种问题

    SSH 命令方式登录到服务器,依次执行下面三个命令. service httpd restart service mysqld restart safe_asterisk 前面两个命令提示无效,尝试从 ...

  7. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  8. Docker系列(三)常用命令

    命令说明 docker pull 格式: docke pull [OPTIONS] NAME[:TAG] 作用:下载名称为 name 的镜像 例子: sudo docker pull dl.docke ...

  9. Entity Framework Core必须牢记的三条引用三条命令

    关于EntityFramework Core有三个重要的引用和三条重要的命令,掌握以这六条,基本用Entity Framework Core就得心应手了. 引用1:Install-PackageMic ...

随机推荐

  1. SQL Server:排名函数row_number,rank,dense_rank,ntile详解

    1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...

  2. Linux命令(21)查看文件的行数

    在 linux 系统中没有在 windows 系统中那么方便的点点鼠标就可以操作文件了,对文件的各种操作都必须使用各种命令来完成.比如有时候我们需要在不查看文件内容的情况下需要知道该文件有多少行.这个 ...

  3. MYSQL C API : mysql_real_escape_string 二进制数据存储

    #include <iostream> #include <string> #include <string.h> #include <mysql.h> ...

  4. NUGET命令

    主题 about_NuGet 简短说明 提供有关 NuGet 程序包管理器命令的信息. 详细说明 本主题介绍 NuGet 程序包管理器命令.NuGet 是一种集成的程序包 管理工具,用于将库和工具添加 ...

  5. projecteuler 10001st prime (求出第10001个质数)

    By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. ...

  6. 利用spring、cxf编写并发布webservice

    配置文件spring-wsServer.xml <?xml version="1.0" encoding="UTF-8"?> <beans x ...

  7. 记录今天学习python中for与while循环针对break和continue的用法

    python中有两个主要的循环for与while,其中针对这两个循环有两种不同的中断用法break与continue. 首先先看下面的循环代码: 1: for i in range(10):#变量i带 ...

  8. QtCreator动态编译jsoncpp完美支持x86和arm平台

    如果是做嵌入式开发. 在Qt下支持JSon最好的办法,可能不是采用qjson这个库.QJson这个库的实例只提供了x86环境下的编译方法. Installing QJson-------------- ...

  9. Python字典方法总结

    1.清空字典中元素清空,dict变为{} L.clear()-> None.  Remove all items from L 1 2 3 4 >>> L ={'shaw':2 ...

  10. js 构造函数

    //构造函数  //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法  //当对象被实例化后,构造函数会立即执行它所包含的任何代码  function myObject(ms ...