以前、Zabbix Serverを3系から5.0にアップグレードした記事をご紹介した際、ついでにエージェントもZabbix Agent2に入れ替えました。
MySQL(MariaDB)を入れているデータベースサーバのZabbixエージェントも同じように入れ替えたところ、正常に稼働しているにも関わらず、何故かずっと「MySQL is down」の障害が常に表示されるようになりました。
これをアップグレード前と同じように正常な監視ができるように解決しました!
解決できなかったパターン
よく目にする情報では、エージェント側の/etc/zabbix/zabbix_agent2.d/
配下にuserparameter_mysql.conf
というファイルを作成するといったもの。
書き方は違えど、大体こんな感じですね。
1 |
UserParameter=mysql.ping, mysqladmin --defaults-extra-file=/etc/zabbix/mysql/my.cnf ping | grep -c alive |
ここに出てくる「my.cnf」とは、DBの接続情報を記したファイルです。
内容はこのようなものです。
1 2 3 |
[client] user=[ユーザー名] password=[パスワード] |
ちなみに、公式のGitHubで公開しているuserparameterの内容ではこんな感じ。
1 |
UserParameter=mysql.ping[*], mysqladmin -h"$1" -P"$2" ping |
いずれもUserParameterでmysql.ping
キーを指定し、mysqladmin
コマンドでDBに対して疎通確認を行うもの。
しかし、上記のように設定してエージェントを再起動しても正常に起動せず、ログに以下のようなエラーが吐かれます。
1 |
ERROR: cannot initialize user parameters: cannot register user parameter "[userparameterの内容]": key already used |
これをGoogle翻訳で直訳すると、
1 |
エラー:ユーザーパラメータを初期化できません:ユーザーパラメータ "[userparameterの内容]"を登録できません:キーはすでに使用されています |
とのこと。
注目すべきは「キーはすでに使用されています」ってところです。
それでは本当にキーが設定されているか、Zabbix Serverの管理画面から、
- [設定]→[テンプレート]→[Template App MySQL]→[アイテム]→[MySQL status]
を見てみましょう。
確かに、キーの項目に「mysql.ping
」が存在しました。
これは想像ですが、Zabbix Serverの4系まではこのキーがなく別の方法で監視していて、5.0(またはZabbix Agent2)以降の場合は一旦アイテムを削除してuserparameterを追加するか、既存のアイテムを改造するかの2択だと思いました。
解決したパターン
ここからいよいよ本題です!
調べていくと、そもそも監視ができてない理由は、上記のmy.cnfのようなDBへの接続情報が無かったからだと思われます。
まずは、Zabbix公式サイトに掲載されている、こちらのページをご覧ください。
今回はZabbix Agent2を対象としていますので、[Available solutions]の[Template DB MySQL By Agent2]タブをクリックしてください。
それから下に進み、[Items collected]章にあるテーブルの1行目をご覧ください。
Name項目がアイテム名同じ、[MySQL: Status]となっています。
注目すべきは右側の[Key and additional info]の内容です。
[mysql.ping
]の後ろにデフォルトのアイテム設定にはないマクロが3つあると思います。
名前 | 説明 |
---|---|
{$MYSQL.DSN} | tcp://host:port や unix:/path/to/socket/などのシステムデータソース名 |
{$MYSQL.USER} | MySQLユーザー名 |
{$MYSQL.PASSWORD} | MySQLユーザーパスワード |
これは、同じページの[Zabbix configuration]章の[Macros used]の中に説明があります。
つまり、先程のアイテムのキーをこの内容に書き換え、監視対象のホスト(ここではDBサーバ)のマクロに、この3つを追加してあげればと考えました。
[MySQL status]アイテムのキーを更新
上記と同様にアイテム設定に進み、
- [設定]→[テンプレート]→[Template App MySQL]→[アイテム]→[MySQL status]
キーの項目を以下のように変更します。
1 |
mysql.ping["{$MYSQL.DSN}","{$MYSQL.USER}","{$MYSQL.PASSWORD}"] |
一応「テスト」してみて、監視できることを確認できれば「更新」ボタンを押して登録完了です。
ホストのマクロに値を登録
次に、上記のキーに設定した3つのマクロに、それぞれ値を登録してあげます。
対象ホストのマクロの設定画面に進み、
- [設定]→[ホスト]→[監視対象ホスト]→[マクロ]
「追加」をクリックして、マクロと値、説明(任意)を3つ登録します。
マクロ | 値 | 説明 |
---|---|---|
{$MYSQL.DSN} | [192.168.XXX.XXXやlocalhostなど] | データソース名 |
{$MYSQL.USER} | zabbixagent | MySQLユーザー名 |
{$MYSQL.PASSWORD} | ******** | MySQLユーザーパスワード |
以上を入力して「更新」ボタンを押下したら設定完了です。
これで、正常にMySQLの監視ができたと思います。
余談
ちなみに、[Template App MySQL]テンプレートにもマクロを登録すると、ホストのマクロの「継承したマクロとホストマクロ」にテンプレートから継承されたマクロが表示されます。
しかし、テンプレートのマクロに登録した値は、ホストのマクロでは変更することができません。
もし、同じテンプレートを使用して複数のDBサーバ(MySQL)を監視する場合に困りますので、ここはホストのマクロに登録した方が無難だと思いましたとさ。
コメント