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

[经验分享] CACTI表结构和数据被动获取

[复制链接]

尚未签到

发表于 2015-11-22 15:57:15 | 显示全部楼层 |阅读模式
cacti我们也用了很久了,但是它的表结构一直都没有去关心过,得空抽了半个晚上的时间,把它的库表结构大概看了下,某些字段的含义跟大家分享下:
cacti的数据都是存放在rrdtool中的,数据库存放的其实只是配置数据,cacti的逻辑对象主要分为三种,data(数据)、graph(图片)、host(设备),这在它的表设计中也能很容易的看出来。所以,就分三个大类来讨论了。
一、Host
cactihost一般是要使用模板的,每个host自己的信息,只存放在host表中,其余的就都是模板的信息,模板的对应关系等等。
1host
host表有34个字段,用来存放设备信息,就是我们在consoledevices选项中可以看到,并且配置的东东。具体字段的含义如下:
id:就是设备的id,自增
host_template_id:如果这个设备使用了模板,那这个就是模板的id
description:描述,在cacti里看到的设备名
hostname:设备ip地址
notes:不做解释
snmp_communitysnmp_versionsnmp*......snmp相关的配置选项,就是字面的意思
availability_method:在页面上看就是DownedDevice Detection,我理解就是,如何看这台设备是否挂了
ping_methodudpping还是icmp,还是tcp
ping*......ping的相关选项,字面意思
max_oids:一次最多get多少个oid
status*......:设备当前状态相关,字面意思
一堆time:不太清楚,应该是pollor相关的,具体单位不知
total_polls:总共取了多少次值了
failed_polls:失败了多少次
availability:可用性,上面两个字段算出来的

2host_template
设备模板,总共就三个字段,第一个是id,就是host_template_id,在host表里有引用,第二个是个哈希,就是模板的位置索引,第三个是索引名字。
3host_template_graph
模板的对应,存放的信息主要是,一个设备模板,需要绘什么图,也就是设备模板和绘图模板的对应关系,就两个字段,host_template_idgraph_template_idgraph_template_id就是graph_templates里面的id值。
4host_template_snmp_query
模板和数据抓取方式的对应,对应的数据抓取方式就是snmp_query_id,在snmp_query表的id值。
每个snmp_query,都会对应有graph,如果一个设备模板,对应了一个snmp_query,这个snmp_query又对应了一系列的graph,那这个设备模板就自动对应这些graph,而这个关系在host_template_graph里是没有的
5host_graph
设备和图片模板的对应,也是两个idhost_idgraph_template_idgraph_template_idgraph_templates表中定义。
一般来讲,这个设备下的图片,会包含它所属的设备模板和图片模板的对应,也就是说,这个对应关系,和host_template_graph表中有些类似。
6host_snmp_cache
存放snmp去取值时的临时值,例如网络流量,需要的是累加值,那这里就存上次的总值,用来计算用
7host_snmp_query
设备和snmp_query的对应,和host_graph类似,这个对应关系,和host_template_snmp_query表中的数据是对应的。


