52
そそ fuentd そ- そそそそそそそ - 2014/03/04 @boheanimato

それFluentdで! #fluentd

Embed Size (px)

DESCRIPTION

社内で実はあまり知らない、という声もあって、それfluentdでできるんだけどなぁという実装が多かったので、勉強会してみました。

Citation preview

Page 1: それFluentdで!  #fluentd

それ fuentd で!-  社内勉強会資料  -

2014/03/04@boheanimato

Page 2: それFluentdで!  #fluentd

自己紹介

のりしろエンジニア。

プロジェクトで落っこちてきた、なんか細々としたことを拾い上げてやってます。

Twitter : boheanimato

-SIer 1999/10 ~-Yahoo! 2005/11 ~-Indival 2007/7 ~

Page 3: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみて

みる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– apacheログの集約、集計、活用– MySQLの更新履歴をfluentdでSolrにいれる

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 4: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみてみる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– Apacheログの集約、集計、活用– MYSQLの更新履歴をfluentdでSolrにいれる– もっといろんなこと

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 5: それFluentdで!  #fluentd

こんなことができるようになります

- ログを一箇所に集約!集計!格納!MySQL 、 MongoDB 、 Solr 、 Redis 、

elasticsearch 、 Hadoop に簡単にはいります

- サーバの閾値監視、通知!Zabbix に値を送れたりしますメールおくれます、電話もかけれます

Page 6: それFluentdで!  #fluentd

アーキテクチャ簡単紹介

一般的にログ収集ソフトウェアは何らかの「イベント」を検知し、その内容を発生時刻などの情報とともにファイルやデータベースなどのストレージなどに出力する、という処理を行います。

fluentd でも同じです。

ただ、 fluentd ではイベントの受け取り( input )、バッファに一時的に保存し( buffer )、ストレージなどへの出力( output )がすべてプラグインとして実装されています。

Page 7: それFluentdで!  #fluentd

アーキテクチャ簡単紹介

柔軟なログ収集を可能にする「 fluentd 」入門 - さくらのナレッジ : http://knowledge.sakura.ad.jp/tech/1336/

・テキストファイルの末尾からイベントを読み込む・ TCP ソケットをリッスンして、イベントストリームを受信する・ syslog プロトコル経由でレコードを取得

・ほかの fluentd のノートに出力する・ MongoDB へとレコードを出力する・ファイルに書き出す

Page 8: それFluentdで!  #fluentd

アーキテクチャ簡単紹介

Page 9: それFluentdで!  #fluentd

プラグイン

超豊富Fluentd plugins : http://fluentd.org/plugin/

Page 10: それFluentdで!  #fluentd

こんなことができるようになります

「細かい単位で常にログを回収し続ける仕組み」をいったん fluentd でつくっておくと

→  プラグイン実装→  プラグインが豊富

なので、

回収したログをファイルに出力していたが、elasticsearch にも格納しようとした場合、プラグインを追加して設定するだけで、その要求にすぐに応えられます。

Page 11: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみて

みる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– apacheログの集約、集計、活用– MySQLの更新履歴をfluentdでSolrにいれる

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 12: それFluentdで!  #fluentd

システム構成

APIServerWebServer

ElasticsearchRedisGrouthForcastRaw File

StorageServer

WebServer

forwarderfluent-agent-lite

AggregatorWorkerserializer

Fluentd + plugin

watcher

Raw File

Page 13: それFluentdで!  #fluentd

APIServerWebServer

ElasticsearchRedisGrouthForcastRaw File

StorageServer

WebServer

forwarderfluent-agent-lite

AggregatorWorkerserializer

Fluentd + plugin

watcher

Raw File

apache のログを集約( Forwarder )

Page 14: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

LTSV -   Labeled Tab-Separated Values

テキストのフォーマットの仕様。タブ区切りのフィールドで、ラベルと値を持ちます。主にログ、特に httpd のアクセスログなどに適用すると便利。

後で、ログの解析の属性指定や elasticsearch に格納する際のカラム名として利用。

LTSV FAQ - LTSV って何 ? どういうところが良いの ? - naoya のはてなダイアリー : http://d.hatena.ne.jp/naoya/20130209/1360381374

Page 15: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

LTSV - Labeled Tab-Separated Values

Apacheの設定をこうしておくと、 LogFormat "domain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\ttime:%{%Y/%m/%d %H:%M:%S %z}t\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D" combined_lts

こうなります

タブ区切りで、ラベル:値で出力されます。

Page 16: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

fluent-agent-lite

INPUT プラグインログ収集専用のエージェント正規表現をパースしないため、動作が軽く、負荷の高いアプリケーションサーバに同居させても CPU を使わない。

現状、そのままのログをシェルで集約して、それをもとにバッチが動いて集計しているので、既存の仕組みをそのままで、導入できる!

#fluentd 用ログ収集専用のエージェント fluent-agent-lite 書いた - tagomoris のメモ置き場 : http://d.hatena.ne.jp/tagomoris/20120314/1331716214

