SlideShare a Scribd company logo
12th
Nov, 2013

ElasticSearch+Kibanaでログデータの検索と
視覚化を実現するテクニックと運用ノウハウ
Kentaro Yoshida in 第2回 ElasticSearch勉強会

page 1
1. はじめに
2. 自己紹介

本日の流れ

3. Kibana v3
4. システム構成例
5. JDBCの利用
6. 運用ノウハウ
7. まとめ
8. 次回予告

page 2
1. はじめに

page 3
引用元 site:http://www.elasticsearch.org/ - Google 検索
page 4
引用元 site:http://www.elasticsearch.org/ - Google 検索
page 5
引用元 site:http://www.elasticsearch.org/ - Google 検索
page 6
引用元 site:http://www.elasticsearch.org/ - Google 検索
page 7
引用元 site:http://www.elasticsearch.org/ - Google 検索
page 8
“Kibana” is a great
Log Visualization Tool!!

page 9
2. 自己紹介

page 10
自己紹介
• よしけんさん
• (株)リブセンス
• Web系インフラの

研究開発エンジニア
好きなプロダクト

page 11
お知らせ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
3. Kibana v3

page 14
Kibana v3
時間軸ベースのログの検索&視覚化ツール
UIがやたら格好イイ
クエリ言語を覚える必要は無い
時刻データを持つログファイルに特化している
例えば、Webサーバのアクセスログや、アプリログ
Fluentd (Ruby) や、LogStash (JAVA) からElasticSearchに流し込む
例えばFluentdの fluent-plugin-geoip を用いて、アクセス元のIP
から求められる地域情報をKibanaの地図にプロットも出来ます

page 15
Kibana v3
Kibanaのインターフェースが触れるデモが公式に用意されています
http://demo.kibana.org/
次ページからの画面は次のURLからも参照できます
http://bit.ly/HKa9vu
http://demo.kibana.org/#/dashboard/temp/
_LsCoVEBQIe5zb5EMr4apA

page 16
Kibana v3

page 17
Kibana v3

page 18
Kibana v3

page 19
Kibana v3

page 20
Kibana v3

page 21
4. システム構成例

page 22
システム構成例
次のソフトウェアを組み合わせた構成の説明を行います
フロントエンド : Nginx
Kibanaの静的ファイル配信と認証
検索システム:ElasticSearch
KibanaからのリクエストをNginxを通して処理
Fluentdからのログデータの流し込み先
ログアグリゲータ:Fluentd
位置情報付与のために fluent-plugin-geoip
ElasticSearchへの出力のために fluent-plugin-elasticsearch
page 23
Nginx設定例
upstream elasticsearch {
server 127.0.0.1:9200;
}
server {
listen
server_name
access_log

*:8080 ;
kibana.myhost.org;
/var/log/nginx/kibana.myhost.org.access.log;

satisfy any;
allow 192.168.0.0/16;
allow 10.0.0.0/8;
allow 127.0.0.1;
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
location /kibana/ {
root /usr/share/nginx/www;
index index.html index.htm;
}

}

page 24

location / {
proxy_pass http://elasticsearch;
proxy_read_timeout 90;
}
Fluentdとの連携サンプル
Apacheのアクセスログの IPアドレスを基に地域情報の抽出を行う
fluent-plugin-geoipを利用する
MaxMind社が提供しているgeoipデータベースを用いる
上記のFluentd Pluginには無償版のGeoLiteCityが同封されているのでそ
のまま使えるが、有償版のデータベースファイルも利用可能
gem ‘geoip-c’を利用するため、事前にインストールする必要がある
RHEL/CentOS:GeoIP-devel, Ubuntu/Debian:libgeoip-dev
参考 http://y-ken.hatenablog.com/entry/fluent-plugin-geoip-v0.0.4
page 25
Fluentdとの連携サンプル
<source>
type forward
</source>
<source>
type monitor_agent
bind 0.0.0.0
port 24220
</source>
<match apache.access>
type geoip
add_tag_prefix
es.
geoip_lookup_key
host
enable_key_country_code geoip_country
</match>
<match es.apache.access>
type elasticsearch
host localhost
port 9200
type_name apache
include_tag_key true
tag_key @log_name
logstash_format true
logstash_prefix apache
flush_interval 10s
buffer_type file
buffer_path /var/log/td-agent/buffer/es
buffer_chunk_limit 100m
buffer_queue_limit 500
retry_wait 10s
</match>

page 26
Fluentdとの連携サンプル
他にも、こんなことも出来ます
fluent-plugin-munin を利用した、H/Wメトリクス情報の収集と検索
fluent-plugin-dstat を利用した、リソース監視情報の収集と検索
fluent-plugin-twitter を利用した、ツイートの収集と検索

