新しい機能をリリースした際に、MySQLに対して効率的ではないクエリが発行されてしまって、それが積もってサービス全体に影響が出てしまう前に発見してアラートをあげたい。

発見する手立てとしてはCPU使用率やInnoDBのROW OPERATIONSが考えられるところですが、今回はスロークエリが発生した回数を監視することにした。ちなみにいつものことながら対象とするMySQLは4.0系。long_query_timeがオンラインで変更できません。。。はい

MySQLのスロークエリが発生した回数は、show status のSlow_queriesという項目でみることができて

mysql> show  status like 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 7238  |
+---------------+-------+
1 row in set (0.00 sec)

のように起動してから今までの long_query_time を超えた回数が表示できます。今回やりたい監視は、この数字を一定時間毎に取得して、その増加分の秒間の平均が閾値を超えていたらアラートをあげるというもの。

Nagiosでこのようなカウンター系の数字を監視をするには、プラグインの中で取得したデータを別の場所に保存し、前回のデータと比べて差分を出す必要があります。既成のNagiosプラグインで差分が取れるのは、Percona Monitoring Pluginsに含まれる pmp-check-mysql-status などがあります。

Nagios以外だとzabbixやcactiなどのメトリクス収集ツールでアラートを上げられるのでしょうか。

今回は、もう少し汎用的に使える derived というサーバに入れるデーモンと、memcachedの任意のキーをチェックできる check_memcached_val.pl という Nagios プラグインを書いて監視をしてみました。

derived

derivedは指定したコマンドを定期的に実行して、その結果の差分をmemcachedプロトコルで取得できるようにするデーモンプログラムです

CPAN: https://metacpan.org/release/App-derived
github: https://github.com/kazeburo/App-derived

インストールは cpanm で

$ cpanm -n App::derived

次にコマンドを記したファイルを用意

slowqueries: mysql -NB -e 'show /*!50002 global */ status like "Slow_queries"'

「memcahcedのキー:コマンド」というフォーマットで書けます。複数指定する事もできます

起動

$ derived --port 12306 -i 10 /path/to/cmdfile

-i がコマンドを実行する間隔。ここでは10秒間隔にしています。プロセスはdaemontoolsやsupervisord、upstartなどで管理するといいでしょう

telnet で確認

$ telnet localhost 12306
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get slowqueries
VALUE slowqueirs 0 1
0
END
quit

現在のslow_queriesは「0」のようですね。なお起動直後は「0E0」という特別な値が返るようになっています

check_memcached_val.pl

check_memcached_val.pl はmemcachedサーバから指定したキーのキャッシュを取得してチェックできる Nagiosプラグインです。perlで書いてます

github: https://github.com/kazeburo/checkmemcachedval

perl-5.8系が入っていればインストールはコピーだけで動くはずです

$ curl https://raw.github.com/kazeburo/check_memcached_val/master/check_memcached_val.pl > check_memcached_val.pl
$ chmod +x check_memcached_val.pl
$ cp check_memcached_val.pl /path/to/nagios/libexec

基本的な使い方は

$ ./check_memcached_val.pl -H ホスト -P ポート -k キャッシュのキー -w warningの閾値 -c criticalの閾値

です。今回はderivedが起動しているTCPポートから、slowqueriesというキャッシュを取得するので、Nagiosの監視コマンドの設定は

define command{
    command_name    check_slowqueries
    command_line    $USER1$/check_memcached_val.pl -H $HOSTADDRESS$ -P 12306 -k slowqueries -w 0.2 -c 0.4
}

のように定義しました。とりあえず1秒間に0.2回でwarning、0.4回でcriticalを閾値にしました。

あとは、サーバ毎のサービス設定を追加すれば設定完了です。これでNagiosでSlow_queriesの監視ができるようになりました。他に監視したい項目が増えても、同じ要領でderivedのコマンドファイルにコマンドを追加して、check_memcached_val.plで監視すれば新規にスクリプトを書かなくてもいいので、楽ですね。

まとめ

derivedというデーモンとmemcachedの指定した値をチェックするNagiosプラグインでMySQLのSlow Queriesの監視ができました。これで偶発的に問題のあるアプリケーションが出てしまっても早期に発見ができ、積極的な開発と安定したサービス運用の両立させていくことができるでしょう。

2つのプログラムの詳細は個別に記事を書いています

数字を出力するコマンドを定期的に実行して、秒間の変化量を memcachedプロトコルで取れるサーバを書いた http://blog.nomadscafe.jp/2013/02/-memcached.html

memcached上の任意の値を監視できるnagiosプラグイン書いた http://blog.nomadscafe.jp/2013/02/memcachednagios.html

Nagios統合監視[実践]リファレンス (Software Design plus)
株式会社エクストランス 佐藤 省吾 Team-Nagios
技術評論社
売り上げランキング: 237,444

このブログ記事について

このページは、Masahiro Naganoが2013年2月14日 16:42に書いたブログ記事です。

ひとつ前のブログ記事は「memcached上の任意の値を監視できるnagiosプラグイン書いた」です。

次のブログ記事は「derivedがプラグインアーキテクチャになってGrowthForecastに直接POSTできるようになったので、Javaのヒープのモニタリングをしてみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja