设为首页 收藏本站
查看: 2213|回复: 0

[经验分享] Cacti的配置详解(一)——使用rrdtool绘图

[复制链接]

尚未签到

发表于 2015-11-22 15:54:47 | 显示全部楼层 |阅读模式
  今天终于可以总结新的课程了,这两天又把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是一种处理定量数据、以及当前元素指针的技术。想象一个周边
  标有方&#26684;的圆环--这些方&#26684;就是时间存储的位置。从圆心画一条到圆周的某个方&#26684;的箭头--这就是指针。就像我们在一个圆环上一样,
  没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据
  集不会增大,并且不需要维护。RRDtool处理RRD数据库。它用向RRD数据库存储数据、从RRD数据库中提取数据(来源百度问答 )。
  
  2.特点(来自于“浮云飘飘的——RRDTool 详解”)
  

  • 首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得RRDtool看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。
  • RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的,也就是说rrd文件的大小(或者叫数据库)在创建之初就已经确定了大小,即如果数据源不足,则空闲下来,如果超过限定&#20540;则直接覆盖。
  • 其他数据库只是被动的接受数据,RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of change),并存储该结果。
  • RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到&#20540;,则会用 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;
&#43;-------&#43;------------------&#43;------&#43;-----&#43;---------&#43;----------------&#43;
| Field | Type             | Null | Key | Default | Extra          |
&#43;-------&#43;------------------&#43;------&#43;-----&#43;---------&#43;----------------&#43;
| ID    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| NAME  | char(50)         | NO   |     | NULL    |                |
&#43;-------&#43;------------------&#43;------&#43;-----&#43;---------&#43;----------------&#43;
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&#43;子命令查看,如man rrdupdate,如果提示:
  No manual entry for rrdcreate 这是因为rrdtool的man命令没有被系统man命令识别。需要在/etc/man.conf添加一行代码,将rrdtool的man路径添加进去即可。我的是:

  MANPATH /usr/local/rrdtool/share/man/
  添加完以后保存退出即可。
  
rrdtool create命令的语法&#26684;式如下:
rrdtoolcreate filename[--start|-bstart time ][--step|-sstep]DS:ds-name:DST:dstarguments #最后获取的数据是PDP,更新数据时要考滤DS顺序(*把所有要更新的数据,按照DS定义的顺序用冒号&#26684;开*)RRA:CF:cfarguments #最后获取的数据是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 都会收到一个&#20540;;RRDtool 在收到脚本给来的&#20540;后会计算出另外一个&#20540;(例如平均&#20540;),这个 &#20540;就是 PDP ;这个&#20540;代表的一般是“xxx/秒”的含义。注意,该&#20540;不一定等于RRDtool 收到的那个&#20540;。除非是GAUGE ,可以看下面的例子就知道了
  • CF:CF 就是 Consolidation Function 的缩写。也就是合并(统计)功能。有 AVERAGE、MAX、MIN、LAST 四种分别表示对多个PDP 进行取平均、取最大&#20540;、取最小&#20540;、取当前&#20540;四种类型。具体作用等到 update 操作时再说。
  • CDP:Consolidation Data Point 。RRDtool 使用多个 PDP 合并为(计算出)一个 CDP。也就是执行上面 的CF 操作后的结果。这个&#20540;就是存入 RRA的数据,绘图时使用的也是这些数据
  

下面是RRA与PDP、CDP之间的关系图,
DSC0000.jpg
  
(0).filename
默认是以 .rrd 结尾,但也以随你设定。


(1).--start|-b start time
设 定RRD数据库加入的第一个数据&#20540;的时间,从1970-01-01 00:00:00 UTC时间以来的时间(秒)。RRDtool不会接受早于或在指定时刻上的任何数&#20540;。默认&#20540;是now-10s;如果 update 操作中给出的时间在 –-start 之前,则 RRDtool拒绝接受。--satrt 选项也是可选的。 如果你想指定--start 为1天前,可以用CODE:--start$(date -d '1 days ago' &#43;%s)。注意,--start 选项的&#20540;必是 timestamp 的&#26684;式。


(2).--step|-s step
指定数据将要被填入RRD数据库的基本的时间间隔。默认&#20540;是300秒;


(3).DS:ds-name:DST:dst arguments DS(Data Source)
DS:DS 用于定义 Data Soure 。也就是用于存放结果的变量名。 DS是用来申明数据源的,也可以理解为申明数据变量,也就是你要检测的端口对应的变量名,这个参数在画图的时候还要使用的。这里开始定义RRD数据的基本 属性;单个RRD数据库可以接受来自几个数据源的输入。在DS选项中要为每个需要在RRD中存储的数据源指定一些基本的属性;ds-name数据域命 名;DST定义数据源的类型,dstarguments参数依赖于数据源的类型。