page 27
Fluentdとの連携サンプル

もっといろいろなデータを入れたくなりませんか?
このように集計することで生きるデータはアクセスログに限りません
MySQLや Hadoop (TreasureData) のレコードにも埋もれています

page 28
5. JDBCの利用

page 29
JDBCの利用
今回利用するプラグイン
elasticsearch-river-jdbc
https://github.com/jprante/elasticsearch-river-jdbc
ElasticSearchにデータを流し込むプラグイン機構をRiverと言う
このプラグインは、RiverプラグインとしてJDBCドライバを使うもの
JDBCドライバがあればどんなDBにも接続できます

page 30
JDBCの利用
目的
Kibanaから容易に絞り込み・視覚化を行えるようにすること
注意
Kibanaから使えるよう、JOINせずに使える表に予め展開すること
プロダクションで使う際にはしっかりと動作検証を重ねましょう
2013年11月時点で、妙な挙動になる事が時々あります

page 31
JDBCの利用
インストール方法
インストール後、ElasticSearchを再起動して反映
curlコマンドでプラグイン一覧を確認すると良いでしょう
$
$
$
$

page 32

cd /usr/share/elasticsearch
sudo ./bin/plugin --install river-jdbc -url http://bit.ly/1iovWV9
sudo /etc/init.d/elasticsearch restart
curl "http://localhost:9200/_nodes?pretty&plugin=true"
JDBCの利用

今回は次のミドルウェアとJDBCドライバで接続する方法を紹介
MySQL 5.6
TreasureData (Hadoop)

page 33
JDBCの利用 MySQL編
JDBCドライバをダウンロードします
http://dev.mysql.com/downloads/connector/j/
ダウンロードした.jarファイルを次のディレクトリへ格納します
$ sudo cp -a mysql-connector-java-5.1.27-bin.jar /usr/share/
elasticsearch/plugins/river-jdbc/
ElasticSearchを再起動して読み込ませます
$ sudo /etc/init.d/elasticsearch restart

page 34
JDBCの利用 MySQL編
_riverに設定を登録します
curl -XPUT 'localhost:9200/_river/mysql_jdbc_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "your_mysql_user",
"password" : "your_mysql_password",
"strategy" : "oneshot",
"sql" : "select * from orders",
},
"index" : {
"index" : "jdbc_mysql",
"type" : "test_orders"
}
}'

page 35
JDBCの利用 TreasureData編
JDBCドライバをダウンロードします
http://docs.treasure-data.com/articles/jdbc-driver
ダウンロードした.jarファイルを次のディレクトリへ格納します
$ sudo cp -a td-jdbc-0.2.2-jar-with-dependencies.jar /usr/share/
elasticsearch/plugins/river-jdbc/
ElasticSearchを再起動して読み込ませます
$ sudo /etc/init.d/elasticsearch restart

page 36
JDBCの利用 TreasureData編
_riverに設定を登録します
$ curl -XPUT 'localhost:9200/_river/td_jdbc_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:td://api.treasure-data.com/mywebsite",
"user" : "foo@example.com",
"password" : "your_td_password",
"strategy" : "oneshot",
"sql" : "select v['''member_id'''] as `_id`, v['''action'''] AS
action from foo",
},
"index" : {
"index" : "jdbc_td",
"type" : "test_action"
}
}'

page 37
JDBCの利用 諸注意

elasticsearch-0.90.6には不具合が見つかっているため、
0.90.5か、修正版の0.90.7をご利用ください。
https://github.com/elasticsearch/elasticsearch/issues/4089
page 38
6. 運用ノウハウ

page 39
Q. どんなログの視覚化に便利?

page 40
Q. どんなログの視覚化に便利?
例えばこのようなデータの視覚化にも利用できます
エラーログの俯瞰(WEBサーバやDBサーバのエラーログ)
ページの応答速度の推移(アクセスログの応答時間)
n秒以上応答に掛かるページの推移(アクセスログの応答時間)
HTTPステータスコードが404・500エラーとなった推移
Googlebot等からのクロール状況
ログイン成功数/ログイン失敗数
自社広告の露出回数・クリック回数の推移
などなど...
page 41
Q. 設定周りのTipsが知りたい

page 42
Q. 設定周りのTipsが知りたい
/etc/sysconfig/elasticsearch
ES_HEAP_SIZE
潤沢に設定しましょう
例えばメモリ4GBのサーバで、ElasticSearch専用ならば3GB程度
DATA_DIR
デフォルトは/var/lib/elasticsearch/
/data/などの別のブロックデバイスを利用する場合に設定

