fluentd casual

29
fluentd Casual Talks

Upload: oranie-narut

Post on 30-Jun-2015

8.269 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fluentd casual

fluentd Casual Talks

Page 2: Fluentd casual

自己紹介

id:oranie@oranie

• サイバーエージェント グループ子会社で、グループ内でも余り知られていないシステムでなんか色々やる簡単なお仕事しています。

• 緑色のみんながよく知っているサービスの裏側とかは全く知らないです!聞かないで下さい!

• カジュアル枠として参戦でございます。優しくしてね!

Page 3: Fluentd casual

今回のテーマ

「fluentdはじめました」

Page 4: Fluentd casual

言いたいこと

fluentdを使ってみているという話が中心です。

詳細な話は結構割愛。

今日発売のSofftwareDesignがスピーカー殺しすぎる。

Page 5: Fluentd casual

なんでこんな事をやる?

●apacheログからレスポンスタイム、ステータスコードの可視化とかやっている人いる?

●アプリが出している情報の可視化とかも。

Page 6: Fluentd casual

fluentd+ fluent-plugin-datacounter+Cactiを使って

Webサーバのレスポンスタイムを可視化したり

Page 7: Fluentd casual

他に

Webサーバのレスポンスステータスの状況とか

Page 8: Fluentd casual

更にアプリログで

なんのかは説明できないけど、

サービス的に意味のある統計情報がリアルタイムで見れる。

今まで日次+Excel手作業だった。担当者(僕)がサボるともっと時間掛かっていたけど!

Page 9: Fluentd casual

なんでこんな事やるの?

●apacheログからの状況可視化→運用面でのメリット

●appログからのサービス状況可視化→ビジネス的な解析

●システム運用面でのメリット+ビジネス的な解析も運用側だけ

で出来そう。

●サービス用DB参照するのとかは色々とね。

●MySQLならレプリすぐ作れるけど、Oracleなのでサーバ作るのに・・・・。

Page 10: Fluentd casual

旧構成(と言っても今も動いている)

Webサーバ

集約サーバ

日次処理によるログ退避

DBサーバ

各Webサーバの生Apacheログをパー

ス、追加情報を付与して整形する 各log_data{yyyymm}テーブルを元に

解析用のテーブルとか分割したテーブ

ル作る

DBにINSERTする

必要な元ネタテーブルが作成完了した

ら、各集計用スクリプトを実行し、それぞ

れのテーブルを更新して行く

日次、月次での各テー

ブル作成、及び集計処

理を実行

Page 11: Fluentd casual

この方式の欠点

・ログが大量だと全部DBに入れるのに糞重い

・ログが大量だと日次処理、月次処理が糞重い

