既存システムへの新技術活用法
  ~fluntd/MongoDB~


  株式会社シーエー・アドバンス
    技術推進グループ
      仲里 淳矢


     Copyright © CA ADvance .inc 2012
自己紹介

•株式会社シーエー・アドバンスの仲里です。(エンジニア歴4年目)
•技術推進グループに所属してます。
•沖縄高専卒です。
•開発環境は主にvim使ってます。
•主な業務内容
  • PHPによる社内管理画面開発(SEM系、GoogleAdwords等)

  • 社内のインフラ整備
     •CentOS6上で動く、ApacheとかMySQLの保守

  • NoSQL推進
     •MongoDB導入
        •社内の既存システムのNoSQL対応(パフォーマンスUpのため)
     •KyotoCabinet導入

  • Fluentdの導入
                                  2
                 Copyright © CA ADvance .inc 2012
アジェンダ

 ①はじめに

 ②fluentd

 ③fluentd導入事例

 ④MongoDB




                             3
            Copyright © CA ADvance .inc 2012
①はじめに




                 4
Copyright © CA ADvance .inc 2012
背景

•なぜ、我々は社内にfluentdを導入したのか

 •ファイルに書き込んだログの目視確認をどうに
  かしたい(不具合発生時) #tail,grepはもう嫌だ>_<

 •ログ解析の簡易化を図りたい

 •そもそも、レガシーなログ取込をどうにかしたい

 •DBに残すようにすればいいのでは、どうする?
                             5
            Copyright © CA ADvance .inc 2012
背景




そうだ、fluentd をいれよう!



                       6
      Copyright © CA ADvance .inc 2012
①fluentd




                 7
Copyright © CA ADvance .inc 2012
fluentdとは

•一言で言うと、ログ取込デーモン
•JSON形式で、いろんなシステムに保存できる!




                             8
            Copyright © CA ADvance .inc 2012
fluentdの特徴
•JSON形式で構造化された状態で保存される
•プラグインを利用して、いろんなシステムから、
 好きなデータ格納先に保存できる(※下図参照)
•安定性が高い

 プラグイン導入で対応                                      これもプラグインで
                                  buffer




{ } { }
   •PHP               •File
   •Ruby              •MySQL
   •Apache            •MongoDB
    [input]   図)ログ取込例 [output]
                               9
              Copyright © CA ADvance .inc 2012
fluentdインストール

※rubyをインストール環境を容易

・fluentdのインストール
# gem install fluentd


・confの生成
# fluentd –-setup /etc/fluetd


                               10
               Copyright © CA ADvance .inc 2012
fluentdインストール




・confの設定
# vim /etc/fluentd/log_server.conf


・起動
# fluentd -c /etc/fluentd/log_server.conf


                               11
               Copyright © CA ADvance .inc 2012
fluentd設定ファイル例




                           12
           Copyright © CA ADvance .inc 2012
③fluentd導入事例




                  13
  Copyright © CA ADvance .inc 2012
fluentd導入事例

•複数のWebサーバーから上がってくる、AP側のログ
データを、ログファイル吐き出しから、fluentd経由で
のMongoDB吐き出しに変えました。

結果、
 ログが一箇所にまとまることができた。
  ⇨不具合発生時に効果を発揮!

 ログ表示画面を作成
  ⇨データ確認や、ユーザーの追跡が容易に!
                              14
              Copyright © CA ADvance .inc 2012
fluentd構成イメージ
•社内インフラの構成
        web01


  PHP           fluentd



                                                             MongoDB


        web02


  PHP           fluentd



                                          15
                          Copyright © CA ADvance .inc 2012
fluentdまとめ

•複数のログデータを一元管理
 •ログの出先を変えたくなったら、設定ファイルを
  変えるだけで対応可能


•言語が違っても向け先を統一できる
 •IN{PHP, Ruby, Apache, etc}
 •OUT{MySQL, MongoDB, Cassandra, Growl, tail, etc}




                                    16
                    Copyright © CA ADvance .inc 2012
fluentdまとめ

•fluentdがバッファを貯めこむ仕組みを保持してい
るため、出力先が落ちてても、ログを貯めこむことが
可能。なので、


         安定性が高い!



                             17
             Copyright © CA ADvance .inc 2012
というわけでみんな
          を入れてみよう!


                  18
  Copyright © CA ADvance .inc 2012
④MongoDB




                19
Copyright © CA ADvance .inc 2012
はじめに(背景)

