SlideShare une entreprise Scribd logo
1  sur  17
~ M O N G O D B 使 っ ち ゃ う ぞ ! ~
(Nginx+)Fluentd+MongoDB
&Groovy+MongoDB
目次
1. Fluentdって?
2. wajaでの採用理由
3. Nginx+Fluentd+MongoDB設定
4. 使えそうなシチュエーション
5. Groovyって?
6. Groovy+MongoDB
1. Fluentdって?
 Open Source Log Management
 日本人開発者 & Ruby(コアはC, thin Ruby wrapper)
 インプット、アウトプットをつなぐ「パイプ」
 ログの入出力が一番分かりやすい使い方だったのでしょう
 JSON
 プラグインメカニズム
 入力
 ファイル、ストリーム、etc…
 出力
 ファイル、メール、ストリーム、DB、etc…
2. wajaでの採用理由
 ログ解析の要望
 Analyticsだけでは知ることが難しい(設定が複雑になる)タイプ
 商品一覧ページから商品詳細ページへの遷移数(APサーバ毎)
 調査の効率化
 毎回毎回ログファイルにgrep/awk。。。
 解析対象のログファイルをDBに入れられたら、、
 専用アプリ作るための工数。。
 現行のPostgreSQL(というかDBサーバ)は使いたくない
 全部まるっとすべて一気に解決!
3. Nginx+Fluentd+MongoDB
Nginx
Fluentd
Tomcat
Nginx
Fluentd
Tomcat
Fluentd
MongoDB
wajaweb01
wajaweb02
wajalog01
Fluentd(wajaweb01, wajaweb02)
- Nginxのログファイルをtail監視(入力)
- wajalog01のFluentdにストリーム転送(出力)
Fluentd(wajalog01)
- ストリームから入力
- MongoDBに出力
MongoDB
- 要求に従って書込
3. Nginx+Fluentd+MongoDB
 Nginx
 取りたいログを追加するのみ
 $remote_addr, $remote_user, $time_local, $request, $status,
$body_bytes_sent, $http_referer, $http_user_agent,
$request_time
 $http_x_forwarded_for ※リバースプロキシ(ロードバランサ)環境
 $upstream_addr ※どのAPサーバに処理を振ったか
 $upstream_response_time ※APサーバからの応答時間
 $cookie_JSESSIONID ※COOKIEのセッションID
3. Nginx+Fluentd+MongoDB
 Fluentd(wajaweb01, wajaweb02)
<source>
type tail
path /var/log/nginx/waja.access.log
format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) [(?<time>[^]]*)]
“(?<method>S+)(?: +(?<path>[^ ]*) +S*)?” (?<status>[^ ]*) … (中略)/
time_format %d/%b/%Y:%H:%M:%S %z
tag nginx.waja.access
pos_file /var/log/td-agent/nginx.waja.access.pos
</source>
(ログファイル分設定)
<match nginx.**>
type forward
buffer_chunk_limit 10m
<server>
host wajalog01
</server>
</match>
入力
出力
3. Nginx+Fluentd+MongoDB
 Fluentd(wajalog01)
<source>
type forward
port 24224
</source>
<match nginx.**>
type mongo
host localhost
database nginx
tag_mapped
remove_tag_prefix nginx.
flush_interval 10s
buffer_chunk_limit 10m
</match>
入力
出力
3. Nginx+Fluentd+MongoDB
 MongoDB
$ mongo
MongoDB shell version: 2.4.4
connecting to: test
> show dbs
admin (empty)
local 0.078125GB
nginx 19.9443359375GB
> use nginx
switched to db nginx
> show tables
reason.access
ssl.waja.access
system.indexes
waja.access
3. Nginx+Fluentd+MongoDB
 まとめ
 FluentdがJSONベースなので、MongoDBとの親和性が高い
 というかプラグイン任せなのですが。。
 MongoDBがスキーマレス
 MongoDBの設定(スキーマ定義など)は何もしていない。
 取りたいログ属性を増やしたい場合、Nginx、Fluentdの設定変更のみ
 MongoDBがシャーディング
 解析処理をハードに行うようになった場合
 ログがどんどん増えた場合
 Capped Collectionを使う、という選択肢もあり
 総じて「カンタン」
4. 使えそうなシチュエーション
 とにかくログを突っ込みまくる
 Tomcat, PostgreSQLのログだって入れちゃえる
 きっと誰かプラグインを書いてるのでは。。正規表現頑張りたくない。。
 ログデータを一括管理することで、調査を簡易化
 MongoDBをキャッシュサーバに
 オンメモリや、ファイル、memcachedなどの代替