・基本処理が日次なので、昨日の状況を見たい時でもDBに格納されてからバッチ実行を待って、それからデータをCSVで落としてExcelでグラフ・・・・ヽ(`Д´)ノムキー

・「ログは日次で退避させる」という仕様は変えられない。

Page 12: Fluentd casual

そこに!

Page 13: Fluentd casual

なぜfluentdか?

rsyslog

syslog-ng

cron(rsync、scp、ftp)で取得との違い

Page 14: Fluentd casual

思いつくままに

●設定が面倒くさい。

● syslog-ngはオワコンくさい。(2年前くらいから経路機器のログ集約で使ってますよ。ちくしょう!)

●デフォだから逆に使いたくない。

(設定問題でkernelが出すmessageログとかに支障を出したくない)

●今の仕組み変えなきゃいけない。

● cronのタイムラグ。サイズが大きくなると差分だけ欲しい。差分と言えばrsync?●今の需要なら受信した側も差分だけで良いパターンがほと

んどだけど、そこまで考慮したプログラム組むの面倒くさ

い・・・。

Page 15: Fluentd casual

これらの問題を踏まえてfluentdの良い所

●設定が柔軟

●プラグインが豊富

(out系は主要なデータストア向けがほぼ出揃った。)

●既存のログシステムに影響を与えずに新たなログ収集・解析が出来る

(主にin_tailを使えばね)

●大規模で使われている安心感(cookpadさん,NHNさん)

●開発が活発(本体&プラグイン共に)

●運用サーバはRHEL系がメインなのでtd-agent使うと構築も捗る

●必要なプラグインを作るのが容易らしい(僕はまだ作っていないですが・・・・)

Page 16: Fluentd casual

設定例

もしローカル上のログを読んで、別ディレクトリに吐き出す場合。

LogFormat "%{X-Forwarded-For}i %h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥" %D" combined

のapacheログを読んで、それをfluentdで構造化して別のディレクトリに吐いてみる。

Page 17: Fluentd casual

設定例

#読み込む設定<source>type tailformat /^(?<XFF-host>[^ ]*) (?<host>[^ ]*) [^ ]* (?<user>[^ ]*) ¥[(?<TIME>[^¥]]*)¥] "(?<method>¥S+)(?:

+(?<path>[^ ]*) +¥S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^¥"]*)" "(?<agent>[^¥"]*)" (?<response_time>[^ ]*))?$/

path /var/log/httpd/access_logtag apache.accesspos_file /var/log/td-agent/tmp/access.log.pos

</source>

#書き込む設定<match *.**>type filetime_slice_format %Y_%m_%dcompress gzippath /var/log/td-agent/access_log

</match>

Page 18: Fluentd casual

今使っている話。

Page 19: Fluentd casual

fluentdを導入した今の構成

Page 20: Fluentd casual

補足

収集サーバ+中間サーバ+集計サーバ

なんでこの構成?

中間サーバの必要性

収集サーバ側fluentdプロセスのイレギュラー状況を避ける為に中間で「必ず」受信出来る構成を取る為

中間サーバでの負荷分散

集計サーバが一個で良い理由は今そのレベルだから。

Page 21: Fluentd casual

ざっくり今の内部概要

Page 22: Fluentd casual

導入・運用していて困った事とか。

●不具合はあった。

シンボリックリンク読むと永久ループとかUS-ASCII以外の文字列入るとエラーになるとか、prelinkのせいでrubyが壊れる為の回避設定に一部環境で抜けがあったとか。(全部直ってますよ)

●公式ドキュメント古い!!!!!!&日本語版無い!

●プラグインの情報が散在している。

●性能について

in_forwardで安定して受信出来るのは1プロセス大体10,000message/secが限界だった。(Xeon E5607 2.27GHz)

●プロセス単体では受信性能がCPUコア分スケールしないので、手動マルチプロセスしている。今は3プロセス起動でとりあえず凌いでいる。

Page 23: Fluentd casual

細かいtips的なもの

●Web/App側のconfigは動的生成して管理している。(詳細はこのあと)

●in_tailプラグインを使って読む時に、対象のログ構造を正規表現で記述するので、fluentdで設定する前にperl5.10以降だと名前付き後方参照が出来るので、それでテストしています。

●in_tailは今の所readするログファイルの名前の指定をしないといけない。rotatelogsとかで/access_log.%Y-%m-%dな名前でプロセスが初めからログファイルを作成する場合は、cronでシンボリックリンクを再作成する事で回避。

●forwardで投げる場合、互いの死活監視にudpパケットも投げるので、tcpとudpを許可しないと繋がらない。

●細かい内容をブログに書いて、そのURLをTwitterで「#fluentd」を付けてつぶやくと結構幸せになれた。

Page 24: Fluentd casual

config管理について

Page 25: Fluentd casual

各サーバ用のconfig配布方法

Page 26: Fluentd casual

Configを動的生成する理由

●各ホスト毎に個別の値を持つ設定を付与する為、 configをPSGIで動的生成している。

(exミドルウェア名.ミドルウェア内のタグ.サービス名.IPアドレス

tag: apache.access.web_A.192.168.220.101

●負荷分散で受信する側のプロセスを複数起動しているので、サーバ

毎にメインで送信する先のportを分けている。

●例の様な値を設定したい時とかに、いちいちサーバ毎のconfig書きたくないし、chefとか(大人の事情で)入れられないのでいちいちscpで配布とかしか出来ない環境なので嫌だ。

Page 27: Fluentd casual

なので

●チロッと書くには楽だったのでplack使っている。fluentdがrubyだからsinatraとかも良いかもね。

●configの内容はblogとかに書いているので、適当に読んで貰えれば。

●include rbとかでruby実行して動的生成されたconfig読み込みが今後出来ると更に捗るかも。

Page 28: Fluentd casual

個人的な展望

●fluentd-plugin-mongoを利用して、datacounterだけでは計測出来ない細かい解析をしていきたい。

●もっと詳細なログ情報を集約・視覚化する事でシステム運用

に役立てたいというか楽したい。

●もっとビジネス的に意味のある数値をリアルタイムに可視化

したい。

●グラフの数を増やす時にCactiだと死ねるので、新しいグラフツールの導入(GrowthForecast とか)。

Page 29: Fluentd casual

まとめ

fluentdはとてもいい!!

とりあえず影響が出ない様に小規模な所からサラッとやってみる。

細かい設定とかは直接質問して貰えれば。

ご清聴ありがとうございました。