2014年3月アーカイブ

普段はサーバのメトリクス可視化のためにcloudforecastを使っていますが、某案件用に数秒単位で数十台のサーバのメトリクスを表示したいので、記事タイトルのような構成を作ってみた。

kibana.jpg

dstatでとった各種値の他に、nginxとmemcachedの情報も合わせて表示させています。

セットアップ

もろもろのセットアップのメモ

監視サーバ

まず、監視サーバにElasticsearchkibanaをいれる。環境はCentOS6

$ sudo yum install java-1.7.0-openjdk
$ sudo rpm -Uvh https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.x.x.noarch.rpm

Elasticsearchは特に設定なく起動

$ sudo service elasticsearch start

次、kibanaとkibanaをhostingするwebサーバの設定

$ cd /path/to
$ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.x.x.tar.gz
$ tar zxf kibana-3.x.x.tar.gz

して、webサーバのドキュメントルートに、/path/to/kibana-3.x.x を指定。

データをいれ始める前に、Elasticsearchにmappingのヒントを与える

$ curl -XPUT localhost:9200/_template/template_1 -d '
{
   "template" : "logstash-*",
   "mappings" : {
       "dstat": {
           "properties": {
                "host" : { "type" : "string", "index" : "not_analyzed" },
                "value" : {"type" : "double"}
           }
       }
   }
}
'

監視対象サーバの設定

モニタリング対象となるサーバにはfluentdをいれる

$ sudo yum install td-agent

弊社環境だとモリス作成のtd-agentがyum repositoryにあるのでこれを使った。一般的にはtreasuredata社のrepositoryを使うと思う。

pluginを追加

$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-map fluent-plugin-dstat fluent-plugin-elasticsearch

fluent-plugin-elasticsearchのインストールで依存性解決ができなくて失敗することがなんどかあった。

/etc/td-agent/td-agent.confを次のようにしてみた。dstatの情報をそれぞれ別のログにするところは、「dstatをkibanaで可視化+3.0.0milestone5新機能 を参考にさせて頂きました。

<source>
  type exec
  command sh /etc/td-agent/stats.sh
  format tsv
  keys hostname,nginx,memcached
  tag stats
  run_interval 5
</source>

<match stats>
  type copy
  <store>
    type map
    tag  "map.dstat.nginx-req"
    time time
    record {"value" => record["nginx"], "stat" => "nginx-req", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.memcached-incr"
    time time
    record {"value" => record["memcached"], "stat" => "memcached-incr", "host" => record["hostname"]}
  </store>
</match>

<source>
  type dstat
  tag dstat
  option -lcn
  delay 5
</source>

<match dstat>
  type copy
  <store>
    type map
    tag  "map.dstat.loadavg-short"
    time time
    record {"value" => record["dstat"]["load avg"]["1m"], "stat" => "loadavg-short", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-usr"
    time time
    record {"value" => record["dstat"]["total cpu usage"]["usr"], "stat" => "cpu-usr", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-sys"
    time time
    record {"value" => record["dstat"]["total cpu usage"]["sys"], "stat" => "cpu-sys", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-hiq"
    time time
    record {"value" => record["dstat"]["total cpu usage"]["hiq"], "stat" => "cpu-hiq", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-siq"
    time time
    record {"value" => record["dstat"]["total cpu usage"]["siq"], "stat" => "cpu-siq", "host" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.net-recv"
    time time
    record {"value" => record["dstat"]["net/total"]["recv"], "stat" => "net-recv", "host" => record["hostname"]}
  </store>  
  <store>
    type map
    tag  "map.dstat.net-send"
    time time
    record {"value" => record["dstat"]["net/total"]["send"], "stat" => "net-send", "host" => record["hostname"]}
  </store>  
</match>

<match map.dstat.*>
  type elasticsearch
  type_name       dstat
  host            監視サーバのIP
  port            9200
  logstash_format true
  logstash_prefix logstash
  flush_interval  5s
</match>

nginxとmemcachedの統計情報をとるstats.shは

#!/bin/sh
set -e
HOST=$(hostname)
NREQ=$(curl -s http://localhost/nginx_status|head -3|tail -1|awk '{print $3}')
MREQ=$(echo stats | nc localhost 11211| grep incr_hits | awk '{print $3}')
echo -e "$HOST\t$NREQ\t$MREQ"

のような簡単なshellscriptです。

設定をいれたら、fluentdを起動

$ sudo service td-agent start

kibanaをぽちぽち設定

データが入りはじめたら、kibanaでぽちぽちやって可視化。

nginxのリクエスト数なら、topNクエリを使い、

top-n.png

Histgramグラフの設定で、Transform SeriesのSeconds、Derivativeを両方とも有効にして秒間のリクエスト数に直し、stackグラフにします。

panel.png

あとはグラフによって、秒で割るかどうか、stackするかどうかを選びつつ可視化して行きます。すると最終的にこんなのが出来上がりました。

kibana.jpg

あとは本番を待つのみ。。

高速スケーラブル検索エンジン ElasticSearch Server
Rafal Kuc Marek Rogozinski
KADOKAWA/アスキー・メディアワークス
売り上げランキング: 2,398