fluentd を利用した大規模ウェブサービスの     ロギング           cookpad  id:secondlife / @hotchpotch
提供
• id:secondlife• @hotchpotch• 舘野祐一 / Yuichi Tateno• Shibuya.js 発起人• Asakusa.rb 所属• fluentd コミッタ̶• BiS, ももいろクローバーZ
仕事•COOKPAD 開発基盤部所属•サービス開発をしやすく=ユーザに価値を届けやすく•Ruby/Rails のバージョン上げる•ミドルウェアの導入/ライブラリの実装•テスト / CI•デプロイの仕組み
なぜロギング?
なぜロギング?
なぜロギング?価値   検証
なぜロギング?価値   検証
なぜロギング?    現行いまいち   検証に時間がかかる価値     =     検証ユーザに価値を届けるのが遅れる    解決すべき仕事
COOKPAD
COOKPAD1,500万 UU   (pc のみ)110万レシピ
ロギング     それPV   以外
PVログ•巨大なデータ•MySQL•利用方法 •バッチで一時集計 •中間テーブルに保存
PVログ•巨大なデータ•MySQL•利用方法 •バッチで一時集計 •中間テーブルに保存
PVログ + MySQL•オンメモリなら高速 •一日分ならオンメモリ •バッチ用DB二台(メモリ32G)•オンメモリでない •遅い
PVログ + MySQL•保存速度 •blackhole + slave で速い •がそれでも詰まる時が
PVログ + MySQL•データの保持 •巨大・直近のデータしか保持できない •今後スケールしない恐れ•過去ログはバックアップ •即座に利用できない •過去データをサービス開発に利用できない
他のログ•MySQL へ •JSON でシリアライズ •create table
他のログ+MySQL•アプリケーションでたくさん記録 •insert コスト •もっと手軽に取りたいのに!•データ構造 •JSON で入れる -> 集計面倒 •create table -> たくさんテーブル…
悩み•データストレージ •MySQL でない選択肢も •ログをたくさんとっても重くならない•データ構造 •扱いやすいスキーマレス •だけど高速・スケールする
fluentd
fluentd•データストレージ •MySQL でない選択肢も •ログをたくさんとっても重くならない•データ構造 •扱いやすいスキーマレス •だけど高速・スケールする
cookpad での構成
fluentd•構造化ロガー•安定性•パフォーマンス•プラガブル
構造化ロガー前•MySQL だとカラム追加が必要•様々な所に気を使う •サービスを落とさない •バッチのコード•みんなログの情報を追加しない
構造化ロガー後•MySQL だとカラム追加が必要   解決•様々な所に気を使う •サービスを落とさない •バッチのコード•みんなログの情報を追加しない
パフォーマンス•MySQL •insert コスト •blackhole ストレージエンジンでも  ネットワークコストがそこそこ•アプリに気軽にログをしこみすぎると遅 く…
パフォーマンス•fluentd•バッファ + 転送•アプリサーバのローカルに fluentd •定期的に転送 •アプリでの処理時間はほぼ0コスト
パフォーマンス•処理能力•中央の fluentd は1台、1スレッドで 十分処理できてる (m1.large)
安定性•11月下旬から合計100台弱で運用•本体は安定している •一回だけ古いバージョンで自然死•エラーになるのはプラグイン •対策して pull request
安定性•buffered•転送先/保存先が落ちてても再送 •一時的に数分止めても、ちゃんと再送•保存先 mongodb •6時間止めても、ちゃんと保存
プラガブル•さまざまなInput Plugin •tail / TCP / HTTP etc...•さまざまなOutput Plugin •s3 / mongo / td / hdfs ...•Rubyで書ける
fluentd•PV系のLog •MySQL からの移行検討中•その他ロギング全部 •もうすでに移行 •mongodb
cookpad での具体的な利用法
fluentd 構成•すべてのアプリサーバは td-agent •CentOS なので rpm で •td-agent は自前のRuby1.9.2入り •構成管理は puppet  •基本的に設定ファイルは変わらない
<match cookpad.**> type tcp host fluentd-proxy-01 retry_limit 9 <secondary>  host fluentd-proxy-02 </secondary></match>
fluentd 構成•中央の転送用サーバ •Ruby 1.9.2 (RVM) •git で設定ファイル管理 •Gemfileで各種fluentd/plugin利用  •よく変更するため
# Gemfilesource :rubygemsgem "yajl-ruby"gem “bson_ext”gem "fluent-plugin-mongo", :git=>git://git-01/fluent-plugin-mongogem "fl...
$ git pull --rebase$ bundle install$ bundle exec fluentd  -c fluentd.conf  -d fluentd.pid  -o fluentd.log
Rails からの利用class CookpadLogger  class RailsLogger < ::Fluent::Logger::TextLogger    def initialize(rails_logger)      supe...
Rails からの利用class CookpadLogger def self.create_logger(tag = cookpad)   case Rails.env   when production    Fluent::Logger:...
テスト時it “PVログにユーザの アクセスが記録されていること”log = CookpadLogger.pvlog.queue.lastlog[:user_id].should == user.id
ロガーへの実装追加class CookpadLogger module PVLog  def post(tag, data)   super tag, normalize(data)  end  def normalize(data); do_...
Tips•バッファからすぐ処理 •$ pkill -USR1 -f fluentd •flush_interval 1s # 設定に•設定ファイルを再読み込み •$ pkill -HUP -f fluentd •(ただしGemfile/ライブラリ更新時...
嵌ったこと•td-agent の設定ファイルの反映後の再 起動漏れ•初期設定のまま運用してしまった•設定でルーティングにミスっても  エラーにならない•集計時、ちょっと少ないことに気づい て調査 •ngrep で転送されてないサーバが!
こうなったら嬉しいな•fluentd の設定ファイルをもっと柔軟に •今ほぼ全部の plugin を独自 git のレ  ポジトリで管理 •正規表現/フィルター等…•変数等使えないため設定のコピペが…•それ Ruby の DSL で?
ログの重要性•数値は 何が正しいか の指針に •ログを取る、が fluentd で簡単に•きちんと統計を考えられるエンジニア •巨大データ処理 -> Map/Reduce の  出現で簡単に•どのデータに何の価値があり、それを仕 事に結びつけらるか
提供
提供   データを通じて料理をより楽しくしていきたい データマイニングエンジニア   大募集中です!
質問?      提供 MySQL  統計 AWS EMR サービス開発 mongodb RailsRuby パフォーマンスmiyagawa fluentd
Upcoming SlideShare
Loading in...5
×