5. Groovyって?
 Javaを拡張する言語
 Javaの痒いところに手が届く感じ
 スクリプトとしても使える
 Closure, AST, 型推論などの仕組み
 より「簡潔に」Javaが書ける
5. Groovyって?
 ある日付を設定したい by Java
 キィィィィーーーーーーーーーーーーーーーー!
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, 1); // 2月
cal.set(Calendar.DATE, 15);
cal.set(Calendar.HOUR_OF_DAY, 13);
cal.set(Calendar.MINUTE, 27);
cal.set(Calendar.SECOND, 30);
cal.set(Calendar.MILLISECOND, 999);
cal.add(Calendar.DATE, 2); // 2日後
Date plus2 = cal.getTime();
5. Groovyって?
 ある日付を設定したい by Groovy
 ス、スッキリーー!
Calendar cal = Calendar.getInstance()
cal.with {
set(YEAR, 2013)
set(MONTH, FEBRUALY) // 2月
set(DATE, 15)
set(HOUR_OF_DAY, 13)
set(MINUTE, 27)
set(SECOND, 30)
set(MILLISECOND, 999)
}
def now = new Date()
def plus2 = now + 2
6. Groovy+MongoDB
 DBと接続
def mongo = new Mongo("localhost", 27017)
def db = mongo.getDB("crawler")
def collection = db.getCollection("sites")
6. Groovy+MongoDB
 ドキュメントを挿入
def doc = [
url: "org.mongodb",
tags:
["database", "open-source"],
attrs: [
["lastAccess", new Date()],
["pingtime", 20]
]
] as BasicDBObject
collection.insert(doc)
6. Groovy+MongoDB
 ドキュメントを表示
collection.find().each { obj ->
println "objs : " + obj
}

Contenu connexe

Tendances

HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会Jxck Jxck
 
歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追うwilfrem
 
Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Misao X
 
Seurity Camp Award 2016
Seurity Camp Award 2016 Seurity Camp Award 2016
Seurity Camp Award 2016 slankdev
 
20151029 ヒカラボ講演資料
20151029 ヒカラボ講演資料20151029 ヒカラボ講演資料
20151029 ヒカラボ講演資料Daisuke Ando
 
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」shigeyuki azuchi
 
nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスKazuhiro Nishiyama
 
LibPGEN 1st Step Guide
LibPGEN 1st Step GuideLibPGEN 1st Step Guide
LibPGEN 1st Step Guideslankdev
 
PHPerのためのpostgresqlチューニングmini
PHPerのためのpostgresqlチューニングminiPHPerのためのpostgresqlチューニングmini
PHPerのためのpostgresqlチューニングminiTakhisa Hirokawa
 
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料slankdev
 
IETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUICIETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUICKaoru Maeda
 
120418 tokyo node5_lin_qonnodejs
120418 tokyo node5_lin_qonnodejs120418 tokyo node5_lin_qonnodejs
120418 tokyo node5_lin_qonnodejsTakayoshi Tanaka
 
最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策Kensaku Komatsu
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
CSRを自動生成する!
CSRを自動生成する!CSRを自動生成する!
CSRを自動生成する!Taichi Ishitani
 
Richard high performance fuzzing ja
Richard  high performance fuzzing jaRichard  high performance fuzzing ja
Richard high performance fuzzing jaPacSecJP
 

Tendances (20)

HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会HTTP2 RFC 発行記念祝賀会
HTTP2 RFC 発行記念祝賀会
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う
 
Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話
 
Seurity Camp Award 2016
Seurity Camp Award 2016 Seurity Camp Award 2016
Seurity Camp Award 2016
 
Fluentdの使い方
Fluentdの使い方Fluentdの使い方
Fluentdの使い方
 
20151029 ヒカラボ講演資料
20151029 ヒカラボ講演資料20151029 ヒカラボ講演資料
20151029 ヒカラボ講演資料
 
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」
福岡ブロックチェーンエコノミー勉強会Vol.3「Segregated Witness」
 
nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティス
 
LibPGEN 1st Step Guide
LibPGEN 1st Step GuideLibPGEN 1st Step Guide
LibPGEN 1st Step Guide
 
PHPerのためのpostgresqlチューニングmini
PHPerのためのpostgresqlチューニングminiPHPerのためのpostgresqlチューニングmini
PHPerのためのpostgresqlチューニングmini
 
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
 
IETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUICIETF93 Prague報告Web関連+QUIC
IETF93 Prague報告Web関連+QUIC
 
120418 tokyo node5_lin_qonnodejs
120418 tokyo node5_lin_qonnodejs120418 tokyo node5_lin_qonnodejs
120418 tokyo node5_lin_qonnodejs
 
最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策最新Webプロトコル傾向と対策
最新Webプロトコル傾向と対策
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
CSRを自動生成する!
CSRを自動生成する!CSRを自動生成する!
CSRを自動生成する!
 
