当前位置: 首页 > 编程日记 > 正文

RRDTool原理简介

1.概述

RRDtool 代表 “Round Robin Database tool” ,作者同时也是 MRTG 软件的发明人。官方站点位于http://oss.oetiker.ch/rrdtool/ 。 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是'.rrd。著名的hadoop集群监控工具ganglia也是使用RRD数据库来存储数据和展示数据的。其原理如下图:
rrdtool

2.特点

首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得RRDtool看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。

RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的。

其他数据库只是被动的接受数据, RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of change),并存储该结果。

RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN (unknow)代替,其他数据库则不会这样。

3. 安装RRDTool

3.1.安装yum源

[root@node1 ~] # rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@node1 ~] # rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

3.2.同步时间

[root@node1 ~] # ntpdate 202.120.2.101

3.3.下载rrdtool的RPM包

[root@node1 ~] # wget ftp://195.220.108.108/linux/centos/6.4/os/x86_64/Packages/rrdtool-1.3.8-6.el6.x86_64.rpm

3.4.yum安装rrdtool

[root@node1 ~] # yum -y localinstall --nogpgcheck rrdtool-1.3.8-6.el6.x86_64.rpm

3.5.查看一下安装文件

[root@node1 ~] # rpm -qa | grep rrdtool
rrdtool-1.3.8-6.el6.x86_64
[root@node1 ~] # rpm -ql rrdtool
/usr/bin/rrdcgi
/usr/bin/rrdtool #命令行工具
/usr/bin/rrdupdate
/usr/lib64/librrd .so.4 #下面是库文件
/usr/lib64/librrd .so.4.0.7
/usr/lib64/librrd_th .so.4
/usr/lib64/librrd_th .so.4.0.7
/usr/share/man/man1/bin_dec_hex .1.gz #下面是帮助文档
/usr/share/man/man1/cdeftutorial .1.gz
/usr/share/man/man1/rpntutorial .1.gz
/usr/share/man/man1/rrd-beginners .1.gz
/usr/share/man/man1/rrdbuild .1.gz
/usr/share/man/man1/rrdcgi .1.gz
/usr/share/man/man1/rrdcreate .1.gz
/usr/share/man/man1/rrddump .1.gz
/usr/share/man/man1/rrdfetch .1.gz
/usr/share/man/man1/rrdfirst .1.gz
/usr/share/man/man1/rrdgraph .1.gz
/usr/share/man/man1/rrdgraph_data .1.gz
/usr/share/man/man1/rrdgraph_examples .1.gz
/usr/share/man/man1/rrdgraph_graph .1.gz
/usr/share/man/man1/rrdgraph_rpn .1.gz
/usr/share/man/man1/rrdinfo .1.gz
/usr/share/man/man1/rrdlast .1.gz
/usr/share/man/man1/rrdlastupdate .1.gz
/usr/share/man/man1/rrdresize .1.gz
/usr/share/man/man1/rrdrestore .1.gz
/usr/share/man/man1/rrdthreads .1.gz
/usr/share/man/man1/rrdtool .1.gz
/usr/share/man/man1/rrdtune .1.gz
/usr/share/man/man1/rrdtutorial .1.gz
/usr/share/man/man1/rrdupdate .1.gz
/usr/share/man/man1/rrdxport .1.gz
/usr/share/rrdtool

3.6.查看一下命令行工具

[root@node1 ~] # rrdtool -h
RRDtool 1.3.8 Copyright 1997-2009 by Tobias Oetiker <tobi@oetiker.ch>Compiled Aug 21 2010 10:57:18
Usage: rrdtool [options] command command_options
Valid commands: create, update, updatev, graph, graphv, dump, restore,last, lastupdate, first, info, fetch, tune,resize, xport
RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (www.gnu.org /copyleft/gpl .html)
For more information read the RRD manpages

4. rrdtool命令详解

4.1.创建RRD数据库

create 语法

rrdtool create filename
[--start|-b start time ]
[--step|-s step]
DS:ds-name:DST:dst arguments #最后获取的数据是PDP,更新数据时要考滤DS顺序(*把所有要更新的数据,按照DS定义的顺序用冒号格开*)
RRA:CF:cf arguments #最后获取的数据是CDP,绘图时使用的是这些数据