fluentd を利用した大規模ウェブサービスのロギング

70,815

Published on

Published in: Technology
0 Comments
186 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
70,815
On Slideshare
0
From Embeds
0
Number of Embeds
38
Actions
Shares
0
Downloads
336
Comments
0
Likes
186
Embeds 0
No embeds

No notes for slide

fluentd を利用した大規模ウェブサービスのロギング

  1. 1. fluentd を利用した大規模ウェブサービスの ロギング cookpad id:secondlife / @hotchpotch
  2. 2. 提供
  3. 3. • id:secondlife• @hotchpotch• 舘野祐一 / Yuichi Tateno• Shibuya.js 発起人• Asakusa.rb 所属• fluentd コミッタ̶• BiS, ももいろクローバーZ
  4. 4. 仕事•COOKPAD 開発基盤部所属•サービス開発をしやすく=ユーザに価値を届けやすく•Ruby/Rails のバージョン上げる•ミドルウェアの導入/ライブラリの実装•テスト / CI•デプロイの仕組み
  5. 5. なぜロギング?
  6. 6. なぜロギング?
  7. 7. なぜロギング?価値 検証
  8. 8. なぜロギング?価値 検証
  9. 9. なぜロギング? 現行いまいち 検証に時間がかかる価値 = 検証ユーザに価値を届けるのが遅れる 解決すべき仕事
  10. 10. COOKPAD
  11. 11. COOKPAD1,500万 UU (pc のみ)110万レシピ
  12. 12. ロギング それPV 以外
  13. 13. PVログ•巨大なデータ•MySQL•利用方法 •バッチで一時集計 •中間テーブルに保存
  14. 14. PVログ•巨大なデータ•MySQL•利用方法 •バッチで一時集計 •中間テーブルに保存
  15. 15. PVログ + MySQL•オンメモリなら高速 •一日分ならオンメモリ •バッチ用DB二台(メモリ32G)•オンメモリでない •遅い
  16. 16. PVログ + MySQL•保存速度 •blackhole + slave で速い •がそれでも詰まる時が
  17. 17. PVログ + MySQL•データの保持 •巨大・直近のデータしか保持できない •今後スケールしない恐れ•過去ログはバックアップ •即座に利用できない •過去データをサービス開発に利用できない
  18. 18. 他のログ•MySQL へ •JSON でシリアライズ •create table
  19. 19. 他のログ+MySQL•アプリケーションでたくさん記録 •insert コスト •もっと手軽に取りたいのに!•データ構造 •JSON で入れる -> 集計面倒 •create table -> たくさんテーブル…
  20. 20. 悩み•データストレージ •MySQL でない選択肢も •ログをたくさんとっても重くならない•データ構造 •扱いやすいスキーマレス •だけど高速・スケールする
  21. 21. fluentd
  22. 22. fluentd•データストレージ •MySQL でない選択肢も •ログをたくさんとっても重くならない•データ構造 •扱いやすいスキーマレス •だけど高速・スケールする
  23. 23. cookpad での構成
  24. 24. fluentd•構造化ロガー•安定性•パフォーマンス•プラガブル
  25. 25. 構造化ロガー前•MySQL だとカラム追加が必要•様々な所に気を使う •サービスを落とさない •バッチのコード•みんなログの情報を追加しない
  26. 26. 構造化ロガー後•MySQL だとカラム追加が必要 解決•様々な所に気を使う •サービスを落とさない •バッチのコード•みんなログの情報を追加しない
  27. 27. パフォーマンス•MySQL •insert コスト •blackhole ストレージエンジンでも ネットワークコストがそこそこ•アプリに気軽にログをしこみすぎると遅 く…
  28. 28. パフォーマンス•fluentd•バッファ + 転送•アプリサーバのローカルに fluentd •定期的に転送 •アプリでの処理時間はほぼ0コスト
  29. 29. パフォーマンス•処理能力•中央の fluentd は1台、1スレッドで 十分処理できてる (m1.large)
  30. 30. 安定性•11月下旬から合計100台弱で運用•本体は安定している •一回だけ古いバージョンで自然死•エラーになるのはプラグイン •対策して pull request
  31. 31. 安定性•buffered•転送先/保存先が落ちてても再送 •一時的に数分止めても、ちゃんと再送•保存先 mongodb •6時間止めても、ちゃんと保存
  32. 32. プラガブル•さまざまなInput Plugin •tail / TCP / HTTP etc...•さまざまなOutput Plugin •s3 / mongo / td / hdfs ...•Rubyで書ける
  33. 33. fluentd•PV系のLog •MySQL からの移行検討中•その他ロギング全部 •もうすでに移行 •mongodb
  34. 34. cookpad での具体的な利用法
  35. 35. fluentd 構成•すべてのアプリサーバは td-agent •CentOS なので rpm で •td-agent は自前のRuby1.9.2入り •構成管理は puppet •基本的に設定ファイルは変わらない
  36. 36. <match cookpad.**> type tcp host fluentd-proxy-01 retry_limit 9 <secondary> host fluentd-proxy-02 </secondary></match>
  37. 37. fluentd 構成•中央の転送用サーバ •Ruby 1.9.2 (RVM) •git で設定ファイル管理 •Gemfileで各種fluentd/plugin利用 •よく変更するため
  38. 38. # Gemfilesource :rubygemsgem "yajl-ruby"gem “bson_ext”gem "fluent-plugin-mongo", :git=>git://git-01/fluent-plugin-mongogem "fluentd", 0.10.8# ...
  39. 39. $ git pull --rebase$ bundle install$ bundle exec fluentd -c fluentd.conf -d fluentd.pid -o fluentd.log
  40. 40. Rails からの利用class CookpadLogger  class RailsLogger < ::Fluent::Logger::TextLogger    def initialize(rails_logger)      super()      @rails_logger = rails_logger    end    def post_text(text)      @rails_logger. debug("[CookpadLogger]t" + text)    end  end
  41. 41. Rails からの利用class CookpadLogger def self.create_logger(tag = cookpad) case Rails.env when production Fluent::Logger::FluentLogger.new(tag) when test Fluent::Logger::TestLogger.new else RailsLogger.new(Rails.logger) end end
  42. 42. テスト時it “PVログにユーザの アクセスが記録されていること”log = CookpadLogger.pvlog.queue.lastlog[:user_id].should == user.id
  43. 43. ロガーへの実装追加class CookpadLogger module PVLog def post(tag, data) super tag, normalize(data) end def normalize(data); do_something data; end enddef self.pvlog @@pv_log ||= lambda { logger = create_logger ‘cookpad.pvlog’ logger.extend PVLog }.callend
  44. 44. Tips•バッファからすぐ処理 •$ pkill -USR1 -f fluentd •flush_interval 1s # 設定に•設定ファイルを再読み込み •$ pkill -HUP -f fluentd •(ただしGemfile/ライブラリ更新時は うまくいかない)
  45. 45. 嵌ったこと•td-agent の設定ファイルの反映後の再 起動漏れ•初期設定のまま運用してしまった•設定でルーティングにミスっても エラーにならない•集計時、ちょっと少ないことに気づい て調査 •ngrep で転送されてないサーバが!
  46. 46. こうなったら嬉しいな•fluentd の設定ファイルをもっと柔軟に •今ほぼ全部の plugin を独自 git のレ ポジトリで管理 •正規表現/フィルター等…•変数等使えないため設定のコピペが…•それ Ruby の DSL で?
  47. 47. ログの重要性•数値は 何が正しいか の指針に •ログを取る、が fluentd で簡単に•きちんと統計を考えられるエンジニア •巨大データ処理 -> Map/Reduce の 出現で簡単に•どのデータに何の価値があり、それを仕 事に結びつけらるか
  48. 48. 提供
  49. 49. 提供 データを通じて料理をより楽しくしていきたい データマイニングエンジニア 大募集中です!
  50. 50. 質問? 提供 MySQL 統計 AWS EMR サービス開発 mongodb RailsRuby パフォーマンスmiyagawa fluentd
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×