RRDtool (Round Robin Database Tool)就是一个强大的绘图的引擎,很多工具例如MRTG都可以调用rrdtool绘图。包括现在使用很多的cacti也是基于rrdtool的基础上画图的,可以说cacti只是提供一个显示图形的web页面。

        rrdtool:所谓的round robin指的就是一种环形数据库:数据的存储方式是一个圆环形式存储的,我们可以自己去定义,数据能够存放多久,给它多大的空间。当我们的空间填满之后,后面的数据又可以覆盖前面的数据。所以rrdtool数据库是不会增大的。(但是我们也要明白一个道理。既然数据填满之后会覆盖,那么我们多给它定义就好了):建立数据库一般名称我们都定义为 .rrd的后缀文件。(如下图所示:)

rrdtool学习和自定义脚本绘制图形备忘_空间

主要理解的概念:用一张图说明:

rrdtool学习和自定义脚本绘制图形备忘_建立数据库_02

  • 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的数据,绘图时使用的也是这些数据

绘图思路:

1、建立数据库:

2、抓取数据流量

3、更新rrdtool数据库

4、绘制图形

定义一个监控mysql访问量,绘制图形:

1、定义数据库:

[root@node1 ~] # rrdtool create mysql.rrd --step 3 DS:mysqlselect:COUNTER:5:0:U RRA:AVERAGE:0.5:1:28800 RRA:AVERAGE:0.5:10:2880 RRA:MAX:0.5:10:2880 RRA:LAST:0.5:10:2880

注释:DS:数据来源:DST类型为COUNTER:延迟5秒内收到数据有效:最小值:最大值

RRA:合并数据类型:(平均值。最大值,最小值):0.5表示unknow。失效大于0.5的概率的话不生成数据:1(表示一个PDP单元汇总。5表示5个PDP单元汇总平均):28800这里表示一天算法举例(一天86400s/3/1 第二个值:86400/3*10)

然后当前目录下就生成了:mysql.rrd文件:

rrdtool学习和自定义脚本绘制图形备忘_空间_03

2、定义收集数据:

(1)定义一个手机Mysql数据并发量的脚步(死循环):

rrdtool学习和自定义脚本绘制图形备忘_数据源_04中间的命令:

SELECT=`mysql --batch -e "show global status like 'Com_select' "| awk '/Com_select/{print $2}'`

这里命令是在shell模式下。查看Mysql并发量(数据库密码为空):

第二:rrdtool update mysql.rrd N:$SELECT (更新mysql.rrd数据库,N表示当前时间。$SELECT获取并发个数)

(2)这里为了数据更明显的现实,在写一条死循环脚步。往中间不断的插入数据(前面已经创建好了数据库testdb和表tb1。tb1定义两个字段分别为ID和NAME。ID 字段注意制定自动增长):

[root@node1 ~] # vim insert.sh

#!/bin/bash

#

for I in {1..200000}; do

     mysql -e "INSERT INTO testdb.tb1(name) VALUES ('stu$I')"

     mysql -e "SELECT * FROM testdb.tb1" &> /dev/null

done

注释:脚步不断的里面插入数据,和查询,这样并发就高了。

(3)分别执行脚本: bash -x getselect.sh  和bash -x insert.sh (观察是否有报错,有的话检查脚本,脚本运行不能中断,分别开三个窗口执行。到这一步数据的更新已经完成了,接下来就是绘制图形了:

3、绘制图形:

rrdtool fetch -r 3 mysql.rrd AVERAGE  #查看是否手机到数据:

rrdtool学习和自定义脚本绘制图形备忘_检测_05:

可以看到已经收集到了数据: -nan表示没有数据:有数值的表示收到了数据:

接下来就可以绘制图形:我们就从有数据的时间开始收集数据。比如:1417853451

开始绘图:

[root@localhost rrd]# rrdtool graph mysql1.png -s 1417853451  -t "mysql select" -v "selects/3" DEF:select3=mysql.rrd:mysqlselect:AVERAGE:step=3 LINE1:select3#FF0000:"select"

497x174

[root@localhost rrd]# 

注释:-s表示绘制开始时间。默认是10s之前.也可以-N指定当前时间。 -t 表示图片的抬头: -v 表示X轴的名称: DEF(绘制图形的方法):select3变量=mysql.rrd:mysqlselect:AVERAGE(绘制类型也可以表示MAX和LAST当前值):step=3(解析度,表示每3s手机汇总图像) LINE1(制定图像绘制类型):select3#ff0000(线条颜色)

可以看到当前目录下面生成了。myslq1.png的图片。把图片拉到windows电脑上,现实如下所示:

rrdtool学习和自定义脚本绘制图形备忘_检测_06

出图已经完成,要是定期手机数据,可以用snmpd协议手机客户端的数据。然后生成,最后用一个简单的web静态网页生成图形;

1、生成库:

[root@node1 ~] # rrdtool create nginx.rrd --step 3 DS:mysqlselect:COUNTER:5:0:U RRA:AVERAGE:0.5:1:28800 RRA:AVERAGE:0.5:10:2880 RRA:MAX:0.5:10:2880 RRA:LAST:0.5:10:2880

扩展:平时我们经常要绘制一些像nginx并发量连接的数据:我们可以这样写一条脚本:

2、#!/bin/bash

#

while true ; do 

   EST=`netstat -anp | grep EST | grep php-fpm | wc -l`

   rrdtool update nginx.rrd N:$EST

3、绘制图形:

rrdtool graph nginx.png -s 1417853451  -t "nginx select" -v "selects/3" DEF:select3=nginx.rrd:mysqlselect:AVERAGE:step=3 LINE1:select3#FF0000:"select"

到这里监控并发量已经完成,这里我就不做测试结果,写这个遇到问题的朋友可以交流一下。