【わたしに♥おまかせ Zabbix④】Zabbixのデータベースについて

Zabbix, まるごとおまかせZabbix, わたしにおまかせZabbix, 製品紹介

こんにちは!プラットフォーム技術部の齊藤(沙)です。

前回はZabbixサーバーの内部プロセスについて確認しましたね。今回はZabbixが監視設定や履歴データを保管するデータベースについて確認していきます。

前回の記事はこちら。

まとめ記事作りました♥

Zabbixを知ろう – Zabbixのデータベースについて

私たちアークシステムでは、パフォーマンスの観点からZabbixにおけるデータベースはMariaDB(Mysql)の使用を推奨しています。本記事では、Zabbix3.0、mariadb5.5の環境を用いて確認していきます。

ホストに関する情報について

主要テーブル一覧

監視対象であるホストに関する情報は、主に以下のテーブルに格納されています。

 hosts				#ホストに関する主要な情報を格納するテーブル
 hosts_groups		#ホストグループに関する情報を格納するテーブル
 host_inventory		#ホストインベントリに関する情報を格納するテーブル
 hostmacro			#ホストマクロに関する情報を格納するテーブル
 interface			#ホストのインターフェースに関する情報を格納するテーブル

hostsテーブル詳細

まずはホストに関する主要な情報が格納されている「hosts」テーブルについて詳しく確認していきます。以下は「desc hosts;」コマンドの出力結果です。

+--------------------+---------------------+------+-----+---------+-------+
| Field              | Type                | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------+-------+
| hostid             | bigint(20) unsigned | NO   | PRI | NULL    |       |
| proxy_hostid       | bigint(20) unsigned | YES  | MUL | NULL    |       |
| host               | varchar(128)        | NO   | MUL |         |       |
| status             | int(11)             | NO   | MUL | 0       |       |
| disable_until      | int(11)             | NO   |     | 0       |       |
| error              | varchar(2048)       | 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(2048)       | NO   |     |         |       |
| snmp_error         | varchar(2048)       | NO   |     |         |       |
| jmx_disable_until  | int(11)             | NO   |     | 0       |       |
| jmx_available      | int(11)             | NO   |     | 0       |       |
| jmx_errors_from    | int(11)             | NO   |     | 0       |       |
| jmx_error          | varchar(2048)       | NO   |     |         |       |
| name               | varchar(128)        | NO   | MUL |         |       |
| flags              | int(11)             | NO   |     | 0       |       |
| templateid         | bigint(20) unsigned | YES  | MUL | NULL    |       |
| description        | text                | NO   |     | NULL    |       |
| tls_connect        | int(11)             | NO   |     | 1       |       |
| tls_accept         | int(11)             | NO   |     | 1       |       |
| tls_issuer         | varchar(1024)       | NO   |     |         |       |
| tls_subject        | varchar(1024)       | NO   |     |         |       |
| tls_psk_identity   | varchar(128)        | NO   |     |         |       |
| tls_psk            | varchar(512)        | NO   |     |         |       |
+--------------------+---------------------+------+-----+---------+-------+

Interfaceテーブル詳細

そして、以下は「desc interface;」コマンドの出力結果です。

+-------------+---------------------+------+-----+-----------+-------+
| Field       | Type                | Null | Key | Default   | Extra |
+-------------+---------------------+------+-----+-----------+-------+
| interfaceid | bigint(20) unsigned | NO   | PRI | NULL      |       |
| hostid      | bigint(20) unsigned | NO   | MUL | NULL      |       |
| main        | int(11)             | NO   |     | 0         |       |
| type        | int(11)             | NO   |     | 0         |       |
| useip       | int(11)             | NO   |     | 1         |       |
| ip          | varchar(64)         | NO   | MUL | 127.0.0.1 |       |
| dns         | varchar(64)         | NO   |     |           |       |
| port        | varchar(64)         | NO   |     | 10050     |       |
| bulk        | int(11)             | NO   |     | 1         |       |
+-------------+---------------------+------+-----+-----------+-------+

どちらのテーブルにも「hostid」というカラムが存在しますね。このカラムを利用してホストに関する情報が格納されているそれぞれのテーブルに対してリレーションを張っているようです。

実際に「hosts」テーブルの「hostid」を利用して「Zabbix server」ホストに紐付くインターフェースのIPアドレスを取得してみたいと思います。

