hirano

2013.04.03

「なんだかいつもと違う」を fluentd を使って検知する – 異常値検出 –

インフラ・システム運用を担当している平野です。

今回は「なんだかいつもと違う」をシステム監視で検知したいと思います。

通常のシステム監視では、監視項目に対して閾値を設け、
その閾値を外れたら異常値として検知する仕組みを導入します。
が、単純な閾値では片付けたくない監視項目もあります。

例えば、アクセス数なんかは平常時においても日中帯・夜間帯で伸び率が違い、
低い閾値設定すれば大量にアラートがあがりますし、高い閾値設定にすれば
ちょっとした負荷ではアラート検知できません。

これらを解決するには、時間帯別に監視閾値を変更するなど、運用方法で考慮をいれると思いますが、
今回は「fluent-plugin-anomalydetect(異常値検出プラグイン)」を利用して
「なんだかいつもと違う」を検知したいと思います。

◇監視内容
監視対象は当社のとあるサービスのApacheのアクセス数(PV)としました。
score(異常値判定後の指標)を5分間隔(300秒)※でとり、この値が異常な場合にアラート検知します。
scoreの値は目安がわからないので一旦Muninに取り込むようにしました。
※5分間の平均値に対する異常値

◇fluentdの設定(fluent-plugin-anomalydetect)
まずセットアップされた fluentd 環境(td-agent)にプラグインをインストールします。

次にtd-agent.confを作成しました。
検査対象アクセスログをファイルから入れて(tail)、異常値検知プラグインに渡します。
異常値検知プラグインの設定はtickを300(5分)に設定、それ以外はデフォルトにしました。

◇設定結果
この設定で稼働させると、5分毎に以下のような異常値判定結果が出力されますので、
これのscore値を表示させるMuninプラグインを作成し、プロットしてみました。

実際のアクセス数との比較をするとこんな感じで、緩やかなアクセス数の上昇・下降においては
「1〜3」ぐらいのscore値の範囲で推移するようです。

◇監視設定
・急激な上昇(=メディア掲載よる高アクセスやDoS攻撃など)
・急激な下降(=なんらかの原因によるアクセス不能状態)

といった状況には検証過程においては陥ってないので、その場合のscore値がわかってないのですが・・・、
とりあえずはscore値が「5」を超えたら警告、「10」を超えたら異常、という
閾値に一旦持たせることにして、これをNagios監視に設定して運用しています。

5分間平均なので、突発が落ち着いてしまうとすぐに閾値がさがると思われるので、
max_check_attemptsは少ない回数(とりあえず最初は1に設定)しました。

◇検証をしてみて
今回は比較的スタンダードなものを検知してみましたが、fluentdのプラグインが便利すぎです。
まずはシステム全体で応用させていきたいと思います。

異常値検知にはさらに可能性があると思ってます。

いままでの固定的な監視閾値は個別のサーバであったりリソースであったりに対しては有効ですが、
システム全体の負荷の偏りであったり、直接的な異常ではない(なんとなくスローダウン)
みたいな異常(傾向)検知は今後のシステム監視の主流になっていくのではと思っています。

#Muninのようなリソースグラフの尺を日次→月次→週次→月次みたいにぐりぐり移動させながら
 過去の傾向と現在の状況を見比べたり、sarで取得した基礎データをExcel分析したり・・・。
 分析力が甘くて事前判断できないと悔しいですよね。しかも事後的ですし。

#VMWare vCenterでも導入されている「動的しきい値」(≠異常値検知)も近いコンセプトですよね。
 こちらは蓄積されたデータを元に傾向を学習し、閾値を定期的に見直しを行っているとともに、
 内部的にHealth、Risk、Efficiencyをscore付けして、判定できるようにしています。

当社のシステムにおいてもさらに応用を効かせ、独自の監視システムを展開し、
(手間のかからない、楽にできる)安定したシステム運用を目指したいと思ってます。