Zabbix数据库表结构解析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1章Zabbix数据库表结构解析由于Zabbix前端效率极低,大批量更新会造成oracletx锁,所以对于这种大批量的更新,一般都用数据库语句直接update。想过通过patchphp代码的方法来解决这个问题(Zabbix本身的类似问题就是这样解决的),但是php一个是不会,一个是太长。而且,数据update快。这样就需要对Zabbix数据库的数据结构有清晰的了解。另一方面,Zabbix收集了大量的裸数据,其他人可以通过这些数据来进行分析,同样,也需要了解数据库的结构。在使用过程中,我们也是摸石头过河,一边摸索一边使用。这里会对Zabbix数据库的表结构和常用的操作做一些说明。注意:Zabbix数据库中的表的名称都是复数,比如存放Host信息的表的名字是Hosts等。数据库操作有风险,一旦出问题会造成Zabbixcrash。需要谨慎操作。普通的查询可以在备库上进行。两边数据是实时同步的。1.1表结构概述Zabbix的数据库设计是很有特点的,针对Zabbix中的每一个资源,都有一张表与其对应,比如hosts表,items表等。而这每一张表中,都有一个id字段,比如hosts表中有hostid列,items表中有itemid列。而资源之间的关联关系,是通过外键来完成的。比如host和item的关联关系,就是在items表中使用hostid与hosts表中的资源进行关联的。下面就以hostid来举例说明,其他itemid,trigger等都类似。hostid是每一个host的唯一标识,我们从数据库查询的时候,一般都是以hostid为查询条件。我们点开一个host,然后看URL:=update&hostid=10108&groupid=0&sid=27716d11b8954723我们可以看到URL里的GET参数有这几个:1.form:表示当前页面的操作,这里的update是因为我是从Configuration-Hosts中点击host进入的,所以是一个更新的操作2.hostid:点击的host的hostid3.groupid:这里不需要groupid这个字段,所以这个0没有意义4.sid:sessionid,标识用户用的这里顺便说一句,Zabbix的前端界面的URL,会有很多像上面的URL那样。有的是itemid,有的是triggerid,我们更改一下这个id,就自然能够跳转到对应的界面上去了。这一点正是Zabbix的灵活之处,再我们进行二次开发的时候,非常有用。有的朋友要说了,我只要用好Zabbix就行了,不想去了解Zabbix的数据库表结构,觉得没必要也没用。其实非也,从Zabbix数据库的表结构,我们可以知道Zabbix资源的数据结构。另外,活用SQL查询Zabbix数据库,能够提升我们的效率,举个例子,我们想看某个机房的网卡出口流量之和,怎么办呢?我们可以很复杂的定义一个aggregate类型的item,然后在前端点来点去。但是如果我们用SQL,就一条SQL就可以非常简单的解决问题。另一方面,Zabbix的水平高低,或者说是否真正了解Zabbix的一个非常大的标志,就是是否了解Zabbix的数据库。大家可能看这一节很吃力,但没关系,如果是刚接触Zabbix不久,这也是正常的,可以先看一遍留个印象,等之后对Zabbix有了些了解以后再来仔细看看。1.2Hosts表“Host”就是指一台被监控的机器。我们先看Hosts表结构,如下:mysqldeschosts;+--------------------+---------------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+--------------------+---------------------+------+-----+---------+-------+|hostid|bigint(20)unsigned|NO|PRI|NULL|||proxy_hostid|bigint(20)unsigned|YES|MUL|NULL|||host|varchar(64)|NO|MUL||||status|int(11)|NO|MUL|0|||disable_until|int(11)|NO||0|||error|varchar(128)|NO|||||available|int(11)|NO||0|||errors_from|int(11)|NO||0|||lastaccess|int(11)|NO||0|||ipmi_authtype|int(11)|NO||0|||ipmi_privilege|int(11)|NO||2|||ipmi_username|varchar(16)|NO|||||ipmi_password|varchar(20)|NO|||||ipmi_disable_until|int(11)|NO||0|||ipmi_available|int(11)|NO||0|||snmp_disable_until|int(11)|NO||0|||snmp_available|int(11)|NO||0|||maintenanceid|bigint(20)unsigned|YES|MUL|NULL|||maintenance_status|int(11)|NO||0|||maintenance_type|int(11)|NO||0|||maintenance_from|int(11)|NO||0|||ipmi_errors_from|int(11)|NO||0|||snmp_errors_from|int(11)|NO||0|||ipmi_error|varchar(128)|NO|||||snmp_error|varchar(128)|NO|||||jmx_disable_until|int(11)|NO||0|||jmx_available|int(11)|NO||0|||jmx_errors_from|int(11)|NO||0|||jmx_error|varchar(128)|NO|||||name|varchar(64)|NO|MUL|||批注[d1]:改下结构|flags|int(11)|NO||0|||templateid|bigint(20)unsigned|YES|MUL|NULL||+--------------------+---------------------+------+-----+---------+-------+hostid:唯一标识Host在Zabbix及数据库的id。不同表之间的关联也是用的id。和这个类似,Zabbix中任意一种资源都有自己的id,比如itemid,groupid等。proxy_hostid:如果使用了‘Proxy-Server’架构,这个字段表示的是监控这台机器的Proxy的hostid。有一点需要注意,每个Proxy在Hosts表里有两条记录(其他Host只有一条记录),一条是和普通机器一样的、作为被监控机器的记录;另一条记录是作为Proxy的。作为Proxy的那条记录,ip字段的值为“0.0.0.0”。proxy_hostid中的值就是Proxy记录中的hostid。举个例子,我有一台Proxy的ip为1.2.3.4,那么在Hosts表里有两条记录,一个是ip为“1.2.3.4”的记录,hostid为“1”;另一个是ip为“0.0.0.0”的记录,hostid为“2”。在这个背景下,有一台机器,他的proxy是之前提到的那台机器,那么他在Hosts表中的proxy_hostid的值为“2”。host:机器的hostname。注意,在1.8.8(即我们使用的)版本的Zabbix中,如果有两台hostname一样的机器,那么Zabbix会crash直接退出。之后在1.8.10(记不清了)取消了这个功能。其实我也觉得这功能挺脑残的。dns:DNS名称。useip:是否用ip监控。port:监控使用的端口。status:机器目前的状态。“0”为正常监控,“1”为disable。“2”不清楚,从数据库里找不到status为“2”的机器。google了下,这个好像是Zabbix自身的一个hostavailable检查有关。“3”表示是个Template。(是不是很奇怪为啥Template也在Hosts表中?其实Template就是个Host。详细的以后再说)disable_util,error,available,errors_from(ipmi_disable_util,ipmi_error…和snmp_disable_until…都是此类):这几个都是ZabbixPoller会去修改的值。我看了下poller.c的代码,当poller在第一次取不到值(根据值的类型不同会更新相应的列,Item类型为snmp就会更新snmp_XXX,默认为“zabbix”类型)的时候,会等15秒(CONFIG_UNREACHABLE_DELAY)来重试,并且日志会显示“firstnetworkerror”,如果15秒后依然取不到值,zabbix会在数据库更新这个host取不到值的信息,即这几列。并且日志里显示“anothernetworkerror”。lastaccess:这一列是专门为proxy准备的(如上文ip为“0.0.0.0”)。lastaccess表示的是proxy最后一次工作的时间。这里的“工作”指ZabbixServer收到Proxy数据。inbytes,outbytes:不知道有什么用,1.8.8的代码中也没有找到使用这两个字段的代码。我估计是Zabbix以后会使用的。useipmi,ipmi_*(除8.中提到的):使用IPMI时后的参数。不展开说。snmp_*(除8.中提到的):同上,SNMP参数。maintenanceid,maintenance_*:这是Zabbix另一个机制Maintaince有关,用于使Host置于维护状态而不会报警。常用操作前面只讲了Hosts一张表,所以这里只能介绍一些针对Host的操作。更新机器的proxy。找到proxy的hostid,更新对用host的proxy_hostid:selecthostidfromhostswherehost='ProxyA'andip='0.0.0.0';--gethostid:1234updatehostssetproxy_hostid=1234wherehost='Host_To_Update_Proxy';enable/disablehost:updatehostssetstatus='0'wherehost='Host_To_Enable';updatehostssetstatus='1'wherehost='Host_To_Disable';1.3Items表Items表也是Zabbix的核心表之一,它记录了Item的所有设置。我们知道,在Zabbix中,我们做多的操作就是对于items的了,添加监控项,删除监控项,更新监控项配置等等。这一节中,我们一起看下Item在数据库存储的表——items表。首先我们看一下表结构:+-----------------------+---------------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------------------+---------------------+------+-----+---------+-------+|itemid|bigint(20)unsigned|NO|PRI|NULL|||type|int(11)|

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功