2014年4月アーカイブ

2012年4月にでた「サーバ/インフラエンジニア養成読本 管理/監視編」の改訂新版が発売されました。技術評論社様、献本ありがとうございます。

表紙に「DevOps」の文字が入ったのが以前との違いですね。

単に、監視ツールやトラブルシューティングにつかうコマンドの使い方だけではなく、どのようなマインドで運用に取り組むべきなのかまで、広く記事が集められているので、この春からシステム運用に関わるようになった方もそうでない方も、ぜひ手に取って読んで頂けたらと思います。

先日のJVM Operations Casual Talks、GCやメモリ管理についてまとまった発表や、モニタリングの手法などの話が聞けてよい会でした。

微妙に意識が高まっているところで、メモリ使用量やGCの統計情報を取得して、GrowthForecastでグラフを作ってくれるスクリプトを書きました。それPla、それFluentd系のやつです

https://github.com/kazeburo/jstat2gf

この元ネタは JVM Operation Casual Talksでのモリスさんの発表にでてきたグラフです。あれを簡単に作れるツールになります。

某JVMのプロセスに対して実行すると、こんな感じのグラフになります。上から「NEW領域」「OLD領域」「Permament領域」「1秒あたりのFull GCの回数」「1秒あたりのFull GCにかかった時間」となっています。

jstat2gf.png

なんかFull GCがいっぱい実行されてますね!

デーモンではない普通のscriptなので、cronで実行します

PATH=/path/to/java/bin:/usr/bin
* * * * * perl /path/to/jstat2gf.pl --gf-uri=http://gf/ --gf-service=example --gf-section=jvm --gf-name-prefix=app001 --jvm-pid=$(pgrep -of 'process name')

今のところインストールはgit cloneとcpanmで。

$ git clone https://github.com/kazeburo/jstat2gf.git
$ cd jstat2gf
$ cpanm --installdeps .

perl-5.14以上なら追加の依存モジュールはないと思われます。

最後に、JVM Operation Casual Talksでの自分のLT資料はこちらです。普段やっているperlのWebアプリケーションの運用を紹介して、それJVMだとどうしたらええの?という疑問をまとめたつもり

ES + kibanaでサーバモニタリングをやってみたのですが、ESのCPU負荷がかなり高くて、リアルタイムにモニタリングできない状況だったので、graphite + grafanaにしてみた。ちなみに、ESのサーバのCPU負荷はこんな感じ。

es-cpu.png

GrafanaはGraphite用のDash boardを作るツール。最近、influxDBにも対応していてなかなか野心的。

Grafana - Graphite Dashboard

kibanaをforkしただけあって、画面はそっくり。まだ修正もれがあるのか、メッセージにkibanaって文字がでてくることもある

grafana.png

セットアップ

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

監視サーバ

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

CentOS6.x - CentOSにRPMでGraphite+Diamondをインストールする - Qiita

を参考にしました。

GraphiteはEPELのrpmを使いました。graphite-webとcarbonをいれます。

$ sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install graphite-web python-carbon mysql mysql-server MySQL-python

外部からのアクセスがないサーバなので、mysqlはこだわらず、そのまま起動して、ユーザを作っておく。

$ sudo service mysqld start
$ mysql -uroot -e "GRANT ALL PRIVILEGES ON graphite.* TO 'graphite'@'localhost' IDENTIFIED BY 'foobar';"
$ mysql -uroot -e "CREATE DATABASE graphite;"

そして、graphiteの設定

$ sudo vim /etc/graphite-web/local_settings.py

一番最後にでも、以下を追加

TIME_ZONE = 'Asia/Tokyo'
DATABASES = {
  'default': {
    'NAME': 'graphite',
    'ENGINE': 'django.db.backends.mysql',
    'USER': 'graphite',
    'PASSWORD': 'foobar',
    'HOST': 'localhost',
    'PORT': '3306',
  }
}

graphiteのweb uiはapache経由でアクセスするので、apacheの設定

$ sudo vim cat /etc/httpd/conf.d/graphite-web.conf

中身はこんな感じにしてみた

Listen 8081
<VirtualHost *:8081>

    Header set Access-Control-Allow-Origin "http://foo.bar.baz:8080"
    Header set Access-Control-Allow-Methods "GET, OPTIONS"
    Header set Access-Control-Allow-Headers "origin, authorization, accept"

    ServerName graphite-web
    DocumentRoot "/usr/share/graphite/webapp"
    ErrorLog /var/log/httpd/graphite-web-error.log
    CustomLog /var/log/httpd/graphite-web-access.log common
    Alias /media/ "/usr/lib/python2.6/site-packages/django/contrib/admin/media/"

    WSGIScriptAlias / /usr/share/graphite/graphite-web.wsgi
    WSGIImportScript /usr/share/graphite/graphite-web.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}

    <Location "/content/">
        SetHandler None
    </Location>

    <Location "/media/">
        SetHandler None
    </Location>