参数详解:

  • DS:DS 用于定义 Data Soure 。也就是用于存放结果的变量名。DS是用来申明数据源的,也可以理解为申明数据变量,也就是你要检测的端口对应的变量名,这个参数在画图的时候还要使用的。
  • DST:DST 就是DS的类型。有 COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5种。由于网卡流量属于计数器型,所以这里应该为 COUNTER 。

*RRA:RRA 用于指定数据如何存放。我们可以把一个RRA 看成一个表,各保存不同 interval 的统计结果。RRA的作用就是定义更新的数据是如何记录的。比如我们每5分钟产生一条刷新的数据,那么一个小时就是12条。每天就是288条。这么庞大的 数据量,一定不可能都存下来。肯定有一个合并(consolidate)数据的方式,那么这个就是RRA的作用了。

*PDP:Primary Data Point 。正常情况下每个 interval RRDtool 都会收到一个值;RRDtool 在收到脚本给来的值后会计算出另外一个值(例如平均值),这个 值就是 PDP ;这个值代表的一般是“xxx/秒”的含义。注意,该值不一定等于RRDtool 收到的那个值。除非是GAUGE ,可以看下面的例子就知道了

*CF:CF 就是 Consolidation Function 的缩写。也就是合并(统计)功能。有 AVERAGE、MAX、MIN、LAST 四种分别表示对多个PDP 进行取平均、取最大值、取最小值、取当前值四种类型。具体作用等到 update 操作时再说。

*CDP:Consolidation Data Point 。RRDtool 使用多个 PDP 合并为(计算出)一个 CDP。也就是执行上面 的CF 操作后的结果。这个值就是存入 RRA的数据,绘图时使用的也是这些数据。

下面是RRA与PDP、CDP之间的关系图,
rrdtool2

(0).filename

默认是以 .rrd 结尾,但也以随你设定。

(1).--start|-b start time

设 定RRD数据库加入的第一个数据值的时间,从1970-01-01 00:00:00 UTC时间以来的时间(秒)。RRDtool不会接受早于或在指定时刻上的任何数值。默认值是now-10s;如果 update 操作中给出的时间在 –-start 之前,则 RRDtool拒绝接受。--satrt 选项也是可选的。 如果你想指定--start 为1天前,可以用CODE:--start $(date -d '1 days ago' +%s)。注意,--start 选项的值必是 timestamp 的格式。

(2).--step|-s step

指定数据将要被填入RRD数据库的基本的时间间隔。默认值是300秒;

(3).DS:ds-name:DST:dst arguments DS(Data Source)

DS:DS 用于定义 Data Soure 。也就是用于存放结果的变量名。 DS是用来申明数据源的,也可以理解为申明数据变量,也就是你要检测的端口对应的变量名,这个参数在画图的时候还要使用的。这里开始定义RRD数据的基本 属性;单个RRD数据库可以接受来自几个数据源的输入。在DS选项中要为每个需要在RRD中存储的数据源指定一些基本的属性;ds-name数据域命 名;DST定义数据源的类型,dst arguments参数依赖于数据源的类型。

案例:DS:mysql:COUNTER:600:0:100000000

DS(Data Source,数据源)表达式总共有六个栏位:
*DS 表示这个为DS表达式
*ds-name 数据域命名
*DST 定义数据源的类型
heartbeat 有效期(heartbeat),案例里的值为'600',假设要取12:00的数据,而前后300秒里的值(11:55-12:05)经过平均或是取最大或最小都算是12:00的有效值;
min 允许存放的最小值,此例允许最小为0。
max 允许存放的最大值,最大为100000000。
注,如果不想设限制可以再第五个栏位和第六个栏位以 "U:U"表示(U即Unknown)。

DST 定义数据源的类型。数据源项的后续参数依赖于数据源的类型。对于GAUGE、COUNTER、DERIVE、以及ABSOLUTE,其数据源的格式为: DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max。DST 的选择是十分重要的,如果选错了 DST ,即使你的脚本取的数据是对的,放入 RRDtool 后也是错误的,更不用提画出来的图是否有意义了。

GAUGE :GAGUE 和上面三种不同,它没有“平均”的概念,RRDtool 收到值之后字节存入 RRA 中。

