安定したWebサービスを提供するためには欠かすことができないのが監視です。監視を行うことで障害をいち早く検知し,対応を行うことでダウンタイムを最小限にできます。また負荷の掛かり具合やサーバリソースの消費度合いを明らかにすることでいつ,どのタイミングでサーバやインフラを増強するか,またアプリケーションの改善を行うのかを判断できます。Webサービスの稼働やリソースの「見える化」を実現することで,個人の経験や勘,また根性だけに頼らない運用が可能となり,より的確なタイミングでのシステムの改善,増強を行えます。
稼働監視とリソースモニタリング
Webサービスのシステムの監視には大きく分けて2種類の監視があります。1つ目は稼働監視,2つ目はリソースのモニタリングです。稼働監視では監視を行ったタイミングで対象システムに例外があれば,メールを送信するなどのアラートを発生させます。稼働監視に於ける例外とは,対象サーバからのping応答が得られなかったり,指定したポートに対して接続ができない,また一定の時間以内でのレスポンスが帰ってこない場合などが挙げられます。加えてサーバのリソース(CPU使用率やDISK使用量)が設定した閾値を超えている場合も含まれます。
稼働監視は監視を行った瞬間の「見える化」を行いますが,リソースモニタリングは継続的にシステムのリソースに関するデータを取得し,グラフなどの形で変化を可視化します。リソースモニタリングの対象としては,CPU使用率やメモリ使用量,Webサーバのリクエスト処理回数,データベースのトランザクション数などがあげれます。
memcachedの監視も稼働監視とリソースモニタリングの両面から行う必要があります。
memcachedの稼働監視
memcachedの稼働監視としてNagiosを利用した監視を紹介します。Nagiosはオープンソースの稼働監視ソフトウェアとして最も有名なソフトウェアで,国内でもミクシィをはじめ豊富な利用実績があります。Nagiosのインストールや基本的な設定については,筆者が以前に執筆させて頂いた『WEB+DB PRESS Vol.55』の連載「大規模Webサービスの裏側」や書籍『サーバ/インフラを支える技術』を参考にしてください。
- 『WEB+DB PRESS Vol.55』
- http://gihyo.jp/magazine/wdpress/archive/2010/vol55
- 『サーバ/インフラを支える技術』
- http://gihyo.jp/book/2008/978-4-7741-3566-3
接続と動作の監視
memcachedの稼働監視として真っ先にあげられるのが,memcachedが起動しているかどうかの死活監視ではないでしょうか。最も簡単な死活監視の方法はmemcachedがListenしているポートに接続ができるかどうかを確認することです。
define command {
command_name check_memcached
command_line $USER1$/check_tcp \
-H $HOSTADDRESS$ \
-p 11211 \
-t 5
}
上記の監視コマンド設定を利用すると,Nagiosは5秒以内に監視対象サーバの11211ポートに接続できなかった場合に障害が発生したと認識します。この設定を使用するには,ホスト設定,サービス設定を次のように行います。
define host{
use generic-host
host_name memserver
alias memserver
address 192.168.67.30
}
define service{
use generic-service
host_name memserver
service_description memcached
check_command check_memcached ---(1)
}
IPアドレス「192.168.67.30」のサーバに対して,memcachedのサービスを定義し,(1)でコマンドを指定しています。
この設定のみで死活監視を行うことができますが,接続ができたということだけでmemcachedが正常に動作しているとは断定できません,そこで動作確認のためにstatsコマンドを送って,レスポンスが得られるかを死活監視に追加します。
define command {
command_name check_memcached
command_line $USER1$/check_tcp
-H $HOSTADDRESS$ \
-p 11211 \
-t 5 \
-s 'stats\r\nquit\r\n' \ --- (1)
-E \ ---- (2)
-e 'uptime' \ --- (3)
-M crit
}
(1)でサーバに対して送るコマンドを指定します。ここではstatsコマンドと接続を切るためのquitコマンドを指定しています。コマンドにて改行コードを利用するためには,(2)の「-E」オプションも追加する必要があります。(3)はレスポンスに含まれる文字列で,ここではmemcachedの統計にuptime(起動してからの経過時間)が含まれている事で,statsコマンドが正常に動作したかを確認します。statsコマンドの結果のサンプルのこの記事の2ページ目にあります。
さらにNagiosの監視プラグインを作成することで,memcachedに対してgetやsetといったキャッシュオブジェクトを操作するコマンドを実行して,実際にアプリケーションから利用する場合に即した稼働監視を行うこともできます。前述した「WEB+DB PRESS Vol.55」の連載「大規模Webサービスの裏側」にて,サーバに対してget,set,addを行う監視プラグインを紹介しています。また,ひろせまさあき氏作成の監視プラグイン「check_memcached_paranoid」でも同様の監視が可能です。
- check_memcached_paranoid
- http://d.hatena.ne.jp/hirose31/20100118/1263810212
コネクション数の監視
memcachedがListenするポートに対して接続をする死活監視,またコマンドに対して正常なレスポンスを返せるかを検証する監視の他にmemcachedにはもうひとつ重要だと思われる監視があります。
先日(2010年8月)のmixiの大規模障害は,memcachedの異常終了が引き金となったと発表されています。その後の解析により起動時に指定した最大接続数を超えた際に起きるmemcachedの不具合であることが確認されています。不具合の修正についてはmemcachedの開発コミュニティで議論がされています。
障害の有無に関わらず最大接続数に達することでクライアントがmemcachedに接続できなくなり,データベースの負荷が上昇したり,キャッシュオブジェクトの不整合が起きることはサービス上問題となります。障害を回避しつつmemcachedを安定稼働させるためは,同時接続数の設定を多めに変更したり,memcachedに対する接続数の監視を行い適切な接続数を維持することが必要となります。
以下は現在のコネクション数が最大同時コネクション数に対して,指定した割合よりも大きい場合に例外とするNagiosプラグインと設定例です。
リスト check_memcahced_conn.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use IO::Socket::INET;
GetOptions(
'H=s' => \my $HOST, 'p=s' => \my $PORT,
'w=i' => \my $WARN, 'c=i' => \my $CRITICAL,
);
my $sock = IO::Socket::INET->new(
PeerAddr => $HOST, PeerPort => $PORT
);
my ($raw_stats, $raw_setting_stats);
$sock->syswrite("stats\r\n");
$sock->sysread( $raw_stats, 8192 );
my %stats;
foreach my $line ( split /\r?\n/, $raw_stats ) {
if ( $line =~ /^STAT\s([^ ]+)\s(.+)$/ ) {
$stats{$1} = $2;
}
}
$sock->syswrite("stats settings\r\n");
$sock->sysread( $raw_setting_stats, 8192 );
my %setting;
foreach my $line ( split /\r?\n/, $raw_setting_stats ) {
if ( $line =~ /^STAT\s([^ ]+)\s(.+)$/ ) {
$setting{$1} = $2;
}
}
my $rate = $stats{curr_connections} / $setting{maxconns} * 100;
if ( $rate >= $CRITICAL ) {
printf "MEMCACHED CRTICAL: conn/max = %d\n",int($rate);
exit(2); #crit
}
elsif ( $rate >=$WARN ) {
printf "MEMCACHED WARNING: conn/max = %d\n", int($rate);
exit(1); #warn
}
exit(0);
Nagiosの設定
define command {
command_name check_memcached_conn
command_line $USER1$/check_memcahced_conn.pl
-H $HOSTADDRESS$ \
-p 11211 \
-w 85 \
-c 90
}
上記の設定では,最大同時コネクション数に対しての現在の接続数の割合が85%を超えるとWARNINGとなり,90%を超えるとCRTICALステータスとなり,Nagiosは障害が発生していると認識します。