</VirtualHost>

そして、Graphiteが使うCarbonというストレージサービスの設定。

$ sudo vim /etc/carbon/storage-schemas.conf

メトリクスを保存するDBの設定を行う

[dstat]
pattern = ^dstat\.
retentions = 10s:21d

これを、一番上に追加する。今回のメトリクス取得は期間が限られているので、10秒ごとの値を3週間保存するだけとしています。

次はElasticSearch。前回のを参考にしてインストール。

今のところ、Grafanaはdashboardの設定保存などに、ElasticSearchを使うのでESもいれる

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

さいごにGrafana。

Grafanaはまだパッケージはないので、githubからcloneして、設定する。

$ cd /path/to
$ git clone https://github.com/torkelo/grafana.git
$ cd grafana/src
$ cp config.sample.js config.js
$ vim config.js

書き換えたのはgraphiteUrlだけ

graphiteUrl: "http://"+window.location.hostname+":8081",

そしてApacheの設定を追加して、grafana/srcがみれるようにする

Listen 8080
<VirtualHost *:8080>
    ServerName grafana
    DocumentRoot "/path/to/grafana/src"
</VirtualHost>

これで監視サーバの準備は完了

監視対象サーバのfluentdの設定

まず、td-agentと使うpluginを入れます

$ sudo yum install td-agent
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-map fluent-plugin-dstat

graphiteのpluginはセコンさんことhotchpotchさんが作っていますが、ruby-gemsにリリースされてないので、cloneしてきて入れました

$ cd /tmp
$ git clone https://github.com/hotchpotch/fluent-plugin-graphite.git
$ cd fluent-plugin-graphite
$ /usr/lib64/fluent/ruby/bin/rake 
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install pkg/fluent-plugin-graphite-0.2.1.gem

んで、td-agent.confの設定。

<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 {"key" => record["hostname"]+".nginx-req", "gauge" => record["nginx"] }
  </store>
  <store>
    type map
    tag  "map.dstat.memcached-incr"
    time time
    record {"key" => record["hostname"]+".memcached-incr", "gauge" => record["memcached"] }
  </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 {"key" => record["hostname"]+".loadavg-short", "gauge" => record["dstat"]["load avg"]["1m"].to_f*100  }
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-usr"
    time time
    record {"key" => record["hostname"]+".cpu-usr", "gauge" => record["dstat"]["total cpu usage"]["usr"] }
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-sys"
    time time
    record {"key" => record["hostname"]+".cpu-sys", "gauge" => record["dstat"]["total cpu usage"]["sys"] }
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-hiq"
    time time
    record {"key" => record["hostname"]+".cpu-hiq", "gauge" => record["dstat"]["total cpu usage"]["hiq"] }
  </store>
  <store>
    type map
    tag  "map.dstat.cpu-siq"
    time time
    record {"key" => record["hostname"]+".cpu-siq", "gauge" => record["dstat"]["total cpu usage"]["siq"] }
  </store>
  <store>
    type map
    tag  "map.dstat.net-recv"
    time time
    record {"key" => record["hostname"]+".net-recv", "gauge" => record["dstat"]["net/total"]["recv"] }
  </store>  
  <store>
    type map
    tag  "map.dstat.net-send"
    time time
    record {"key" => record["hostname"]+".net-send", "gauge" => record["dstat"]["net/total"]["send"] }
  </store>  
</match>

<match map.dstat.*>
  type           graphite
  host           監視サーバのアドレス
  port           2003
  key_prefix     dstat
  flush_interval 5s
</match>

stats.shは前回と同じなので省略

この設定を行うことで、graphiteには

dstat.gauges.サーバ名.ドメイン.nginx-req

のような名前でメトリクスが記録されるようになります。

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

$ sudo service td-agent start

grafanaを設定

また、ぽちぽちやっていきます。Graphiteの関数・フィルタが使えるのが便利

sum_series.png

nginx/memcachedは全てのサーバの合計値を表示。1秒毎の増加分を計算して、sumSeriesを使う。rrdのようにcouterをいれるスキーマを予め用意しなくても良いのが楽

load-avg.png

ロードアベレージは全てのサーバを表示

filter-topn.png

トラフィックは大きい値を5つだけ表示。highestCurrentを使いました。マウス操作で関数・フィルタを選んで行けるので楽ですね。

これで、試しにabを流したのが以下の動画。