Page 17: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

fluent-agent-lite

インストールはプラグインをrpm で入れるか、Git から clone して ./install.sh するか

td-agent はインストールしません

Page 18: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

fluent-agent-lite

Forward先のサーバ

集約したいログ

Page 19: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

Fluentd のログ構造

-Tag– ログの種類。

Fluentd ではログの管理を「タグ」で管理します。タグはイベントを発生させる側などで指定します。

-Time– ログの時刻を UNIX 時刻で表したもの

-Record– ログの内容が JSONオブジェクトではいります

アプリケーション側でのパースが容易

Tag : koala.www. Time : 137084495Record: {k1:100,

k2 :value1}

Page 20: それFluentdで!  #fluentd

apache のログを集約( Forwarder )

fluent-agent-lite

-Tag前述の記述の場合、 以下の3つのタグがついたレコードが流れます。

-koala.www-koala.app-koala.stat

-Recordそのまま、 message という attribute が付いた中に入っ

て送られます。レコードの attribute も変更可( デフォルト message)

Tag : koala.www. Time : 137084495message : { ログが 1 行づつ入

ります }

Page 21: それFluentdで!  #fluentd

apache のログを集約( Aggregater/worker/serializer )

APIServerWebServer

ElasticsearchRedisGrouthForcastRaw File

StorageServer

WebServer

forwarderfluent-agent-lite

AggregatorWorkerserializer

Fluentd + plugin

watcher

Raw File

Page 22: それFluentdで!  #fluentd

td-agent をインストール

http://docs.fluentd.org/categories/installation

apache のログを集約( Aggregater/worker/serializer )

Page 23: それFluentdで!  #fluentd

fluent-plugin-file-alternative

OUTPUT プラグイン出力フォーマットを自由に変更できる!( fluentd 標準のファイル出力プラグイン out_file はメッセージを JSON にシリアライズして出力するというものなので)

前述のプラグインとあわせると、「そのままのログを集約して一か所で出力!」が fluentd で実現できるわけです。

#fluentd fluent-plugin-file-alternative released! - tagomoris のメモ置き場 : http://d.hatena.ne.jp/tagomoris/20120316/1331886385

apache のログを集約( Aggregater/worker/serializer )

Page 24: それFluentdで!  #fluentd

設定ファイルの記述ポイント2つ/etc/td-agent/td-agnet.conf

-sourceイベントの受信方法を指定

-match受信したイベントをどのように処理するかを条件文とともに指定条件はタグの名前条件にマッチしたら、次のプラグインに処理が渡されます

apache のログを集約( Aggregater/worker/serializer )

Page 25: それFluentdで!  #fluentd

fluent-plugin-file-alternative

koala.www.* のタグにマッチしたイベントを処理

apache のログを集約( Aggregater/worker/serializer )

forward   TCP/IP を使ってイベントを受け取る。

Page 26: それFluentdで!  #fluentd

ログでました/tmp/ koala.access.20140228_0.log.gz

apache のログを集約( Aggregater/worker/serializer )

Page 27: それFluentdで!  #fluentd

さらに、この LTSV のログをパースしてelasticsearch にいれてしまいます

apache のログを集約( Aggregater/worker/serializer )

Page 28: それFluentdで!  #fluentd

apache のログを集約( Aggregater/worker/serializer )

LTSV形式をパースして

Elasticsearch にいれてる

fluent-plugin-parserfluent-plugin-elasticsearch

Page 29: それFluentdで!  #fluentd

fluent-plugin-parser

最初、そのまま elasticsearch にデータを流すと、 message タグの中にはいったまんま elasticsearch インデックスが作成されてしまい、うおおおとか思っていたのですが、

@tagomoris さんから、アドバイスいただきました。

fluent-plugin-parser released! - tagomoris のメモ置き場 : http://d.hatena.ne.jp/tagomoris/20120402/1333363444

apache のログを集約( Aggregater/worker/serializer )

負荷の問題がないのなら、fluent-plugin-parser で ltsv をparse してしまえばいいと思いますよ

Page 30: それFluentdで!  #fluentd

-parse 実行前

apache のログを集約( Aggregater/worker/serializer )

Page 31: それFluentdで!  #fluentd

elasticsearch

apache のログを集約( Aggregater/worker/serializer )

Page 32: それFluentdで!  #fluentd

kibana

apache のログを集約( Aggregater/worker/serializer )

Page 33: それFluentdで!  #fluentd

kibana

apache のログを集約( Aggregater/worker/serializer )

LTSV でつけたラベル毎に検索できる

Page 34: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみて

みる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– apacheログの集約、集計、活用– MySQLの更新履歴をfluentdでSolrにいれる

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 35: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

画像、 JS 、 CSS を対象外に

200以外のステータスは捨てるGET以外のメソッドは捨てる

fluent-plugin-rewrite

Index.php は top として扱う

グルーピングする

Page 36: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

fluent-plugin-rewrite