COUNTER :必须是递增的,除非是计数器溢出。在这种情况下,RRDtool 会自动修改收到的值。例如网络接口流量、收到的packets 数量都属于这一类型。

DERIVE:和 COUNTER 类似。但可以是递增,也可以递减,或者一会增加一会儿减少。

ABSOLUTE :ABSOLUTE 比较特殊,它每次都假定前一个interval的值是0,再计算平均值。

COMPUTE :COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。例如 CODE:DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:eth0_bytes,8, 则 eth0_bytes 每得到一个值,eth0_bits 会自动计算出它的值:将 eth0_bytes 的值乘以 8 。不过 COMPUTE 型的 DS 有个限制,只能应用它所在的 RRD 的 DS ,不能引用其他 RRD 的 DS。 COMPUTE 型 DS 是新版本的 RRDtool 才有的,你也可以用 CDEF 来实现该功能。如:CDEF:eth0_bits=eth0_bytes,8,

参考:
http://my.oschina.net/u/1458120/blog/208857
http://www.360doc.com/content/10/1205/16/4947005_75240524.shtml
http://blog.liuts.com/post/215/

相关文章:

【Python】Scrapy爬虫实战(腾讯社会招聘职位检索)

爬虫网页&#xff1a;https://hr.tencent.com/position.php 应用Scrapy框架&#xff0c;具体步骤就不详细说明&#xff0c;前面几篇Scrapy有一定的介绍 因为要涉及到翻页&#xff0c;下面的代码使用拼接的方式获取url&#xff0c;应用在一些没办法提取下一页链接的情况下 直…

一对一直播app源码功能操详解方案分享

一&#xff1a;登录页面&#xff1a;1.快捷登录&#xff1a;可以利用第三方账号进行快捷登录2.手机登录&#xff1a;可以让用户通过输入手机号码和密码进行登录.3.注册&#xff1a;可以使用手机号获取验证码注册账号二&#xff1a;打开一对一直播APP首页打开APP&#xff0c;会显…

从一个需求看问题的无限复杂化和简单化

一个需求 如果你一开始的出发点就错了&#xff0c;那么后续的设计只会非常复杂&#xff0c;而且还会有漏洞&#xff0c;也很难发现&#xff0c;发现了也很难解决。 先看数据结构&#xff1a; A表 主键id 其他各种字段不重要 &#xff0c;重要的就一个字段sort字段 aid1 …

使用自定义材质球,实现NGUI屏幕溶解和灰显

UITexture实现的溶解&#xff1a; 重设UITeture的材质球实现上述效果&#xff0c;把当前屏幕渲染的Texture2D丢给UITexture&#xff0c;即可实现UI屏幕特效&#xff0c;背景模糊等都可以。 难点主要是实时刷新问题 解决的比较粗暴&#xff0c;每次Update重设材质球&#xff0c;…

【Python】Tkinter 体验

import tkinter as tk root tk.Tk() root.title("work hard") #添加一个Label组件&#xff0c;Label组件是GUI程序中最常用的组件之一 #Label组件可以显示文本&#xff0c;图标或图片 #在这里我们让它显示指定文本 theLabel tk.Label(root,text"努力努力再努力…

debian手动安装java两种方法

2019独角兽企业重金招聘Python工程师标准>>> 方法一&#xff1a;下载后修改~/.bashrc文件 方法二&#xff1a;使用update-alternatives进行命令安装 相关配置记录 法一&#xff1a; 官网下载压缩包&#xff0c;解压&#xff0c;然后复制到/usr/lib/jvm目录下&#x…

【Python】Label组件 Button组件 Checkbutton组件

Label组件 Label组件是用于在界面上输出描述的标签。 #导入tkinter模块所有内容 from tkinter import *#创建一个主窗口&#xff0c;可以容纳整个GUI程序 root Tk() root.title("hhh")textLabel Label(root,text"努力努力再努力&#xff01;\n努力努力再努力…

大厂线上案例复盘--代码漏洞

万无一失却实际上是形同虚设的代码逻辑漏洞 这是一则发生在某大厂的真实案例&#xff0c;出于脱敏名字这且不说。 这个系统因为第一次上线&#xff0c;流量非常的大。 所以需要灰度上线&#xff0c;所谓灰度方案很短&#xff0c;比如按照地理位置&#xff0c;先选择某个访问量…