SQL文 (‘hosts’ – ‘interface’)

以下は実行するSQL文です。

「hosts」テーブルにおける「status」カラム内の値が「3」となっているデータはテンプレートを表すため、where句の1つめの条件で検索対象から除外しています。

select 
 h.host,
 h.name,
 i.ip
from
 hosts h
 left outer join interface i
  on h.hostid=i.hostid
where
 h.status<>3
and
 h.host='Zabbix server';

実行結果 (‘hosts’ – ‘interface’)

以下が実行結果です。

+---------------+---------------+-------------+
| host          | name          | ip          |
+---------------+---------------+-------------+
| Zabbix server | Zabbix server | 127.0.0.1   |
| Zabbix server | Zabbix server | 192.168.0.1 |
| Zabbix server | Zabbix server | 192.168.0.3 |
+---------------+---------------+-------------+

「Zabbix server」ホストに紐付くインターフェースのIpアドレスを取得することが出来ました!

想像よりも簡単に取得できたので、次はホストとホストグループの紐付けについてもSQLで確認してみたいと思います。

ホストとホストグループの紐付け

hosts_groupsテーブル詳細

まずは「hosts_groups」テーブルの詳細を確認します。以下は「desc hosts_groups;」コマンドの出力結果です。

+-------------+---------------------+------+-----+---------+-------+
| Field       | Type                | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+-------+
| hostgroupid | bigint(20) unsigned | NO   | PRI | NULL    |       |
| hostid      | bigint(20) unsigned | NO   | MUL | NULL    |       |
| groupid     | bigint(20) unsigned | NO   | MUL | NULL    |       |
+-------------+---------------------+------+-----+---------+-------+

あれ?ホストグループ名が無い。。。
どうやらホストグループの詳細な情報は別のテーブルで保持しているようです。

「groupid」カラムを持つテーブルを捜索した結果、「groups」というテーブルの中でホストグループに関する情報が保持されているのを発見しました。

groupsテーブル詳細

以下は「desc groups;」コマンドの出力結果です。

+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| groupid  | bigint(20) unsigned | NO   | PRI | NULL    |       |
| name     | varchar(64)         | NO   | MUL |         |       |
| internal | int(11)             | NO   |     | 0       |       |
| flags    | int(11)             | NO   |     | 0       |       |
+----------+---------------------+------+-----+---------+-------+

「hostid」カラムと「groupid」カラムを利用すれば、ホストに紐付くホストグループ名を取得できそうです。

SQL文 (‘hosts’ – ‘hosts_groups’ – ‘groups’)

早速、「Zabbix server」ホストに紐付くホストグループ名を取得してみたいと思います。以下は実行するSQL文です。

select
 h.host,
 g.name 
from 
 hosts h
 left outer join hosts_groups hg
  on h.hostid=hg.hostid
 left outer join groups g
  on hg.groupid=g.groupid
where
 h.status<>3
and
 h.host='Zabbix server';

実行結果 (‘hosts’ – ‘hosts_groups’ – ‘groups’)

以下が実行結果です。

+---------------+----------------+
| host          | name           |
+---------------+----------------+
| Zabbix server | Zabbix servers |
| Zabbix server | monitor        |
| Zabbix server | arksystems     |
+---------------+----------------+

「Zabbix server」ホストに紐付くホストグループ名を取得することが出来ました!嬉しい。

まとめ

今回はホストに関する情報が格納されているテーブルと、そのリレーションについて確認しました。

難しそうと敬遠していましたが、実際に確認してみると非常に簡単に情報を取得することが出来ました。Zabbixのデータベースの構造を理解するためには

  • idカラムでテーブル間のリレーションを追う

ことが大切ですね!

もっとZabbixのデータベースのことを知るために、次回はデータベースの中のアイテムに関する情報について確認していきたいと思います。

次回の記事はこちら。

アークシステムでは、Zabbixの環境構築や保守サポートを低価格・短納期で実現する「まるごとおまかせZabbix」を提供しています。 本サービスの詳細や、Zabbixを活用したソリューションにご興味をお持ちの方がいらっしゃいましたら サービス紹介ページ からお気軽にお問合わせ下さい。

  • 株式会社アークシステムの来訪管理・会議室予約システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix