Cacti的配置详解(一)——使用rrdtool绘图

来源:互联网 发布:csgo 电击枪 知乎 编辑:程序博客网 时间:2024/05/21 07:48

今天终于可以总结新的课程了,这两天又把cacti仔细学了一下,之前虽然也会用,但是只知其然不知其所以然,正好趁热打铁总结一下,如果有错的希望看到的高手可以不吝指教。非常感谢!

首先介绍一下rrdtool的安装,这个很简单了。我使用的是1.4.8版本,直接解压后,编译安装就可以了,目前没有指定特定的编译参数。


Rrdtool的安装

# tar -xvf rrdtool-1.4.8.tar.gz

#  cd rrdtool-1.4.8

# ./configure --prefix=/usr/local/rrdtool2

# make && make install

测试一下能不能正常使用

# /usr/local/rrdtool2/bin/rrdtool 

看下能否正常显示rrdtool的版本号

RRDtool 1.4.8  Copyright 1997-2013 by Tobias Oetiker <tobi@oetiker.ch>
               Compiled Jul 23 2015 14:06:45

 好了,现在把执行路径加到环境变量中,以后就可以直接使用rrdtool来调用这个命令了。

# vi /etc/profile.d/rrdtool2.sh

export PATH=$PATH:/usr/local/rrdtool2/bin

保存退出,执行

# source /etc/profile.d/rrdtool2.sh

# echo $PATH
/usr/local/mysql/bin:/usr/local/openssl/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/rrdtool2/bin


这样就可以直接调用了,下面开始正式介绍rrdtool。

RRDtool是指Round Robin Database 工具(环状数据库)。Round robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边

标有方格的圆环--这些方格就是时间存储的位置。从圆心画一条到圆周的某个方格的箭头--这就是指针。就像我们在一个圆环上一样,

没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据

集不会增大,并且不需要维护。RRDtool处理RRD数据库。它用向RRD数据库存储数据、从RRD数据库中提取数据(来源百度问答 )。

2.特点(来自于“浮云飘飘的——RRDTool 详解”)

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

  • RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的,也就是说rrd文件的大小(或者叫数据库)在创建之初就已经确定了大小,即如果数据源不足,则空闲下来,如果超过限定值则直接覆盖。

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

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


3.rrdtool绘图的步骤

a)创建rrd数据库

b)更新rrd数据库,即取得rrd数据

c)将获得的数据,在通过不同的聚合方式以图表的方式展现出来。


4.使用rrdtool创建一个图表,用于展现不同时间间隔下,mysql数据库的插入和查询情况。

a)首先需要创建一个模拟的数据库——testdb

mysql> create database testdb;
Query OK, 1 row affected (0.03 sec)

b)创建测试表——tb1

mysql> use  testdb;
Database changed
mysql> create table tb1(ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,NAME CHAR(50) NOT NULL);
Query OK, 0 rows affected (0.01 sec)

c)查看一下表结构

mysql> desc tb1;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| ID    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| NAME  | char(50)         | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

 创建好之后退出。


5.创建一个rrd数据库。

# cd /usr/local/rrdtest/

# rrdtool create mysql.rrd --step 5 DS:myselect:COUNTER:10:0:U RRA:AVERAGE:0.5:1:17280 RRA:AVERAGE:0.5:10:1728 RRA:MAX:0.5:20:1728

注:关于rrdtool的子命令(如:update、fetch、create、graph等),可以使用man rrd+子命令查看,如man rrdupdate,如果提示:

No manual entry for rrdcreate 这是因为rrdtool的man命令没有被系统man命令识别。需要在/etc/man.conf添加一行代码,将rrdtool的man路径添加进去即可。我的是:

MANPATH /usr/local/rrdtool/share/man/

添加完以后保存退出即可。

 

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

现在对rrdtool参数进行解读,感谢浮云飘飘,这里也主要参考了他总结的。

  • DS:DS 用于定义 Data Soure 。也就是用于存放结果的变量名。DS是用来申明数据源的,也可以理解为申明数据变量,也就是你要检测的端口对应的变量名,这个参数在画图的时候还要使用的。

  • DST:DST 就是DS的类型。有 COUNTER、GAUGE、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之间的关系图,