使用Vue+Spring Boot实现Excel上传

写在最前 在上期教程中我们介绍了读写Excel与使用Selenium的入门方法&#xff0c;本期将介绍通过VueSpring Boot实现在WebApp中上传Excel导入测试脚本的功能。使用前后端分离的技术是因为这样便于后续功能的迭代&#xff0c;在本文中我们只涉及一个简单的前端界面及一个简单的后…

国信优易首席科学家周涛:大数据的商业应用

国信优易首席科学家周涛认为&#xff0c;大数据已经成为一个非常热的概念&#xff0c;但是当一个概念热到一定程度就会存在风险&#xff0c;甚至风险比机会还多。在大数据沙龙中&#xff0c;他和数据从业者们分享了自己所经历的大数据应用。 以下为周涛发言&#xff1a; 大数据…

【Python】Radiobutton组件 LabelFrame组件 Entry组件

Radiobutton组件 Radiobutton组件跟Checkbutton组件的用法基本一致&#xff0c;唯一不同的是Radiobutton实现的是“单选”的效果。 要实现这种互斥的效果&#xff0c;同组内的所有Radiobutton只能共享一个variable选项&#xff0c;并且需要设置不同的value选项值。 注释掉的也…

索引与联合索引使用注意

索引和联合索引看似很简单但是往往不一定用的对。 假设数据库2个字段a,b都是查询条件 第一个问题&#xff1a;是建立2个索引还是一个联合索引&#xff1f; 第二个问题&#xff1a;如果建立联合索引那么字段的顺序有什么讲究&#xff1f; 原则&#xff1a; 1.如果需要多个字…

用canvas实现一个vue弹幕组件

看B站时&#xff0c;对弹幕的实现产生了兴趣&#xff0c;一开始想到用css3动画去实现&#xff0c;后来感觉这样性能不是很好&#xff0c;查了下资料&#xff0c;发现可以用canvas实现&#xff0c;于是就摸索着写了一个简单的弹幕。弹幕功能支持动态添加弹幕弹幕不重叠自定义弹幕…

系统架构的过程 浮现式设计

系统架构如果设计之初就设计错了&#xff0c;那么必然是南辕北辙。 很多人做系统设计总是东一下&#xff0c;西一下&#xff0c;杂乱无章&#xff0c;想到那是那&#xff0c;然后系统的边界很大&#xff0c;总会有疏漏。 那么系统架构应该怎么设计呢&#xff1f; 首先来说分…

【Python】Listbox组件 Scrollbar组件 Scale组件

Listbox组件 在选项特别多的时候&#xff0c;Listbox是以列表的形式显示出来&#xff0c;并支持滚动条操作&#xff0c;所以在对于需要提供大量选项的情况下会更适用。 from tkinter import * root Tk() theLB Listbox(root,setgridTrue) theLB.pack() for item in ["…

Hive 按某列的部分排序 以及 删列操作

Hive 按某列的部分排序 以及 删列操作 脑袋果然还是智商不足。 涉及到的小需求&#xff1a; 某个表test 有一列 tc&#xff1a; a字符串b字符串c字符串 拼接组成把test表&#xff0c;按b字符串排序 输出遇到的问题&#xff1a; select 里面必须包含 order by 的列按b字符串排序…

docker 安装 RabbitMQ

1、镜像中国&#xff08;http://www.docker-cn.com/registry-mirror&#xff09;&#xff1a;直接使用https://hub.docker.com下载镜像比较慢&#xff0c;使用镜像中国加速 使用例子&#xff1a;$ docker pull registry.docker-cn.com/library/rabbitmq:3.6-management 2、拉取…

编程容易犯的错

1.数字 比如分页默认从第0页开始&#xff0c;你不了解&#xff0c;写个1&#xff0c;这样数据也出来&#xff0c;但是就是少了第一条&#xff0c;这种错误比较难发现。 写代码对于数字需要敏感&#xff0c;不懂一定要搞懂。 2.参数 多参数做缓存拼凑一个key&#xff0c;之前…

深圳杯---无线回传拓扑规划