このプラグインを用いると、ひとつひとつの message について、指定した key の value が特定のパタンにマッチしたら、

-value を書き換えて、再 emit する- その message を無視する- マッチした文字列を tag に追加して、再 emit する

ということができる。また、それらのルールを複数指定することも可能。

fluent-plugin-rewrite というプラグインを作成した #fluentd - delirious thoughts : http://blog.kentarok.org/entry/2012/07/01/000518

Page 37: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

fluent-plugin-rewriteタグ毎にグルーピングできました

Page 38: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

fluent-plugin-numeric-monitorfluent-plugin-forest   /   fluent-plugin-growthforecast

レスポンスタイムの集計

集計を growthforcast にくわせる

Page 39: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

fluent-plugin-numeric-monitor

指定したフィールド ( の数値 ) について、 min/max/avg  および指定したパーセンタイル値を算出する。

パーセンタイル値は複数指定できるので、たとえば 90, 95, 98, 99 パーセンタイル値をそれぞれ出力したりできる。

fluent-plugin-numeric-monitor v0.1.0 and fluent-plugin-numeric-counter v0.1.0 released! - tagomoris のメモ置き場 : http://d.hatena.ne.jp/tagomoris/20120706/1341560190

Page 40: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

Growthforcast

定期的に GrowthForecast に値を POST するだけで、設定なしでグラフが作れます

GrowthForecast - Lightning fast Graphing / Visualization : http://kazeburo.github.io/GrowthForecast/index.ja.html

Page 41: それFluentdで!  #fluentd

apache のログを URL 毎にグルーピング( Aggregater/worker/serializer )

Growthforcast

Page 42: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみて

みる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– apacheログの集約、集計、活用– MySQLの更新履歴をfluentdでSolrにいれる

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 43: それFluentdで!  #fluentd

現状をこうしよう!(apache ログの集約、集計、活用 )

そこ fluentd で!

APIServerWebServer MySQL

StorageServerWebServer

SCP

SCP SCPBatch

Page 44: それFluentdで!  #fluentd

現状をこうしよう!(MySQL の更新履歴を Solr にいれる )

fluent-plugin-mysql-replicator

Page 45: それFluentdで!  #fluentd

運用面メモ

Aggregator側: 1 プロセスでは 1 つの CPU コアしか使わないので、サーバのリソースを使い切るために、複数プロセスを起動→8 プロセス起動させる(プロセッサ 8 つ、物理 CPU は 1 つ、コア数4 の場合)

割り当てポートは、 24200 ~ 24207 などに

Forwarder から送信時に、ポート指定で送信するようにする。

INPUT で受け取る大きさを考慮してバッファは指定するなど、実運用で検討すべきパラメータはたくさんあります。

本番運用のまえに各種パラメータとか流量は検討しよう!

Page 46: それFluentdで!  #fluentd

INDEX

-fluentdの紹介– こんなことができるようになります– アーキテクチャ簡単紹介

-こんなことをやってみました– apacheのログを集約して、elasticsearchにいれて、kibanaでみて

みる– apacheのログをURL毎にグルーピングしてレスポンスタイムを

GrowthForecastでみてみる

-現状をこうしよう!– apacheログの集約、集計、活用– MySQLの更新履歴をfluentdでSolrにいれる

-可視化について– 事前に考え抜くこと– 目的の明確化、KGIとKPI– 設計サンプル

Page 47: それFluentdで!  #fluentd

可視化について

今回はプロトタイプ作成のために、とりあえず可視化できるよ!というのをしたのですが、

できることが把握できた後は、

何のため?という目的を明確化して本番の実装はすすめていこう(自戒)

Page 48: それFluentdで!  #fluentd

可視化について

事前に考え抜くこと

「何を可視化するか」

「可視化すべき KPI を決める」

「具体的な KPI の中身を定義する」

目的から指標を決める目的は何かを考え抜くこと

Page 49: それFluentdで!  #fluentd

可視化について

目的の明確化、 KGI と KPI を決める

目標:「売り上げ向上」

KGI ( Key Goal indicator )目標そのものを定量的に評価するもの– 「売上」

KPI ( Key Performance indicator )KGI の構成要素を細分化したものKGI を達成するために何が必要かを定量的にあらわす指標– 「顧客数、一人あたり単価、 PV 、継続率」

Page 50: それFluentdで!  #fluentd

可視化について

項目 内容

目的 一目でサーバ情報の異常や傾向を把握できるだけでなく、気になったところを拡大して調査できるようにする

データ変数⇔視覚変数

時間(間隔尺度)⇔  X座標(定量性・順序性)各種サーバ情報(比例尺度)⇔  Y座標(定量性・順序性)

利用する可視化手法

折れ線グラフ

推奨Web 特性 アニメーション(リアルタイムでのデータ反映)インタラクション(時間の選択範囲)

Page 51: それFluentdで!  #fluentd

可視化について

読むといいかも(参考図書)

Page 52: それFluentdで!  #fluentd

おわりに

ありがとうございました