Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181497
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 177
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-26 14:21
个人简介

活在当下

文章分类

全部博文(24)

文章存档

2016年(1)

2014年(7)

2013年(16)

分类: LINUX

2013-09-17 18:00:28

CACTI表结构和数据被动获取

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:在页面上看就是Downed Device Detection,我理解就是,如何看这台设备是否挂了

ping_methodudp ping还是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个选项,分别是:snmpsnmp queryscript/commandscript queryscript – script serverscript query – 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中的data source页面看到的东东。不过这张表只是简单的定义一个对象和对应关系,对象的具体属性在另外的表中。

iddataid

data_template_id:采用了哪个数据模板,在data_templates模板中定义

host_id:是哪个设备的数据,在host中定义

snmp_query_id:如果是通过snmp_query方式获取的,那对应的snmp_queryid,如果不是,则为0

snmp_indexsnmp_query方式获取数据时,获取数组的前缀。例如,流量获取中,端口的index

5data_template

数据模板,我们在consoledata templates中看到的东东。

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直接getsnmp query,就是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文件,打开data source页面,应该已经可以看到我们添加的数据源了,打开那个数据源的debug模式,将rrdtool的命令拷贝到shell中执行一次即可(注意权限)

d、创建一个图片,需要insert以下几张表:graph_localgraph_template_graphgraph_template_item

e、定时的向rrd文件中插入数据(用你喜欢的方式,同时要注意rrd文件的权限)

阅读(2328) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~