二、Data
data主要就是数据获取,获取数据,然后存放到rrd文件中,这里存放的数据,主要就是如何获取数据、和如何存放数据这两种。
1data_input
数据获取的方式,在console中的data_input_method里可以看到。
id:数据获取方式的id
hash:对应的磁盘索引
name:数据获取方式的名字
input_string:如果是脚本的话,那就是脚本的位置了
type_idtype一直没找到对应的表,可能是程序里写死了,对应的是input_type,有6个选项,分别是:snmpsnmpqueryscript/commandscriptqueryscript– script serverscriptquery – script server
2data_input_fields
这张表是用来存放一些data_input方法中所需要的对象,比如snmpoid,那就是一个对象,script方式取硬盘时候,取回来值的名字,单位,都属于它所定义的范畴。表内容,主要是这些对象,和data_input的对应。
idinput_fieldsid
data_input_id:对应data_input表中的id
namedata_name:名字
input_output:输入还是输出
下面几个字段我也不清楚了……
3data_input_data
存放的是每个data对象的data_input_field内容。
data_input_field_iddata_input_field中的id
data_template_data_iddata_template_data中的id
4data_local
存放数据对象,就是在console中的datasource页面看到的东东。不过这张表只是简单的定义一个对象和对应关系,对象的具体属性在另外的表中。
iddataid
data_template_id:采用了哪个数据模板,在data_templates模板中定义
host_id:是哪个设备的数据,在host中定义
snmp_query_id:如果是通过snmp_query方式获取的,那对应的snmp_queryid,如果不是,则为0
snmp_indexsnmp_query方式获取数据时,获取数组的前缀。例如,流量获取中,端口的index
5data_template
数据模板,我们在consoledatatemplates中看到的东东。
id:数据模板的id
hash:索引
name:名字
6data_template_data
具体数据对象的信息,包含模板。可以认为,每一个对象都代表一个rrd文件。
iddata对象的id
local_data_template_data_id:如果使用了模板,那这个就是模板的id,定义的位置也是这个表
local_data_id:对应的数据对象,在data_local表中定义
data_template_iddata_template,数据模板,在data_template表中定义。
data_input_id:数据获取的方式,在data_input表中定义
*name:名字,就是字面的意思
data_source_pathrrd文件的路径
t_*:不知道……
active:是否被激活,可以通过enable/disable来控制
rrd_step:步长,默认是300s,就是5分钟,也就是多长时间存一个数据(rrdcreate的选项)
7data_template_data_rra
数据对象和rra的对应,rra也是rrdtool中的概念,是一种数据归档压缩的机制。
data_template_data_id:上张表中定义的id
rra_id:对应的rraid,在rra表中定义
8data_template_rrd
基本上也是rrdtool的配置选项,一个rrd文件可以存多列,叫做ds,每个列代表一组数据。这张表可以看成是对这个列的定义。
iddsid
local_data_template_rrd_id:如果使用了ds的模板,则这里定义模板的id,模板定义也在这张表中
local_data_id:数据id,在data_local表中定义
data_template_id:采用的数据模板,在data_template_data中定义
其余的都是rrdtool在创建rrd文件时候,对这个ds的配置选项,例如最大值,名字等等。

data部分还是比较复杂的,如果和host连起来看,就更复杂了。抛开模板不谈,一般来讲是有以下的对应关系:
1、每个host_id,都有一组local_data_id,例如,一个cisco交换机的cpu就是一个local_data_id,它的一个端口——te1/1流量,也是一个local_data_id。一个host_id对应多个local_data_id
2、每个local_data_id,就是一个数据源,它必须有一个rrd文件与他对应,所以每个local_data_iddata_template_data中,必定对应一行记录,必定有一个rrd文件。别看data_template_data中有那么多记录,其中local_data_id0的,或者rrd路径为空的,那都是模板。
3、每个rrd文件,必然至少有一个ds,也就是在data_template_rrd中,至少有一条记录,例如流量,还是cisco的交换机,每个端口代表一个local_data_id,有一个rrd文件,有两个ds,流入和流出,那在data_template_rrd中就有两条记录。
4data_input那几张表,主要是数据获取方式,数据获取方式有6种,我们一般用的是三种:脚本直接取,就是scriptsnmp,给个oid直接getsnmpquery,就是snmp取回来一组数据,然后分组。


