新しい機能をリリースした際に、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プロトコルで取れるサーバを書いた https://blog.nomadscafe.jp/2013/02/-memcached.html
memcached上の任意の値を監視できるnagiosプラグイン書いた https://blog.nomadscafe.jp/2013/02/memcachednagios.html
技術評論社
売り上げランキング: 237,444