Richard high performance fuzzing ja
Richard  high performance fuzzing jaRichard  high performance fuzzing ja
Richard high performance fuzzing ja
 

En vedette

Using MongoDB With Groovy
Using MongoDB With GroovyUsing MongoDB With Groovy
Using MongoDB With GroovyJames Williams
 
Fluentdで本番環境を再現
Fluentdで本番環境を再現Fluentdで本番環境を再現
Fluentdで本番環境を再現Hiroshi Toyama
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkTakanori Suzuki
 
Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門AdvancedTechNight
 
HTTPとサーバ技術の最新動向
HTTPとサーバ技術の最新動向HTTPとサーバ技術の最新動向
HTTPとサーバ技術の最新動向Kazuho Oku
 

En vedette (6)

Using MongoDB With Groovy
Using MongoDB With GroovyUsing MongoDB With Groovy
Using MongoDB With Groovy
 
Fluentdで本番環境を再現
Fluentdで本番環境を再現Fluentdで本番環境を再現
Fluentdで本番環境を再現
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache Flink
 
Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門
 
HTTPとサーバ技術の最新動向
HTTPとサーバ技術の最新動向HTTPとサーバ技術の最新動向
HTTPとサーバ技術の最新動向
 
Flink vs. Spark
Flink vs. SparkFlink vs. Spark
Flink vs. Spark
 

Similaire à Fluentd+MongoDB+Groovy

Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察貴仁 大和屋
 
mongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springmongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springichikaway
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ Daisuke Ikeda
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LTインフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LTDaisuke Ikeda
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例知教 本間
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Daisuke Kikuchi
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitSeiya Mizuno
 
Osc2012.dbに行ってきました
Osc2012.dbに行ってきましたOsc2012.dbに行ってきました
Osc2012.dbに行ってきましたMasaru Kobashigawa
 
関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側Gosuke Miyashita
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_FdwKohei KaiGai
 
OrientDBのご紹介 OSC2014 Tokyo/Fall LT
OrientDBのご紹介 OSC2014 Tokyo/Fall LTOrientDBのご紹介 OSC2014 Tokyo/Fall LT
OrientDBのご紹介 OSC2014 Tokyo/Fall LTKazunobu Yamaguchi
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~じゅん なかざ
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門irix_jp
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語GoYoshifumi Yamaguchi
 
Casual Compression on MongoDB
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDBmoai kids
 
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuriYoshifumi Yamaguchi
 

Similaire à Fluentd+MongoDB+Groovy (20)

Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
mongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springmongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 spring
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LTインフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
Osc2012.dbに行ってきました
Osc2012.dbに行ってきましたOsc2012.dbに行ってきました
Osc2012.dbに行ってきました
 
関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw
 
OrientDBのご紹介 OSC2014 Tokyo/Fall LT
OrientDBのご紹介 OSC2014 Tokyo/Fall LTOrientDBのご紹介 OSC2014 Tokyo/Fall LT
OrientDBのご紹介 OSC2014 Tokyo/Fall LT
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
 
Casual Compression on MongoDB
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDB
 
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
 
Goをえらんだ理由
Goをえらんだ理由Goをえらんだ理由
Goをえらんだ理由
 