DST 定义数据源的类型。数据源项的后续参数依赖于数据源的类型。对于GAUGE、COUNTER、DERIVE、以及ABSOLUTE,其数据源的&#26684;式为: DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max。DST的选择是十分重要的,如果选错了 DST ,即使你的脚本取的数据是对的,放入 RRDtool 后也是错误的,更不用提画出来的图是否有意义了。

  • GAUGE :GAGUE 和上面三种不同,它没有“平均”的概念,RRDtool 收到&#20540;之后字节存入 RRA 中。
  • COUNTER :必须是递增的,除非是计数器溢出。在这种情况下,RRDtool 会自动修改收到的&#20540;。例如网络接口流量、收到的packets 数量都属于这一类型。
  • DERIVE:和 COUNTER 类&#20284;。但可以是递增,也可以递减,或者一会增加一会儿减少。
  • ABSOLUTE :ABSOLUTE 比较特殊,它每次都假定前一个interval的&#20540;是0,再计算平均&#20540;。
  • COMPUTE :COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个&#20540;。例如 CODE:DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:eth0_bytes,8,* 则 eth0_bytes 每得到一个&#20540;,eth0_bits 会自动计算出它的&#20540;:将 eth0_bytes的&#20540;乘以 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个数据,求的平均&#20540;。17280则表示5秒取一次数据,一天一共能取得17280个数据。同理:

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

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

  

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

  6.下一步开始更新数据库的数据源,更新命令
  # rrdtool update mysql.rrd N:VALUE (N表示从当前时间开始取&#20540;),这里我们使用一个脚本来每个5秒钟去更新一下rrd数据库。
  vi getselect.sh
  #!/bin/bash
#
while true ;do
  SELECT=`mysql -uroot -pmysql --batch -e &quot;SHOW GLOBAL STATUS LIKE 'Com_select'&quot;|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 &quot;insert into testdb.tb1 (NAME) VALUES ('Student$I')&quot;
  mysql -uroot -pmysql -e &quot;select * from testdb.tb1&quot; &>/dev/null
done

  现在就看可以让两个脚本去执行了,但是执行之前最好记下当前的时间,使用date &#43;%s来看。
  [iyunv@mail rrdtest]# date &#43;%s
1439192683

  现在执行两个脚本。
  

  7.绘图
  在绘图之前,我们可以先看一下有没有rrd数据库中有没有生成数据。
  # rrdtool fetch -r 5 mysql.rrd AVERAGE 表示每5秒取一次数据库中的平均&#20540;。发现已产生很多数据:
  1439192875: 1.3120413204e&#43;02
1439192880: 1.4578297252e&#43;02
1439192885: 1.4144421378e&#43;02
1439192890: 1.3365708987e&#43;02
1439192895: 1.3253400089e&#43;02
1439192900: 1.3894174516e&#43;02
1439192905: 1.8785278810e&#43;02
1439192910: 2.2827370068e&#43;02
1439192915: 2.3634196109e&#43;02
1439192920: 2.3257388295e&#43;02
1439192925: 2.2353561467e&#43;02
1439192930: -nan
1439192935: -nan
[iyunv@mail rrdtest]#

  

  现在开始正式绘图:
  # rrdtool graph mysql.png -s 1439192683 -t &quot;Mysql Select&quot; -v &quot;Selects per 5s&quot; DEF:select=mysql.rrd:myselect:AVERAGE:step=5 LINE1:select#FF0000:&quot;Selects/5&quot;

  

  注意:有可能会报错,且画出的图是乱码&#26684;式的,原因是确实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进制数据产生。颜色对应表如下:
DSC0001.jpg

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

  

  除此之外,我们还可以在一个图表上显示多个数据展示图。
  # rrdtool graph mysql.png -s 1439192683 -t &quot;Mysql Select&quot; -v &quot;Selects per 5s&quot; DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:select2=mysql.rrd:myselect:MAX:step=10 LINE1:select#FF0000:&quot;Selects/3&quot; LINE2:select2#00ff00:&quot;MAX in 10s&quot;

DSC0003.jpg

  当然,我们也可以只取&#20540;,不用线条展示,如下:
  # rrdtool graph mysql.png -s 1439192683 -t &quot;Mysql Select&quot; -v &quot;Selects per 5s&quot; 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:&quot;Selects/3&quot; LINE2:select2#00ff00:&quot;MAXin 10s&quot; GPRINT:max30:MAX:&quot;Maximum\: %10.2lf&quot;,则生成数据图表如下;

DSC0004.jpg

  

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

  补充:除此之外,rrdtool还可以在一个图表上展示不同的不同的数据源,相比较之前的实验,这个应该是更适合生产环境。
  实验方法和之前的类&#20284;:
  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 &quot;show global status like 'Com_select'&quot;|awk /Com_select/'{print $2}'`
  INSERT=`mysql --batch -e &quot;show global status like 'Com_insert'&quot;|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 &quot;INSERT INTO testdb.tb1 (ID,NAME) VALUES ($I,'Student$I')&quot;
  mysql -e &quot;SELECT * FROM testdb.tb1&quot; &> /dev/null
  done
  

  创建展示图表
  # rrdtool graph mysql.png -s 1439216117 -t &quot;Mysql Operation&quot; -v &quot;Select & Insert&quot; DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:insert=mysql.rrd:myinsert:AVERAGE:step=5 LINE1:select#FF0000:&quot;Select&quot; LINE2:insert#00FF00:&quot;Insert&quot;
  如下图所示:(妈蛋,服务器正在维护,上传不来,我说今天访问肿么辣么慢)

  今天可以了。
DSC0005.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-142250-1-1.html 上篇帖子: Windows下Cacti插件 -4 下篇帖子: Linux查看某一进程的占用CPU的Cacti脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表