•社内システムへのfulentd導入にあたり、ログデータ
の出力先をMongoDBにしました。


•今回、MongoDBを取り入れた理由として、(小規模
な)MongoDBの運用を行い、フローを確立した上で、
開発陣のナレッジとして、知識共有し、戦力にできる
か見極めるためです。



                           20
           Copyright © CA ADvance .inc 2012
はじめに(背景)




•その、MongoDBの導入にあたり、自分が調査した
内容について、スライドにまとめてみました。




                           21
           Copyright © CA ADvance .inc 2012
MonoDB とは

• MongoDB は、高パフォーマンス、スキーマレス、オープン
  ソースのドキュメント指向データベースである。


• MongoDB は、BSONというJSONのバイナリ版のような
  形式でドキュメントを表現し、そのコレクションを管理す
  る。この形式は、複雑な階層を持たせることができ、な
  おかつクエリやインデックスが容易である。


MongoDB – Wikipedia
http://ja.wikipedia.org/wiki/MongoDB
                                       22
                       Copyright © CA ADvance .inc 2012
MonoDB の特徴


•   高可用性
    • スレーブが死んでも自動で切り離しできる

•   レプリカ機能
    • 新しいノード接続時、自動でデータの同期もしてくれる!

•   スキーマレス
    • あとでカラムが自由に増やせる。つまり、柔軟に対応可!
      ※バグ出ても気づきにくい



                             23
             Copyright © CA ADvance .inc 2012
MonoDB の特徴


• インデックスのサポート (複数インデックス可)

• オート・シャーディング(スケールアウト)

• Map Reduce(集計処理)

• GridFS(ファイル格納システム)




                             24
             Copyright © CA ADvance .inc 2012
データ構造
•   データ格納例
    DataBase→Collection→Key→Row→Value
    ※MySQLとほぼ一緒




                                  25
                  Copyright © CA ADvance .inc 2012
データ構造
•   MySQLで例えると、
      Collection ≒ Table




                                   26
                   Copyright © CA ADvance .inc 2012
使い方(CLI)


#データ検索
 > db.users.find({}, {a:1,b:1})


#データ登録
 > db.users.insert({a:1,b:1})


#データ削除
 > db.things.remove({_id: myobject._id});

                                27
                Copyright © CA ADvance .inc 2012
SQL と MongoDB の比較
SQL                                           Mongo クエリ言語



CREATE TABLE USERS (a Number, b Number)       暗黙的に行われます



INSERT INTO USERS VALUES(1,1)                 db.users.insert({a:1,b:1})


                                              db.users.find({}, {a:1,b:1})
SELECT a,b FROM users



SELECT * FROM users                           db.users.find()



SELECT * FROM users WHERE age=18              db.users.find({age:18})



SELECT * FROM users WHERE age=18 ORDER BY
                                              db.users.find({age:18}).sort({name:1})
name

SELECT * FROM users WHERE age>18              db.users.find({'age':{$gt:18}})})




                                                   28
                                   Copyright © CA ADvance .inc 2012
クエリ発行


•インデックスの作成や、コレクションのtruncateもできます!
 db.users.ensureIndex({user_id:1});
 db.users.remove();


•Upsertと機能があって、これが地味に便利そう
  •データがあれば、アップデート、なければインサートしてく
   れるみたい



                            29
            Copyright © CA ADvance .inc 2012
MapReduce


• バッチでのデータ処理や集計処理で利用します。

• 基本、入力値として、コレクションを投入し、
  出力値として、コレクションへデータを流します。

• 使いドコロとしては、細かいデータをデイリー・マンスリー
  でまとめたい時、効力を発揮するかも!

• Javascriptで組んでMongoDB に流しこむイメージです。


                            30
            Copyright © CA ADvance .inc 2012
サンプルプログラム 1/2




                          31
          Copyright © CA ADvance .inc 2012
サンプルプログラム 2/2




                          32
          Copyright © CA ADvance .inc 2012
サンプルプログラム(出力結果)




                        33
        Copyright © CA ADvance .inc 2012
まとめ


• 耐障害性が高く、自動でレプリカへの同期も
  やってくれるので、スケールアウトが容易

• スキーマレスでメンテも楽!

• 集計したい時は、MapReduceを使おう

• MongoDBDateハマりやすい


                          34
          Copyright © CA ADvance .inc 2012
ご清聴ありがとうございました。




                    35
    Copyright © CA ADvance .inc 2012

既存システムへの新技術活用法 ~fluntd/MongoDB~