Fluentd+MongoDB+Groovy

  • 1. ~ M O N G O D B 使 っ ち ゃ う ぞ ! ~ (Nginx+)Fluentd+MongoDB &Groovy+MongoDB
  • 2. 目次 1. Fluentdって? 2. wajaでの採用理由 3. Nginx+Fluentd+MongoDB設定 4. 使えそうなシチュエーション 5. Groovyって? 6. Groovy+MongoDB
  • 3. 1. Fluentdって?  Open Source Log Management  日本人開発者 & Ruby(コアはC, thin Ruby wrapper)  インプット、アウトプットをつなぐ「パイプ」  ログの入出力が一番分かりやすい使い方だったのでしょう  JSON  プラグインメカニズム  入力  ファイル、ストリーム、etc…  出力  ファイル、メール、ストリーム、DB、etc…
  • 4. 2. wajaでの採用理由  ログ解析の要望  Analyticsだけでは知ることが難しい(設定が複雑になる)タイプ  商品一覧ページから商品詳細ページへの遷移数(APサーバ毎)  調査の効率化  毎回毎回ログファイルにgrep/awk。。。  解析対象のログファイルをDBに入れられたら、、  専用アプリ作るための工数。。  現行のPostgreSQL(というかDBサーバ)は使いたくない  全部まるっとすべて一気に解決!
  • 5. 3. Nginx+Fluentd+MongoDB Nginx Fluentd Tomcat Nginx Fluentd Tomcat Fluentd MongoDB wajaweb01 wajaweb02 wajalog01 Fluentd(wajaweb01, wajaweb02) - Nginxのログファイルをtail監視(入力) - wajalog01のFluentdにストリーム転送(出力) Fluentd(wajalog01) - ストリームから入力 - MongoDBに出力 MongoDB - 要求に従って書込
  • 6. 3. Nginx+Fluentd+MongoDB  Nginx  取りたいログを追加するのみ  $remote_addr, $remote_user, $time_local, $request, $status, $body_bytes_sent, $http_referer, $http_user_agent, $request_time  $http_x_forwarded_for ※リバースプロキシ(ロードバランサ)環境  $upstream_addr ※どのAPサーバに処理を振ったか  $upstream_response_time ※APサーバからの応答時間  $cookie_JSESSIONID ※COOKIEのセッションID
  • 7. 3. Nginx+Fluentd+MongoDB  Fluentd(wajaweb01, wajaweb02) <source> type tail path /var/log/nginx/waja.access.log format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) [(?<time>[^]]*)] “(?<method>S+)(?: +(?<path>[^ ]*) +S*)?” (?<status>[^ ]*) … (中略)/ time_format %d/%b/%Y:%H:%M:%S %z tag nginx.waja.access pos_file /var/log/td-agent/nginx.waja.access.pos </source> (ログファイル分設定) <match nginx.**> type forward buffer_chunk_limit 10m <server> host wajalog01 </server> </match> 入力 出力
  • 8. 3. Nginx+Fluentd+MongoDB  Fluentd(wajalog01) <source> type forward port 24224 </source> <match nginx.**> type mongo host localhost database nginx tag_mapped remove_tag_prefix nginx. flush_interval 10s buffer_chunk_limit 10m </match> 入力 出力
  • 9. 3. Nginx+Fluentd+MongoDB  MongoDB $ mongo MongoDB shell version: 2.4.4 connecting to: test > show dbs admin (empty) local 0.078125GB nginx 19.9443359375GB > use nginx switched to db nginx > show tables reason.access ssl.waja.access system.indexes waja.access
  • 10. 3. Nginx+Fluentd+MongoDB  まとめ  FluentdがJSONベースなので、MongoDBとの親和性が高い  というかプラグイン任せなのですが。。  MongoDBがスキーマレス  MongoDBの設定(スキーマ定義など)は何もしていない。  取りたいログ属性を増やしたい場合、Nginx、Fluentdの設定変更のみ  MongoDBがシャーディング  解析処理をハードに行うようになった場合  ログがどんどん増えた場合  Capped Collectionを使う、という選択肢もあり  総じて「カンタン」
  • 11. 4. 使えそうなシチュエーション  とにかくログを突っ込みまくる  Tomcat, PostgreSQLのログだって入れちゃえる  きっと誰かプラグインを書いてるのでは。。正規表現頑張りたくない。。  ログデータを一括管理することで、調査を簡易化  MongoDBをキャッシュサーバに  オンメモリや、ファイル、memcachedなどの代替
  • 12. 5. Groovyって?  Javaを拡張する言語  Javaの痒いところに手が届く感じ  スクリプトとしても使える  Closure, AST, 型推論などの仕組み  より「簡潔に」Javaが書ける
  • 13. 5. Groovyって?  ある日付を設定したい by Java  キィィィィーーーーーーーーーーーーーーーー! Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2013); cal.set(Calendar.MONTH, 1); // 2月 cal.set(Calendar.DATE, 15); cal.set(Calendar.HOUR_OF_DAY, 13); cal.set(Calendar.MINUTE, 27); cal.set(Calendar.SECOND, 30); cal.set(Calendar.MILLISECOND, 999); cal.add(Calendar.DATE, 2); // 2日後 Date plus2 = cal.getTime();
  • 14. 5. Groovyって?  ある日付を設定したい by Groovy  ス、スッキリーー! Calendar cal = Calendar.getInstance() cal.with { set(YEAR, 2013) set(MONTH, FEBRUALY) // 2月 set(DATE, 15) set(HOUR_OF_DAY, 13) set(MINUTE, 27) set(SECOND, 30) set(MILLISECOND, 999) } def now = new Date() def plus2 = now + 2
  • 15. 6. Groovy+MongoDB  DBと接続 def mongo = new Mongo("localhost", 27017) def db = mongo.getDB("crawler") def collection = db.getCollection("sites")
  • 16. 6. Groovy+MongoDB  ドキュメントを挿入 def doc = [ url: "org.mongodb", tags: ["database", "open-source"], attrs: [ ["lastAccess", new Date()], ["pingtime", 20] ] ] as BasicDBObject collection.insert(doc)