cacti介绍
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。它通过snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数。因此,snmp和rrdtool是cacti的关键。Snmp关系着数据的收集,rrdtool关系着数据存储和图表的生成。
snmp抓到数据不是存储在mysql中,而是存在rrdtool生成的rrd文件中(在cacti根目录的rra文件夹下)。rrdtool对数据的更新和存储就是对rrd文件的处理,rrd文件是大小固定的档案文件(Round Robin Archive),它能够存储的数据笔数在创建时就已经定义。
rrdtool介绍,以及使用
RRDtool 代表 “Round Robin Database tool” ,作者同时也是 MRTG 软件的发明人。官方站点位于http://oss.oetiker.ch/rrdtool/ 。 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数 据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会 随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间 都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是'.rrd’。
关键命令
查询数据
导出数据
导入数据
rrd文件的导出及数据修改
cacti中,rrd文件一般保存在/var/www/html/rra/路径下。
可以在图形找到使用的rrd文件,如下所示:
确定了rrd文件,就可以准备导出修改了。
在修改之前,先要关闭cacti的计划任务,如下所示:第一条,10分钟执行一次,ntp同步;第二条,5分执行一次,采集数据。导出和修改之前,建议吧第二条计划任务删除,这样避免了在修改数据的时候还在执行更新,导致异常。在完成修改导入后,在恢复此计划任务。为了不出现数据丢失等问题,导出修改数据和导入动作,最好在5分钟内完成。
按照如下方式导出rrd为xml格式
cp 316.rrd 316.rrd.bak #备份 rrdtool dump 316.rrd > 316.xml #导出为xml导出的xml文件如下所示:
其中,xml文件中<dadabase></datbase>节点就是保存的数据,采用科学计数法说明:1.rrd中,是以unix时间戳的方式记录数据的,它记录了从1970年以来现在所有保存的数据。所以很多时间的数据是NaN,空值;2.xml中,<!--->是注释,注释的内容就是时间,如2021-11-11,是给人看的,但是在xml和rrd中不会被执行或者显示。3.从xml中可以看出,rrd是以时序来保存数据,以300秒为步长,依次按照时间戳记录从1970年以来的的数据。
关于xml中其他节点,无需我们考虑,我们只要考虑<row><v>节点数值就可以了。
修改xml
1.使用记事本,或者notepad软件,直接搜索替换。比如找到所有2021-11-11的数据,一条一条的修改。这种方式时候修改空值,其他时候无能为力。
2.使用excel读取xml,可以做到批量修改。如下所示:
可以批量用公式修改,但是没有显示时间(<!---->表示注释),所有无法修改指定时间段的数据。
导入修改数据
修改完成后按照如下方式导入
rm 316.rrd #删除旧数据 rrdtool restore 316.xml 316.rrd #导入修改后的数据修改完成后,可以查询以下数据是否存在
rrdtool fetch 316.rrd AVERAGE --start $(date -d '1 days ago' +%s) --end $(date -d now +%s)确定数据存在后,恢复计划任务,重建采集器,这样就把数据改好了
修改前:
修改后:
自动修改rrd脚本
我们虽然能够导出数据修改,但是修改的时候很不方便,所以我就写了个脚本,全自动导出导入修改,修改一个月数据指标为80%以下为脚本:
#coding=utf-8 #解析修改数值 #python2版本 #查询指定1个月数据,按照比例修改为80% #使用前请先关闭*/5 * * * * php /var/www/html/poller.php > /dev/null 2>&1 计划任务 #修改完成后,再启动*/5 * * * * php /var/www/html/poller.php > /dev/null 2>&1 计划任务 #使用前先请安装rrdtool #使用方式 python modity_xml_new.py /var/www/html/rra/1/333.rrd #杨超 v1.0 import re import os import sys import time def percent(matched): """ 对于匹配的数值比例 """ value=float(matched.group('value')) # value=int(format(value,'.10f')) #保留计算10位小数 return str(value*0.8) #80%的比例 def modify_xml(rrd_xml,rrd_xml_out,timerange): """ rrd_xml:原有数据 rrd_xml_out:修改后的数据 """ with open (rrd_xml,'r') as f: lines=f.readlines() #print(lines) with open (rrd_xml_out,'a') as f1: for line in lines: if timerange in line: line_new= re.sub('(?P<value>\d.\d{8,20})',percent,line) print line_new f1.write(line_new) else: line_new=line f1.write(line_new) def modify_data(rrd_file,rrd_xml_out): """ 删除原有rrd文件,不然无法导入 导入新数据 查询数据是否更改 """ os.remove(rrd_file) try: cmdline_modify="rrdtool restore "+rrd_xml_out+" "+rrd_file os.system(cmdline_modify) except Exception as e: print e sys.exit(0) time.sleep(5) cmd_fetch="rrdtool fetch "+rrd_file+" AVERAGE --start $(date -d '1 month ago' +%s) --end $(date -d now +%s)" os.system(cmd_fetch) print "ok" if __name__ == '__main__': try: rrd_file=sys.argv[1] except FileNotFoundError: sys.exit(0) (name,ext)=os.path.splitext(rrd_file) rrd_txt=name+'.txt' rrd_xml=name+'.xml' rrd_xml_out=name+'.new_xml' rrd_file_bak=name+'.rrd.bak' if os.path.exists(rrd_xml_out): os.remove(rrd_xml_out) if os.path.exists(rrd_file_bak): os.remove(rrd_file_bak) if os.path.exists(rrd_xml): os.remove(rrd_xml) timerange="<!-- 2021-11-" #此处修改为要指定的时间范围 try: cmd_line_bak="cp "+rrd_file+" "+rrd_file+".bak" #备份rrd文件 os.system(cmd_line_bak) except Exception as e: print e sys.exit(0) time.sleep(3) try: cmd_line_xml="rrdtool dump "+rrd_file+">"+rrd_xml #导出xml os.system(cmd_line_xml) except Exception as e: print e sys.exit(0) #失败后退出 time.sleep(5) #等待5秒,导出 modify_xml(rrd_xml,rrd_xml_out,timerange) modify_data(rrd_file,rrd_xml_out)执行效果如下:
真的,感觉工作又轻松了