Zabbix」タグアーカイブ

ZabbixでRDBにMariaDB 10.2 10.3 10.4 を使う場合の注意点

2019年11月時点でのZabbixのLTS(長期サポート版)は 4.0 系が最新バージョンとなっていますが、Zabbix 4.0 (や 4.2)をMySQLではなくMariaDB 10.2 ~ 10.4で導入する場合には現状注意点(というか不具合)に近いものが有るので要注意です。

詳細は以下のURLをご確認ください
https://support.zabbix.com/browse/ZBX-16757
https://support.zabbix.com/browse/ZBX-16465
https://support.zabbix.com/browse/ZBX-16465

もともとMariaDB 10.1等を使っている環境から移行した場合に特に問題なく動いているように見えても、DBのフルダンプを使って復元しようと思った際に踏んでDBのインポートに失敗したりします(しました)。

この問題が修正されているのはZabbix 4.4 以降になるため、4.0 LTSを使う場合はMySQLなど他のRDBMSを使った方が無難です(MariaDB 10.1 は2020年中にサポートが終了します)。

Zabbixのバージョン間互換性について再確認する

この記事は Zabbix Advent Calender 2018 の12月15日分の記事です。今回はZabbix監視で利用する zabbix-agent、zabbix-server、zabbix-proxy の互換性について再度確認してみたいと思います。

互換性について参照する物

基本的にはまさに互換性に関する記載のあるページが公式のドキュメントに有ります。4.0の場合は以下。メニューのツリー的には Appendixes の中に有ります。

13 Version compatibility [Zabbix Documentation 4.0]
https://www.zabbix.com/documentation/4.0/manual/appendix/compatibility

ですが、互換性についてのページはあくまで疎通が取れるかについての言及になっているので、実際の細かいバージョン間差異については、新機能アップグレードノートアップグレード手順既知の問題ページなどバージョン間差異に言及しているページはいくつか読んでおくとより安心感が増すかと思います。エージェント監視アイテムはアイテム項目のページも読んでおきましょう。そこを読むことで気づく注意点がいくつか有ります。例えば同じアイテム(特にCPUやメモリ周りなど)で数値の取れ方に変更が有ったりと言った事が有ります。

互換性についてまとめる

2018年12月15日 Zabbix 4.0.2 現在においての状況をまとめてみます。

zabbix-server – zabbix-agent間の互換性

agent側が古い分についてはserverとの疎通を取る事が来ます。バージョン1.4以降のzabbix-agentであればzabbxi-server 4.0から監視可能です(もちろんバグ修正やパフォーマンス改善などの点からエージェント側もなるべく新しい方がいいです)。ただし古いエージェントほど対応しているアイテムの数が少ない、同じアイテムでも使えるオプションの数が少ない、値が取れても過去のバージョンでは算出方法が違う、と言った事が有りますので、それぞれアイテム項目の確認は行っておいた方がいいでしょう。

また、server – agent 間での通信を暗号化できるようになったのは 3.0 LTS からなので、必ず暗号化しておきたいという場合は 3.0 LTS までバージョンを上げた方がいいでしょう。

ちなみに zabbix-agent 1.4 以降という制限は、Zabbix 3.0 LTS や Zabbix 3.4 のドキュメントには記載が有りませんでした。あまりにも古い環境なので気にする方は少ないかと思いますが、これは4.0で新しく加えられた制限なのかと思われます。

Zabbix 4.0該当記載
https://www.zabbix.com/documentation/4.0/manual/appendix/compatibility
Zabbix 3.4 該当記載
https://www.zabbix.com/documentation/3.4/manual/appendix/compatibility
Zabbix 3.0 該当記載
https://www.zabbix.com/documentation/3.0/manual/appendix/compatibility

なお、逆にagentの方が新しい場合についての言及が見当たらないですが、実際の所 zabbix-server よりzabbix-agent が新しい場合については疎通が取れません。これはzabbix-server 4.0.2 と zabbix-agent 3.4.15 の環境で試してみて実際にダメでした。zabbix-get コマンド(4.0系)からの値の取得も動作しませんでした。

zabbix-server – zabbix-proxy間の互換性

zabbix-serverとzabbix-proxyは同じメジャーバージョンでなければ動作しません。例えばzabbix-proxyが多数動作する環境であってもzabbix-serverのバージョンを上げる際は一緒に対応する必要が有ります。

公式のドキュメントでも言及が有るようにzabbix-proxy側のバージョンが古い分には一応監視が継続出来る場合が有ります。ただしこれはZabbix的にはサポートしていない仕様外の動作となります。あくまで既に設定済みの監視設定のまま値が取れるだけであり、監視設定の変更が出来ません。

https://www.zabbix.com/documentation/4.0/manual/appendix/compatibility

proxyが有る状況での具体的なアップグレード手順は公式から提供されているのでそれに従った方がベターです。以下はRed Hat Enterprise Linux / CentOSでアップグレードする場合です。

1 Red Hat Enterprise Linux/CentOS [Zabbix Documentation 4.0]
https://www.zabbix.com/documentation/4.0/manual/installation/upgrade/packages/rhel_centos

なお、これは仕様と言うよりバグなのですが、zabbix-server 3.4.10 と zabbix-proxy 3.4.10 ではそのバージョン同士でしか通信が取れません。これは Zabbix 3.4のページにだけ記載が有ります。

https://www.zabbix.com/documentation/3.4/manual/appendix/compatibility

まとめ

内容としては既にまとめていますが、以上になります。今回は言及していませんがバージョンごとに求めるミドルウェアやライブラリのバージョンも異なるのでアップグレードを行う際はその点にも注意しましょう。いずれについてもZabbix公式のドキュメントは細かい所まで手が行き届いているのでGoogle 翻訳使ってでもいいからなるべく公式の資料は読みましょう!

