Round Robin Database Tool(轮询的数据库工具)

环状数据库:大小始终不变,是以时间序列数据

数据库中的数据和我们获取的数据未必是一样的,有可能一样有可能不一样,直接获取的数据对于我们来说没什么意义


对于我们有用的是RRARound Robin Archive轮询归档信息)

PDP(Primary Data Point):主数据点

CDPConsolidation Data Point:聚合数据点

解析度:resolution指的就是时间跨度

DSData Source):数据源,每一个数据源都可以对其做单独的聚合


wKiom1MGBQeTgZ3hAAFCvT3uJvQ662.jpg


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图的一个单独的工具


wKiom1MGBS2zkQtFAAF74XYh5dM154.jpg

ds-name:必须是119个字符,且是a-zA-Z、或者0-9

DST:数据源类型

    GAUGE:保存原值

    COUNTER:数据必须是递增的,保存的是相对于前面的一个值

    DERIVE:可增可减

    ABSOLUTE:相对于初始值的数值

对于COMPUTE数据源来说格式是DS:ds-name:COMPUTE:rpn-expression

dst arguments:数据源参数,形式是:heartbeatminmax

    heartbeat:定义在我们这个时间跨度之内,再过多长时间过期,过期的标记为unknown

   min:接收的最小值

   max:接收的最大值

CF:聚合函数有四种类型,averagemaxminlast  

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 DSds1 DSds2,默认情况下我们想这个数据库里面输入值得话是:rrdtool update test.rrd N:30DS1值):40DS2值),然后我们可以使用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 MINUTE10HOUR1HOUR4: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  #右边和下边的颜色

       GRIDMGRID  #主网格线的颜色

       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

定义数据获取方式:

  DEFvname(变量名,只能包含数字和字母,最长不能超过255字符)=rrdfilerrd文件路径):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]]

面积图:

    AREAvalue[#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

wKiom1MGBzDDuyjlAAD2J4pUTLM349.jpg

解析度550同时显示

[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

wKioL1MGBU-AL1RDAADrgKQUaxw051.jpg


显示收集的当前值和最大值

只要在生成图的最后面定义一个GPRINT

语法:GPRINTvnameCFformat


[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

wKioL1MGBYGB-IAzAADtXAmAiu0352.jpg

[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

wKiom1MGBbqAQy2XAADn5pkDLmA848.jpg