クックパッドにおけるサーバ監視と運用の工夫

こんにちは。インフラストラクチャー部の加藤(@EugeneK)です。 今回はWebサービスを運用する上で欠かせない、モニタリングをクックパッドでどうしているかという話をします。

死活監視と性能監視

Webサービスを運用している以上、そのサービスを稼働しているサーバがあり、サーバには故障やトラブルが発生します。 また、どれくらいのパフォーマンスが出ているか、リソースをどのくらい消費しているかなどのトレンドを把握することは、成長するサービスを支えていく上で欠かせません。

故障やトラブルにいち早く気づくための仕組みを死活監視と言います。

また、サーバリソースの時系列での推移を知るために、グラフとしてトレンドを可視化する仕組みを性能監視と言います。

ポーリング監視の限界とZabbixのアクティブ監視

クックパッドでは死活監視にNagios、性能監視にMuninを使用してきましたが、サーバ台数の増加に伴い限界が見え始めました。 具体的には、監視を行うサーバが監視対象のサーバへ定期的に通信をして死活や性能の監視を行っていましたが、監視対象のサーバ台数が500台を越えるあたりから監視が追い付かず、指定した間隔で行われないという問題が発生しました。

f:id:EugeneKato:20150427120737p:plain

その問題を解決するためにZabbixを導入しました。Zabbixとは統合監視ツールであり、監視とグラフ作成が両方行えるツールですので、NagiosとMuninを両方使う必要がなくなります。

また、Zabbixの特徴としてアクティブ監視という機能があります。アクティブ監視とは監視対象のサーバにインストールされたエージェントが各種リソースや性能の状況を取得し、メトリックスとして監視サーバに報告する機能です。

f:id:EugeneKato:20150427120731p:plain

この機能を用いると、監視サーバのポーリングがボトルネックとなって台数の増加に対応できないという問題が解決し、スケーラビリティを確保することができます。 実際にクックパッドでは1秒間に3000項目を越える監視を実現しています。 もちろん、Pingによる監視とエージェント自体が稼働しているかどうかの監視は引き続き監視サーバ側から行う必要がありますが、それ以外の監視は全てアクティブ監視で行うことが出来ます。

自動登録

クックパッドではAWS上でサーバを運用しているため、オートスケールを始めとしてサーバの増減が日常的に発生しています。 そこで、監視の仕組みもサーバの増減に追従する必要があります。

Zabbixには自動登録の仕組みがあり、エージェントが起動したときに監視サーバと通信し、監視サーバに未登録であれば新規登録して監視に追加する機能があります。 この仕組みを使ってサーバの増加に対応しています。

一方で、減少に対しては独自の仕組みを使っています。 オートスケールで減少した分については、AWSのAPIで取得したサーバリストとZabbixのAPIで取得したサーバリストを突合させて、減少分を削除するスクリプトを定期的に実行しています。 また、オートスケール以外で減少した分についてはサーバ停止後もグラフを振り返りたい場合があるため、手動で削除するようにしています。

chatopsによる作業負担の軽減

Zabbixでの監視の流れは以下の通りとなっています。

  • エージェントによるメトリクスの取得と監視サーバへの報告
  • 監視サーバ側で報告された値をもとに、トリガーとして設定された閾値と比較
  • トリガーに紐付けられたアクションによってメールによるアラートの通知など任意のタスクを実行

クックパッドでは監視で異常が発生した場合はメールによる通知と同時に、業務で使用しているチャットにも通知するようにしています。 f:id:EugeneKato:20150427163735p:plain

これは、そのアラートに対して誰が対応しているかなどの状況を素早く共有するのがねらいです。 また、手動によるオペレーションを実施する際に一時的にアラートを止めたい場合も、チャットルームに常駐しているロボットに向けて発言することで、ZabbixのAPIを通じて自動的にメンテナンス設定を行うようにしています。 f:id:EugeneKato:20150427164352p:plain

こういった「chatops」の仕組みを用いることで、最小限の手順で情報の共有や操作が行えるようになります。

多リージョン展開とプロキシ監視

クックパッドは今世界展開をしている最中であり、AWSでの多リージョン展開をしています。 リージョン毎に監視システムが存在してしまうと管理・運用の手間が増えてしまうため、Zabbixのプロキシ監視の仕組みで一元化するようにしています。 f:id:EugeneKato:20150427120743p:plain

図にあるとおり、zabbix-serverとzabbix-proxyはVPNによって接続し、各リージョンにあるzabbix-proxyはそのリージョン内の監視対象のサーバから取得したメトリクスを集約してzabbix-serverに報告するようになっています。 これによって、VPNを経由する通信はzabbixプロトコルが使用するポートのみを許可すればよいことになり、ネットワークの設定も最小限で済ませることができます。

おわりに

クックパッドでの監視の仕組みについて紹介しました。 冒頭でも触れましたように、サーバのモニタリングはサービスの品質を向上させる上で欠かせません。 モニタリングの向上はサービスの向上ととらえ、日々改善を行っています。