一.RRDTool存储原理
https://www.cnblogs.com/bonelee/p/6236962.html
二、RRDTool的安装
1.通过yum 安装,rrdtool版本1.3.8
#yum install -y rrdtool
#yum install -y gcc #yum install -y rrdtool-python
2.安装最新版本 1.4.7
# wget http://pkgs.repoforge.org/rrdtool/rrdtool-devel-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/rrdtool-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm # wget http://pkgs.repoforge.org/rrdtool/python-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm
安装下列辅助工具
#yum install libdbi ruby xorg-x11-fonts-Type1 -y #yum install perl-Time-HiRes perl-TermReadKey -y
卸载旧版本
# yum erase rrdtool -y
正式安装
# rpm -Uvh perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm python-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-devel-1.4.7-1.el6.rfx.x86_64.rpm
3.RRDTool 的使用
1. 创建 RRD 数据库
语法:
rrdtool create filename [--start|-b start time] [--step|-s step] [--no-overwrite] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]
参数:
1) create 关键字,用于创建一个 RRD 数据库文件
filename 文件名,扩展名最好是 .rrd
--start|-b start time 第一个记录的开始时间,默认是当前时间减 10 秒。表示方法为从 1970-01-01 UTC 到指定时间的秒数
--step|-s step 每条记录的时间间隔,默认为 300 秒
--no-overwrite 不覆盖同文件名的数据库文件
2) DS:ds-name:DST:dst arguments
DS 关键字,用于定义数据源。一个 RRD 文件可以有多个 DS。
ds-name 数据源名称,可以是 1 ~ 19 个 [a-zA-Z0-9_] 中的任意字符,一个 RRD 数据库文件可以有多个数据源。
DST 数据类型。支持的数据类型有:
GAUGE, COUNTER, DERIVE, ABSOLUTE,COMPUTE
DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
DS:ds-name:COMPUTE:rpn-expression
COMPUTE 存放对其他数据源进行公式计算的结果。
Heartbeat 心跳,两次数据源更新之间将数据源的数值确定为 UNKNOWN 前所允许的最大秒数。Min:max PDP 的最小值 / 最大值。
3) RRA:CF:cf arguments
RRA 关键字,用于定义 RRA(round robin archive) 档。一个 RRD 数据库文件有至少一个的 RRA 档。CDP 就被保存于 RRA 中。
CF 合并方式,可以是 AVERAGE,MIN,MAX,LAST
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
xff 定义合并时间间隔内允许的 PDP 为 UNKNOWN 的比例,超过这个比例时,CDP 被置为 UNKNOWN。
steps 定义多少个 PDP 合并一个 CDP。
rows 定义一个 RRA 档保存有多少条记录。
demo:#创建一个rrd文件 create_rrd.py
#coding=utf-8
import rrdtool,time
rrdb=rrdtool.create('mysql.rrd','--step','3','--start','1402643365',#数据库名称:mysql.rrd;每三秒获取一次数据;从2014年6月18日15时开始
'DS:mysqlselect:COUNTER:5:0:U',#数据源名称:mysqlselect,类型是Counter类型(不断增加的数值;5是heartbeat 0是最小值 U表示最大值,这里表示未知;详细介绍参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=864861&page=1
'RRA:AVERAGE:0.5:1:28800',#RRA用于指定数据如何存放
'RRA:AVERAGE:0.5:10:2880',
'RRA:MAX:0.5:10:2880',
'RRA:LAST:0.5:10:2880')
2. 更新 RRD 数据库
语法:
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--daemon address] [--] N|timestamp:value[:value...] at-timestamp@value[:value...] [timestamp:value[:value...] … ]
参数:
1) update/updatev 关键字,用于更新数据库
updatev 会输出磁盘上数据库文件更新后输出更新信息。由于 updatev 需要直接的磁盘访问,所有不能与 --daemon 共用。
filename 需要更新的 RRD 数据库的文件名
2) --template|-t ds-name[:ds-name]...
默认情况下,需要按照数据源定义的顺序更新。该参数允许你指定要更新的数据。
3) --daemon address
使用缓存后台程序更新数据库,而不直接访问磁盘。
4)N|timestamp:value[:value...]
更新时间及数据。时间格式可以是 N| 时戳;N 表示现在;时戳以自 1970-01-01 以来的秒数来表示。 如果使用负数时间(当前时间之前多长时间),需要使用—与其它选项区分开。用 U 表示数据的值为 UNKNOWN。
at-timestamp@value[:value...]
更新时间也可以使用 AT 风格表示。
环境变量 RRDCACHED_ADDRESS 与 --daemon 选项的作用是一样的,如果两者都出现的话,前者优先。
demo:#使用rrdtool update更新网卡流量 getselect.sh(这里用到snmp简单网络管理协议,具体安装可以参考:http://www.cnblogs.com/smallcoderhujin/p/3785731.html)
while true; do
SELECT=`snmpget -v 2c -c public [your host ip] ifInOctets.2 | sed -e 's/.*ter32: \(.*\)/\1/'`
rrdtool update mysql.rrd N:$SELECT
sleep 3
done
3. 读取数据
语法:
rrdtool fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end|-e end] [--daemon address]
参数:
1) fetch 关键字,用于取数据。
2) filename 需要读取的文件的文件名
3) CF 需要读取数据的合并方式 (AVERAGE,MIN,MAX,LAST)
4) --resolution|-r resolution (default is the highest resolution)
解析度,也就是你要取数据的时间间隔(单位:秒);rrdfetch 会尽量找到最匹配的 RRA。默认为数据库文件支持的最高解析度,即时间间隔最短的;如果想取的不是最高解析度的 RRA,假设要取得的是解析度为 x 的 RRA,开始时间和结束时间必须落在期望解析度的边界点上,即需要满足以下条件:
a.start 时间和 end 时间都是 x 的倍数
b.start 时间和 end 时间都在 RRA 记录的时间范围内。
5) --start|-s start (default end-1day)
开始时间;支持时戳和 AT 风格;默认是 1 天前。
6) --end|-e end (default now)
结束时间;格式与开始时间相同;默认是现在;
7) --daemon address
缓存后台程序地址。如果指定的话,在读取之前,会发 flush 指令给缓存后台程序将缓存的数据同步到磁盘。
demo:#查询,查询2014.6.12 15:50:25至2014.6.12 15:51:25之间的数据
import rrdtool
print rrdtool.fetch('mysql.rrd','AVERAGE','--start','1402645825','--end','1402645885')
4.绘图
demo:#绘图 graph_rrd.py(需要注意的是数据库的名称,数据源名称需要一致)
#coding=utf-8
import rrdtool
rrdtool.graph('mysql.png','--start','1402645825',
'--title','mysql select',
'--vertical-label','selects/3',
'DEF:select3=mysql.rrd:mysqlselect:AVERAGE:step=3',
'LINE1:select3#FF0000:select',)