今天终于可以总结新的课程了,这两天又把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 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"
如下图所示:(妈蛋,服务器正在维护,上传不来,我说今天访问肿么辣么慢)
今天可以了。