B题-无线回传拓扑规划&#xff08;3人完成&#xff09; 背景介绍 在城区建设基站&#xff0c;传输光纤部署最后一公里的成本高&#xff0c;光纤到站率低&#xff0c;全球综合来看低于60%&#xff1b;如果使用微波传输&#xff0c;由于微波只能在LOS&#xff08;视距&#xff0…

Jmeter脚本 GUI和非GUI启动方式

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0e;下载Jmeter 地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 2&#xff0e;启动jmeter 运行bin/jmeter.bat 3&#xff0e;添加线程组 在TestPlan节点上右键&#xff0c;Add-->Threads(U…

前端效果参考地址

今天项目内容基本完善&#xff0c;没什么事情&#xff0c;就找了一些插件和好用的css动画&#xff0c;下面将一些链接地址分享出来 1、如果需要写阴影、圆角、渐变、弹性盒子等&#xff0c;请参考一下方式&#xff1a; 点击 2、轮播图、全屏滚动等动画&#xff1a; swiper效果 …

随机变量的数字特征(数学期望,方差,协方差与相关系数)

戳这里&#xff1a;概率论思维导图 &#xff01;&#xff01;&#xff01; 数学期望 离散型随机变量的数学期望 &#xff08;这里要求级数绝对收敛&#xff0c;若不绝对收敛&#xff0c;则E(X)不存在&#xff09; 如果有绝对收敛&#xff0c;则有 &#xff0c;其中 连续型…

Spring @bean冲突解决方案

引用2个jar都实现了相同的bean注入&#xff0c;这个是feign的Level Bean public Level feignLoggerLevel() {return Level.FULL; } 这样报错: escription:xxx required a single bean, but 2 were found:- feignLoggerLevel: defined by method feignLoggerLevel in class p…

javascript中实例方法与类方法的区别

在javascript中&#xff0c;类有静态属性和实例属性之分&#xff0c;也有静态方法和实例方法之分 类属性&#xff08;静态属性&#xff09;&#xff1a;通过类直接访问&#xff0c;不需要声明类的实例来访问 类方法&#xff08;静态方法&#xff09;&#xff1a;通过类直接访问…

vue 集成富文本tinymce

开发环境 1. vscode开发语言 1. vue 2. javaScript插件安装 1. npm install tinymce -S 2. 可以使用里面的文件&#xff0c; 下载后可以在node_modules 里面查看如下未目录结构3. 可以将整个结构拷在static里面&#xff0c;为了节省打包后的文件大小可以将tinymce.min.js以cdn方…

c语言中如何设计和编写一个应用系统?

C程序中,如何设计和编写一个应用系统?一、 C语言文件的操作1、 文件操作的基本方法&#xff1a;C语言将计算机的输入输出设备都看作是文件。例如&#xff0c;键盘文件、屏幕文件等.向屏幕输出一个信息&#xff0c;例如“Hello”是#include.h>int main(){printf("Hello…

深圳杯---人才吸引力评价模型研究

人才吸引力评价模型研究 在世界各国和全国各地都加大争夺人才的背景下&#xff0c;一个城市要保持其竞争活力和创新力&#xff0c;必须与时俱进地但不盲目地调整相关人才吸引政策。2018年深圳市将加大营商环境改革力度作为一项重要工作&#xff0c;以吸引更多优秀的高新企业和…

不写容易出错的代码

下面2段代码都是完成商品名称的更新&#xff0c;只是第一种情况数据源是list第二种是map 第一代代码是从List里获取第0个 entity.setProduct_name(productList.get(0).getName()); 第二段代码从map里获取键值 entity.setProduct_name(productMap.get(pid).getName())); 如果…

【Vue】IView之table组件化学习(二)

最基本的绑定table是这样的&#xff0c;需要columns和data两个属性。 <template><Card><h4>表格栗子</h4><Table :columns"cols" :data"stuList"></Table></Card> </template><script> export defa…

show-busy-java-threads查找CPU占用高

背景&#xff1a;需要查找线上CPU占用过高的Java线程在做什么。 可以使用top命令找出占CPU高的进程 #top 然后按shiftC 按CPU占比排序 然后把进程中占比高的线程id找出来&#xff0c;这个是常见的套路&#xff0c;但是这样做比较繁琐。 可以使用show-busy-java-threads工具…