Zabbix公式
https://www.zabbix.com/jp/
Zabbix Manual [Zabbix Documentation 4.0]
https://www.zabbix.com/documentation/4.0/manual

Zabbix Advent Calendar 2018 – Qiita
https://qiita.com/advent-calendar/2018/zabbix

私のほかのZabbix関連投稿
https://www.sodo-shed.com/archives/tag/zabbix

Zabbix 3.4が本当にphp-mysqlに依存していない事を確認してみた

CentOS上においてはphp-mysqlに依存してしまうzabbix-web-mysqlですが、実際の所は利用していないので何らかの方法で無視をする(※1)事で導入が出来ます。ただ、本当に依存していないのだろうか、という事を念のため確認してみました。

Zabbix WebフロントエンドはPHPで書かれているOSS(※2)なので、既に導入済みの環境であれば適当なエディタで開いて中身を確認する事が出来ます。公式サイトからソースをDLする事も出来ます。

まずはどこでDB関連の判断をしているのか。ファイル名の雰囲気から以下で設定ファイルを読み込んでいるものと思わます。

/usr/share/zabbix/include/classes/core/CConfigFile.php

         if (!isset($DB['TYPE'])) {
             self::exception('DB type is not set.');
         }

         if (!array_key_exists($DB['TYPE'], self::$supported_db_types)) {
             self::exception(
                 'Incorrect value "'.$DB['TYPE'].'" for DB type. Possible values '.
                 implode(', ', array_keys(self::$supported_db_types)).'.'
             );
         }

         $php_supported_db = array_keys(CFrontendSetup::getSupportedDatabases());

         if (!in_array($DB['TYPE'], $php_supported_db)) {
             self::exception('DB type "'.$DB['TYPE'].'" is not supported by current setup.'.
                 ($php_supported_db ? ' Possible values '.implode(', ', $php_supported_db).'.' : '')
             );
         }

設定ファイルで定義したDBのTYPEがCFrontendSetup::getSupportedDatabases()に含まれているかをチェックしていますね。ではそのCFrontendSetup::getSupportedDatabases()を確認します。

/usr/share/zabbix/include/classes/setup/CFrontendSetup.php

     /**
      * Get list of supported databases.
      *
      * @return array
      */
     public static function getSupportedDatabases() {
         $allowed_db = [];

         if (zbx_is_callable(['mysqli_close', 'mysqli_connect', 'mysqli_connect_error', 'mysqli_error',
                 'mysqli_fetch_assoc', 'mysqli_free_result', 'mysqli_query', 'mysqli_real_escape_string'])) {
             $allowed_db[ZBX_DB_MYSQL] = 'MySQL';
         }

         if (zbx_is_callable(['pg_close', 'pg_connect', 'pg_escape_bytea', 'pg_escape_string', 'pg_fetch_assoc',
                 'pg_free_result', 'pg_last_error', 'pg_parameter_status', 'pg_query', 'pg_unescape_bytea'])) {
             $allowed_db[ZBX_DB_POSTGRESQL] = 'PostgreSQL';
         }

         if (zbx_is_callable(['oci_bind_by_name', 'oci_close', 'oci_commit', 'oci_connect', 'oci_error', 'oci_execute',
                 'oci_fetch_assoc', 'oci_field_type', 'oci_free_statement', 'oci_new_descriptor', 'oci_parse',
                 'oci_rollback'])) {
             $allowed_db[ZBX_DB_ORACLE] = 'Oracle';
         }

         if (zbx_is_callable(['db2_autocommit', 'db2_bind_param', 'db2_close', 'db2_commit', 'db2_conn_errormsg',
                 'db2_connect', 'db2_escape_string', 'db2_execute', 'db2_fetch_assoc', 'db2_free_result', 'db2_prepare',
                 'db2_rollback', 'db2_set_option', 'db2_stmt_errormsg'])) {
            $allowed_db[ZBX_DB_DB2] = 'IBM DB2';
         }

         return $allowed_db;
     }

/usr/share/zabbix/include/func.inc.php

function zbx_is_callable(array $names) {
	foreach ($names as $name) {
		if (!is_callable($name)) {
			return false;
		}
	}

	return true;
}

mysqli_*コマンドが存在するかで確認しています。この事からZabbix 3.4ではMySQL = mysqli_* の利用となっており、旧来のmysql_*は利用していない事が分かります。ちなみにPDOは利用してないようです。

以下はもっとシンプルに接続関数 mysqli_connect と mysql_connect をgrepで探してみた結果です。

# find /usr/share/zabbix/ -type f -print | xargs grep mysql_co
→結果無し

# find /usr/share/zabbix/ -type f -print | xargs grep mysqli_co
/usr/share/zabbix/include/classes/setup/CFrontendSetup.php:             if (zbx_is_callable(['mysqli_close', 'mysqli_connect', 'mysqli_connect_error', 'mysqli_error',
/usr/share/zabbix/include/db.inc.php:                           $DB['DB'] = @mysqli_connect($DB['SERVER'], $DB['USER'], $DB['PASSWORD'], $DB['DATABASE'], $DB['PORT']);
/usr/share/zabbix/include/db.inc.php:                                   $error = 'Error connecting to database: '.trim(mysqli_connect_error());

mysql_connectの呼び出しが物理的に存在しない事が分かります。心置きなくphp-mysqlを葬り去れますね。

※1: 既に運用中のCentOS 7.x上のZabbix(Webフロントエンド)のPHPを5系から7系に入れ替える

※2:

/*
** Zabbix
** Copyright (C) 2001-2018 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
**/