Round Robin Database Tool(轮询的数据库工具)
环状数据库:大小始终不变,是以时间序列数据
数据库中的数据和我们获取的数据未必是一样的,有可能一样有可能不一样,直接获取的数据对于我们来说没什么意义
对于我们有用的是RRA(Round Robin Archive轮询归档信息)
PDP(Primary Data Point):主数据点
CDP(Consolidation Data Point):聚合数据点
解析度:resolution指的就是时间跨度
DS(Data Source):数据源,每一个数据源都可以对其做单独的聚合
rrdtool命令
Rrdtool -[workdir] function
Create:创建一个新的RRD
update:存储一个新的数据打牌RRD里面
updatev:除了输出操作等同于update
graph:使用存储在数据库中的一个或者多个RRD生成一个图片
dump:取出一个RRD的内容,用这种方法移动一个RRD从一台计算机架构到另一种
restore:恢复XML格式的RRD为二进制的RRD
fetch:从一个RRD上获取某一个时间的数据
tune:改变一个RRD的设置
last:只看上一个RRD的数据
info:获取关于一个RRD的信息
rrdresize:改变个别的RRA的大小
export:从一个或者多个RRD中导出数据
flushcached:从内存中清楚特定的RRD的值
rrdcgi:这个是为了生成RRD图的一个单独的工具
ds-name:必须是1到19个字符,且是a-z、A-Z、或者0-9
DST:数据源类型
GAUGE:保存原值
COUNTER:数据必须是递增的,保存的是相对于前面的一个值
DERIVE:可增可减
ABSOLUTE:相对于初始值的数值
对于COMPUTE数据源来说格式是DS:ds-name:COMPUTE:rpn-expression
dst arguments:数据源参数,形式是:heartbeat:min:max
heartbeat:定义在我们这个时间跨度之内,再过多长时间过期,过期的标记为unknown
min:接收的最小值
max:接收的最大值
CF:聚合函数有四种类型,average、max、min、last
cf arguments:语法xff:steps:rows
xff:定义PDP中出现unknown的百分比高于设置的这个比例以后CDP也被标记为unknown
steps:聚合函数对多少个pdp做聚合生成cdp
rows:保存多少个聚合的cdp结果
安装rrdtool软件:
[root@Wiker ~]# yum install rrdtool -y
[root@Wiker ~]# rrdtool create /tmp/test.rrd --step 5 DS:testds:GAUGE:5:0:U RRA:AVERAGE:0.5:1:17280 RRA:AVERAGE:0.5:10:3456 RRA:AVERAGE:0.5:100:1210
[root@Wiker ~]# ll /tmp/test.rrd
-rw-r--r--. 1 root root 176568 Feb 19 11:13 /tmp/test.rrd
[root@Wiker ~]# rrdtool info /tmp/test.rrd
filename = "/tmp/test.rrd"
rrd_version = "0003"
step = 5
last_update = 1392826413
ds[testds].type = "GAUGE"
ds[testds].minimal_heartbeat = 5
ds[testds].min = 0.0000000000e+00
ds[testds].max = NaN
ds[testds].last_ds = "U"
ds[testds].value = 0.0000000000e+00
ds[testds].unknown_sec = 3
rra[0].cf = "AVERAGE"
rra[0].rows = 17280
rra[0].cur_row = 6746
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 3456
rra[1].cur_row = 102
rra[1].pdp_per_row = 10
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = NaN
rra[1].cdp_prep[0].unknown_datapoints = 2
rra[2].cf = "AVERAGE"
rra[2].rows = 1210
rra[2].cur_row = 985
rra[2].pdp_per_row = 100
rra[2].xff = 5.0000000000e-01
rra[2].cdp_prep[0].value = NaN
rra[2].cdp_prep[0].unknown_datapoints = 82
Rrdtool update语法:
rrdtool {update | updatev} filename [--template | -t ds-name[:ds-name]...]
[--] N | timestamp:value[:value...]
-t :改变接收数据的次序
比如我们定义的rrdtool create test.rrd DS:ds1 DS:ds2,默认情况下我们想这个数据库里面输入值得话是:rrdtool update test.rrd N:30(DS1值):40(DS2值),然后我们可以使用rrdtool update test.rrd -t ds2:ds1 40:30 把循序给颠倒
[root@Wiker ~]# vim average.sh
#!/bin/bash
#一直循环的update数据,取得都是随机值,没5秒取一次
while true; do
rrdtool update /tmp/test.rrd N:$RANDOM
sleep 5
done
[root@Wiker ~]# chmod +x average.sh
[root@Wiker ~]# bash -n average.sh
[root@Wiker ~]# bash -x average.sh
+ true
+ rrdtool update /tmp/test.rrd N:27710
+ sleep 5
+ true
+ rrdtool update /tmp/test.rrd N:31407
+ sleep 5
+ true
+ rrdtool update /tmp/test.rrd N:5040
+ sleep 5
+ true
+ rrdtool update /tmp/test.rrd N:11347
+ sleep 5
+ true
…………………
然后可以使用fetch取值看看
[root@Wiker ~]# rrdtool fetch -r 5 /tmp/test.rrd AVERAGE #把时间解析度为5的数值取出来
…………………….
1392828630: -nan
1392828635: -nan
1392828640: -nan
1392828645: 1.1408749516e+04
1392828650: 1.9429023496e+04
1392828655: 1.6702171333e+04
1392828660: 1.2129515630e+04
1392828665: 1.6643033052e+04
1392828670: 9.0811285580e+03
1392828675: 4.9061926000e+03
1392828680: 1.4646969016e+04
1392828685: 1.5303605601e+04
1392828690: 1.3794829744e+04
1392828695: 2.8930643039e+04
1392828700: 2.8242524505e+04
1392828705: 1.7929997124e+04
1392828710: 7.5651048024e+03
1392828715: 1.4967636932e+04
1392828720: 2.1898615851e+04
1392828725: 8.2618389920e+03
1392828730: 2.0095120818e+04
1392828735: 1.1536520112e+04
1392828740: 1.3481749833e+04
1392828745: 1.7555939868e+04
1392828750: 2.4479323922e+04
1392828755: 1.0614798030e+04
1392828760: 9.9147271466e+03
1392828765: 1.8188777498e+04
1392828770: 1.7390993412e+04
1392828775: -nan
1392828780: -nan
…………………..
解析度为500的数值取出来
[root@Wiker ~]# rrdtool fetch -r 500 /tmp/test.rrd AVERAGE
…………...
1392826500: -nan
1392827000: -nan
1392827500: -nan
1392828000: -nan
1392828500: -nan
1392829000: 1.6382197646e+04
1392829500: -nan
…………...
[root@Wiker ~]# rrdtool fetch -r 50 /tmp/test.rrd AVERAGE
…………………...
1392828650: -nan
1392828700: 1.6038061308e+04
1392828750: 1.5777184825e+04
1392828800: 1.4118842230e+04
1392828850: 2.0321739300e+04
1392828900: -nan
……………………….
如果取时间解析度为10的数值出来,因为没有解析度为10,所以他就会输出解析度为5的
[root@Wiker ~]# rrdtool fetch -r 10 /tmp/test.rrd AVERAGE
………………………
1392828640: -nan
1392828645: 1.1408749516e+04
1392828650: 1.9429023496e+04
1392828655: 1.6702171333e+04
1392828660: 1.2129515630e+04
1392828665: 1.6643033052e+04
1392828670: 9.0811285580e+03
1392828675: 4.9061926000e+03
1392828680: 1.4646969016e+04
1392828685: 1.5303605601e+04
1392828690: 1.3794829744e+04
1392828695: 2.8930643039e+04
1392828700: 2.8242524505e+04
1392828705: 1.7929997124e+04
1392828710: 7.5651048024e+03
1392828715: 1.4967636932e+04
1392828720: 2.1898615851e+04
1392828725: 8.2618389920e+03
1392828730: 2.0095120818e+04
……………..
rrdtool绘图
语法:
rrdtool graph|graphv filename [option ...] [datadefinition ...] [data calculation ...] [variable
definition ...] [graph element ...] [print element ...]
[-s | --start time ] [-e | --end time ] [-S | --step seconds ]
[-t | --title string ] [-V | --Vertical-label string ]
[-w | --width pixels ] [ -h | --height pixels ] [-j| --only-graph ][-D|--full-size-mode]
OPTION:
Graph Limits
[-u | --upper-limit value]:显示数值的最大上限的值
[-l | --lower-limit value]:显示的最低下限的值
[-r | --rigid ]:不会自动缩放,以定义的最大值和最小值来显示
[-A | --alt-autoscale ]:启用自动缩放,但是最大的和最小的是不能超过上面的范围
[-J | --alt-autoscale-min]:只自动缩放最小值
[-M | --alt-autoscale-max ]:只自动缩放最大值
[-N | --no-gridfit]:不显示网格线
定义横轴:
X-Axis
[-x|--x-grid GTM:GST(定义基准网格线,前面是单位,后面是数值):MTM:MST(定义主网格线,前面的是单位,后面的是数值):LTM:LST(定义横轴底面的标签的单位和距离,前面是单位,后面是距离):LPR:LFM(显示标签的显示格式)]
[-x | --x-grid none ]
示例: --x-grid MINUTE:10:HOUR:1:HOUR:4:0:%X #定义横轴的基准网格线是以分钟为单位以10分钟为距离进行划分;定义主网格线以小时为单位以1小时为距离;然后低昂一横轴地面的标签以小时为单位,以4小时为距离进行标示;然后定义标签的显示格式
Y-Axis
[-y|--y-grid grid(刻度是什么) step(多长显示一个刻度):label(卷标显示是什么) factor(卷标多长时间显示一个)]:
[-y|--y-grid none ]
[-Y| --alt-y-grid]
Miscellaneous
[-c| --color COLORTAGE #rrggbb[aa]]
BACK #背景色
CANVAS #画布颜色
SHADEA #左边和上边的颜色
SHADEB #右边和下边的颜色
GRID,MGRID #主网格线的颜色
FONT #字体颜色
AXIS #坐标轴的颜色
FRAME #边框颜色
ARROW #箭头的颜色
-n | --font FONTTAG(字体名字):size(大小):[font(路径)] #指定字体的参数
[-R|--font-render-mode(字体格式) {normal(正常),light(发亮),mono(粗体)}]
[-a|--imgformat PNG|SVG|EPS|PDF] #图像输出格式
[-W| --watermark string ] #加水印
Data and variables
定义数据获取方式:
DEF:vname(变量名,只能包含数字和字母,最长不能超过255字符)=rrdfile(rrd文件路径):ds-name(数据源名称):CF(聚合函数)[:step=step][:start=time][:end=time]
CDEF:vname=RPN expression
VDEF:vname=RPN expression
Graph
线状图:
LINE[width(线条的粗细程度,1最细的3是最粗的)]:value(上面定义的变量名称)[#color(线条颜色)][:[legend(底面的标签名称)][:STACK]][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]
面积图:
AREA:value[#color][:[legend][:STACK]]
生成图:
首先从数据库里面取出一个时间点
[root@Wiker ~]# rrdtool graph /tmp/test.png --step 5 --start 1392833490 DEF:vartest=/tmp/test.rrd:testds:AVERAGE LINE1:vartest#FF0000:testline
[root@Wiker ~]# ll /tmp/test.png
-rw-r--r--. 1 root root 9794 Feb 19 15:21 /tmp/test.png
然后可以使用gthumb来查看
[root@Wiker ~]# gthumb /tmp/test.png
解析度5和50同时显示
[root@Wiker ~]# rrdtool graph /tmp/test1.png -t test --start 1392833490 DEF:vartest=/tmp/test.rrd:testds:AVERAGE:step=5 DEF:vartest2=/tmp/test.rrd:testds:AVERAGE:step=50 LINE1:vartest#FF0000:testline LINE1:vartest2#00FF00:testline2
[root@Wiker ~]# gthumb /tmp/test1.png
显示收集的当前值和最大值
只要在生成图的最后面定义一个GPRINT
语法:GPRINT:vname:CF:format
[root@Wiker ~]# rrdtool graph /tmp/test2.png -t test --start 1392833490 DEF:vartest=/tmp/test.rrd:testds:AVERAGE:step=5 DEF:vartest2=/tmp/test.rrd:testds:AVERAGE:step=50 LINE1:vartest#FF0000:testline GPRINT:vartest2:AVERAGE:"AVERAGE\:%6.2lf"
481x174 #显示解析度为50的平均值
[root@Wiker ~]# gthumb /tmp/test2.png
[root@Wiker ~]# rrdtool graph /tmp/test1.png -t test --start 1392833490 DEF:vartest=/tmp/test.rrd:testds:AVERAGE:step=5 DEF:vartest2=/tmp/test.rrd:testds:AVERAGE:step=50 LINE1:vartest#FF0000:testline GPRINT:vartest2:MAX:"MAX\:%6.2lf"
481x174 #显示解析度为50的最大值
[root@Wiker ~]# gthumb /tmp/test1.png