【わたしに♥おまかせ 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に関するお問い合わせはこちらからお願いいたします。