三、Graph
绘图方面,自定义的方法其实很多,cacti并没有把rrdtool在绘图方面的参数全部表现出来,不过也已经够用了。
1graph_local
本地的图片,和data_local类似,一般来讲,一个data_local的对象,都会对应一个graph_local的对象,意思就是,一个数据,对应一张图片,但是也有可能出现不对应的情况,那就是:我有些数据并不绘图、或者有些图我需要多个数据。
表结构和data_local类似,不过data_template_id换成了graph_template_id,第一个id字段代表的含义也变了,代表graph对象。
2graph_templates
绘图模板。
id:模板的id
hash:索引
name:名称
3graph_template_input
graph_template对应的具体对象类型,比如说这个类型是个颜色,这个类型是流量数据流入的数据源,等等。
id:数据类型的id
hash:索引
graph_template_id:图片模型的id,在graph_template中定义
name:名字
description:不作说明了
column_name:对象的类型,是颜色,还是数据源,还是一段文字
4graph_template_input_defs
定义图中的具体对象类型和item的对应。
graph_template_input_idgraph_template_inputid,类型是什么
graph_template_item_id:具体对象的id,在graph_templates_item中定义
5graph_templates_gprint
输出格式
6graph_templates_graph
绘图时候的选项,每张图在这张表中对应一条记录,大多是rrdtool的参数。和data_template_data类似。
id:绘图选项的id
local_graph_template_graph_id:如果采用模板的话,这里就是模板的id。模板中定义好的东西,就不用重新定义了。在本张表中有定义
local_graph_id:是哪张图,在graph_local中定义
graph_template_id:在graph_templates表中定义的绘图模板
剩下的都是rrd绘图的选项了,例如绘的图有多高,多宽,图片的名字是啥等等......
7graph_templates_item
每张图上,对应的有些什么内容。内容主要是包含:线或者是面,就是趋势图、下面的标注,例如最大值,最小值,当前值。
iditemid
hash
local_graph_template_item_id:如果采用了模板,则写模板的id,在本表中定义
local_graph_id:对象属于哪张图
graph_template_id:在graph_templates表中定义的绘图模板
task_item_id:如果对象的类型是task_item_id(在graph_template_input中定义),则这里的id就是数据源的id,在data_template_rrd中定义。
color_id:颜色,在color表中定义
alpha:透明度
graph_type_id:图的类型?
cdef_id:如果这个值是计算出来的(例如多个值的累加),那这里要有计算的公式,在cdef表中定义
consolidation_function_id:功能函数,比如取平均值,取最大值等
text_format:字符串,直接显示在图上的东东,可以理解为对象的名字
value:值
hard_return:不知
gprint_id:输出格式
sequencerrd的绘图是有顺序的,sequence大的对象会覆盖sequence小的对象

绘图的地方,是最复杂的地方,因为rrdtool本身在绘图的时候参数就是最多的,也是最复杂的,把这些东西都封装到数据库中,那这些表结构也是十分复杂的。一般情况下,可以这么理解:
1、每个host_id的对象,可以对应多张图,但是也有可能有某些图并不对应任何host,例如汇总的图。但是每张图必然在graph_local中有定义,就是有一个local_graph_id
2、每张图片,在创建的时候肯定有很多参数,这些参数就是在graph_template_graph中定义的。如果采用了模板,那模板中定义过的参数,就不用再重复定义了。
3、每张图片,必然包含一个以上的对象,那就是graph_template_item了,item有很多类型,例如,流量图中,绿色区域代表的流出、蓝色实线代表的流出,就分别代表一个对象。还有些对象,例如下标的最大值,平均值等。这些对象,都是需要有数据源的,可能一个数据源,也可能需要多个,因为实际绘出来的值,是cdef把不同的数据源运算后得到的。这个数据源,就是ds,也就是data_template_rrd中的对象。


四、Cacti如何实现被动数据获取
了解到它的数据结构以后,我们就可以想办法来实现cacti数据的被动获取了,因为并不是所有场合,snmp都可以取到数据的,也许有时候我们要取的ip在另外一个局域网里,也许我们觉得cacti的负载太高,不能让它取太多的数据。
1、方式
方式很简单,在cacti中定义好hostdatagraph,然后只要我们能定时的把数据插入到它的rrd文件中就可以了。
2、方法
方法可以有两种:
第一种用脚本,cacti支持自写脚本取数据。最土的办法,就是定时的将数据推送到cacti的机器上,追加到一个文件里,然后cacti通过一个脚本读取这个文件来获取数据。
第二种就是直接插rrd文件,cacti正常的获取数据方式是用crontabpoller,或者spine,去定时取数据。我们在poller或者spine的过程中不需要让它去取数据,直接跳过,而定时的从外部把数据推送进来,然后插入rrd文件即可。
3、步骤
a、添加一个host(如果这个host无法访问到,那么可用性检查会失败,但是没关系)
b、添加数据源,需要insert以下几张表:data_localdata_template_datadata_template_data_rradata_template_rrd
c、创建rrd文件,打开datasource页面,应该已经可以看到我们添加的数据源了,打开那个数据源的debug模式,将rrdtool的命令拷贝到shell中执行一次即可(注意权限)
d、创建一个图片,需要insert以下几张表:graph_localgraph_template_graphgraph_template_item
e、定时的向rrd文件中插入数据(用你喜欢的方式,同时要注意rrd文件的权限)

运维网声明 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-142252-1-1.html 上篇帖子: Linux查看某一进程的占用CPU的Cacti脚本 下篇帖子: Windows下Cacti脚本及模板 -3
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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