page 43
Q. 設定周りのTipsが知りたい
/etc/elasticsearch/elasticsearch.yml
cluster.name
初回起動時に作成する/var/lib/elasticsearch/以下のディレクトリ
名にも利用するため、稼働中に変更する場合は停止の上、ディレク
トリのリネームも同時に行いましょう
node.name
設定しないと再起動する度に変わります

page 44
Q. 設定周りのTipsが知りたい
/etc/elasticsearch/elasticsearch.yml
discovery.zen.ping.multicast.enabled
1台のみで単体稼働させる場合はfalseにします
cluster.nameを変更しなくても良いので設定の共通化が可能
http.max_content_length
Fluentd等からバルク登録する際にデフォルトの100MBでは
不足する場合には、ここの値を増やします
Fluentd側の設定でいうbuffer_chunk_limitより大きくしましょう
page 45
Q. 9200番ポート空けたくないです

page 46
Q. 9200番ポート空けたくないです

リバースプロキシがあれば、外向きには80番ポートのみでも動かせます
サーバのFirewallで、22番と80番しか空けられない状況でも使えます
Nginxの設定サンプルは、先ほど紹介したP.24を参照してください

page 47
Q. 便利プラグインが知りたい

page 48
Q. 便利プラグインが知りたい
管理系プラグイン:少なくともHQとbigdeskは入れましょう
HQ:データのブラウズやインデックス管理が出来て便利
head:データの簡易ブラウズが出来て便利
bigdesk:JXM的な負荷確認やクラスター管理に便利
$
$
$
$

page 49

cd /usr/share/elasticsearch
sudo ./bin/plugin --install royrusso/elasticsearch-HQ
sudo ./bin/plugin --install mobz/elasticsearch-head
sudo ./bin/plugin --install lukas-vlcek/bigdesk
Q. バックアップ/リストア方法は?

page 50
Q. バックアップ/リストア方法は?
こちらの9枚目から記載されている
https://speakerdeck.com/imotov/new-features-inelasticsearch-v1-dot-0
rsyncでバックアップを行う方法
http://karussell.wordpress.com/2011/07/10/how-to-backupelasticsearch-with-rsync/
特定のインデックスのバックアップ・リストア
http://qiita.com/toyama0919/items/ccd5eb9169967db54a76
page 51
Q. 便利な保守ツールが知りたい

page 52
Q. 便利な保守ツールが知りたい
指定日数より前のLogStash形式のインデックスを削除するツール
Kibanaを利用するなら定期実行する必要があります
logstash-%{+YYYY.MM.dd} (例:logstash-2013.11.12)
といったインデックスが日時で作られます
どちらも便利ですが、prefix文字列の指定が出来る後者がお勧めです
CentOS 6.4にて動作確認済みです
https://github.com/bloonix/logstash-delete-index
https://github.com/crashdump/logstash-elasticsearch-scripts
page 53
Q. JSONクエリは面倒です

page 54
Q. JSONクエリは面倒です
CLIから使うなら
elseql
https://github.com/raff/elseql
SQLでElasticSearchに問い合わせできるPythonコマンド
Ruby・PHP等から使うなら
http://www.elasticsearch.org/guide/en/elasticsearch/client/
community/current/clients.html

page 55
Q. Fluentd連携時のTipsが知りたい

page 56
Q. Fluentd連携時のTipsが知りたい
fluent-plugin-elasticsearch のバッファ設定に注意
計画停止時の未転送ログ消失を避けるため、buffer_type fileを推奨
ElasticSearchのメンテナンス中に転送待ちログが溢れないように、
buffer_chunk_limit と buffer_queue_limitのチューニングが必要
例えば1分100MBのログ流量で30分メンテナンスするならば、
次の式を満たす必要があります。
3000MB < buffer_chunk_limit * buffer_queue_limit
最大でbuffer_queue_limitの数だけファイルが開いたままの状態とな
るため、 Too many open files エラーに気をつけましょう
page 57
Q. Fluentd連携時のTipsが知りたい

/etc/elasticsearch/elasticsearch.yml
http.max_content_length
デフォルトは100mb
fluent-plugin-elasticsearchで指定する buffer_chunk_limitより大
きくしましょう

page 58
7. まとめ

page 59
まとめ

ElasticSearch素晴らしい
無料で使えるダッシュボード、Kibanaとのコンビネーションは秀逸
引き続き活用し、情報を共有していきます

page 60
8. 次回予告

page 61
次回予告
ElasticSearchへMySQLレコードを
非同期レプリケーションして、
日本語対応全文検索を行う夢を見た話
∼MySQL BinlogAPI挫折体験記∼
page 62
お知らせ
お知らせ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
Thanks!
ご清聴ありがとうございました。

page 70

More Related Content

ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