(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参数依赖于数据源的类型。


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,*



注:我个人的理解是rrd数据库中存储的数据其实是PDP数据,但是展示给用户的,是用户定义且根据聚合函数获得的CDP数据。因此可以简单理解为rrd数据库中存储的是元数据,展现给用户的是按照其定义的函数获得的数据。


那我现在来解释一下:# rrdtool create mysql.rrd --step 5 DS:myselect:COUNTER:10:0:U RRA:AVERAGE:0.5:1:17280 RRA:AVERAGE:0.5:10:1728 RRA:MAX:0.5:20:1728这条命令的意思。

首先:mysql.rdd是我创建的环形数据库,用于存放展示元数据。

--step 5:表示每5秒钟从数据源取一次数据

DS:myselect:COUNTER:10:0:U 表示数据源:名称(myselect),数据源类型(COUNTER),10表示heartbeat(即心跳时间我10秒,超过10秒后的数据认为是unknow),“:0”表示从数据源能接受的最小数据是0,“:U”表示从数据源能接受的最大数据为未知。

RRA:AVERAGE:0.5:1:17280 定义聚合函数,即用户需要显示怎样的数据。本段则表示:定义聚合函数为AVERAGE,0.5表示从PDP数据中取得数据如果有50%的数据是正确的,则认为该项数据有效,否则为unknow。1表示取1个数据,求的平均值。17280则表示5秒取一次数据,一天一共能取得17280个数据。同理:

RRA:AVERAGE:0.5:10:1728则表示对10个PDP数据进行聚合,聚合函数选择AVERAGE,即求得从10个rrd元数据中的平均值作为某个时刻的展示数据。这样就相当于50秒才能生成一个有效数据,一天能生成1728个有效数据。

RRA:MAX:0.5:20:1728 表示每10个元数据求得一个最大值展给用户,这样的数据一天能产生1728个。


这样我们就创建好了rrd数据库——mysql.rrd。


6.下一步开始更新数据库的数据源,更新命令

# rrdtool update mysql.rrd N:VALUE (N表示从当前时间开始取值),这里我们使用一个脚本来每个5秒钟去更新一下rrd数据库。

vi getselect.sh

#!/bin/bash
#
while true ;do
  SELECT=`mysql -uroot -pmysql --batch -e "SHOW GLOBAL STATUS LIKE 'Com_select'"|awk '/Com_select/{print $2}'`
  /usr/local/rrdtool2/bin/rrdtool update mysql.rrd N:$SELECT
  sleep 5
done

在更新之前,我们先模仿一下用户行为,对tb1表进行插入和查询。于是写了如下脚本:

# vi insert.sh

#!/bin/bash
#
for I in {1..200000};do

mysql -uroot -pmysql -e "insert into testdb.tb1 (NAME) VALUES ('Student$I')"
  mysql -uroot -pmysql -e "select * from testdb.tb1" &>/dev/null
done

现在就看可以让两个脚本去执行了,但是执行之前最好记下当前的时间,使用date +%s来看。

[root@mail rrdtest]# date +%s
1439192683

现在执行两个脚本。


7.绘图

在绘图之前,我们可以先看一下有没有rrd数据库中有没有生成数据。

# rrdtool fetch -r 5 mysql.rrd AVERAGE 表示每5秒取一次数据库中的平均值。发现已产生很多数据:

1439192875: 1.3120413204e+02
1439192880: 1.4578297252e+02
1439192885: 1.4144421378e+02
1439192890: 1.3365708987e+02
1439192895: 1.3253400089e+02
1439192900: 1.3894174516e+02
1439192905: 1.8785278810e+02
1439192910: 2.2827370068e+02
1439192915: 2.3634196109e+02
1439192920: 2.3257388295e+02
1439192925: 2.2353561467e+02
1439192930: -nan
1439192935: -nan
[root@mail rrdtest]#


现在开始正式绘图:

# rrdtool graph mysql.png -s 1439192683 -t "Mysql Select" -v "Selects per 5s" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 LINE1:select#FF0000:"Selects/5"


注意:有可能会报错,且画出的图是乱码格式的,原因是确实liberation的相关组件。

 (process:3530): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='latin'
 (process:3531): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='common'
 (process:3531): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='latin'
 (process:3532): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='common'
 (process:3532): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='latin'
 (process:3536): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='common'
 (process:3536): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='latin'
 (process:3538): Pango-WARNING **: failed to choose a font, expect ugly output. engine-type='PangoRenderFc', script='common'
 
解决问题的方法是安装liberation-fonts-ttf:
 
# yum list all |grep liberation

# yum install –y liberation*



简单解释一下:-s表示开启画图展现的时间,不指定的话默认为当前之间的前10秒,-t指定图表的标题,-v指定图表侧标题。DEF:select定义临时变量,AVERAGE为图表展现聚合函数,step为步长为5秒。

LINE1表示线条的粗细,还有LINE2和LINE3两个级别。select为我们刚刚定义的变量,即对哪个变量应用这些线条粗细以及颜色等等。

#FF0000表示颜色,这个16进制数据表示颜色,其余颜色则是由其他的16进制数据产生。颜色对应表如下:


“Selects/5”表示提示块的字符。生成图标后,如下:



除此之外,我们还可以在一个图表上显示多个数据展示图。

# rrdtool graph mysql.png -s 1439192683 -t "Mysql Select" -v "Selects per 5s" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:select2=mysql.rrd:myselect:MAX:step=10 LINE1:select#FF0000:"Selects/3" LINE2:select2#00ff00:"MAX in 10s"


当然,我们也可以只取值,不用线条展示,如下:

# rrdtool graph mysql.png -s 1439192683 -t "Mysql Select" -v "Selects per 5s" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:select2=mysql.rrd:myselect:MAX:step=10 DEF:max30=mysql.rrd:myselect:MAX:step=30  LINE1:select#FF0000:"Selects/3" LINE2:select2#00ff00:"MAX in 10s" GPRINT:max30:MAX:"Maximum\: %10.2lf",则生成数据图表如下;



基本的介绍大概就是这些,感觉自己理解的也不是特别透彻,而且理解的应该会有错误的地方。


补充:除此之外,rrdtool还可以在一个图表上展示不同的不同的数据源,相比较之前的实验,这个应该是更适合生产环境。

实验方法和之前的类似:

1.还是使用testdb为测试库,其中tb1位测试表。只不过在创建环形数据库的时候指定了两个数据源,在数据源更新的时候要同时给予更新,最后的展示当然可以同时展示了。大致过程如下:


a)创建环形数据库

# rrdtool  create mysql.rrd --step 5 DS:myselect:COUNTER:10:0:U DS:myinsert:COUNTER:10:0:U RRA:AVERAGE:0.5:1:17280 RRA:AVERAGE:0.5:10:1728 RRA:MAX:0.5:10:1728 


b)更新数据源,脚本如下:

#!/bin/bash

#while true;do

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

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

/usr/local/rrdtool/bin/rrdtool update mysql.rrd :N:$SELECT:$INSERT

sleep 5

done


c)模拟用户行为,脚本如下:

#!/bin/bash

for I in {1..200000};do

mysql -e "INSERT INTO testdb.tb1 (ID,NAME) VALUES ($I,'Student$I')"

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

done


创建展示图表

# rrdtool graph mysql.png -s 1439216117 -t "Mysql Operation" -v "Select & Insert" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:insert=mysql.rrd:myinsert:AVERAGE:step=5 LINE1:select#FF0000:"Select" LINE2:insert#00FF00:"Insert"

如下图所示:(妈蛋,服务器正在维护,上传不来,我说今天访问肿么辣么慢)

今天可以了。


0 0
原创粉丝点击