SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Downloaden Sie, um offline zu lesen
Introduction to
   MongoDB
   @just_do_neet




                   1
Today’s Agenda
今日のお題目


 •MongoDBの一般的な解説

 •向いてそうな適用範囲

 •ソーシャルゲームとMongoDB(資料紹介のみ)

 •まとめ




                             2
MongoDBの一般的な解説




                 3
MongoDB
Mongoは「でっかい」という意味らしいです




http://www.mongodb.org/



                          http://www.mongodb.jp/


•10gen社が主体として開発しているオープンソース
 所謂「NoSQL」の一つ
                                                   4
Features
よく言われるMongoDBの特徴


 •ドキュメント指向なデータベース

 •スケーラブルなデータベース




                    5
Document Oriented
ドキュメント指向の概念


 •ある一定のフォーマットにてエンコードされた
  データをひとつの「ドキュメント」として扱う。

    •フォーマット:XML、YAML、BSON、etc.

 •ドキュメントは一般的に構造化データの形式を取
  ることが多い。

 • “The central concept of a document-oriented database is the notion of a
   Document. While each document-oriented database implementation
   differs on the details of this definition, in general, they all assume
   documents encapsulate and encode data (or information) in some
   standard format(s) (or encoding(s)).”
    http://en.wikipedia.org/wiki/Document-oriented_database

                                                                             6
Document Oriented
ドキュメント指向の概念


 •MongoDBはドキュメントを「BSON」形式で扱
 う。http://bsonspec.org/

 •一つの入れ物(collection)の中には、BSONフォー
 マットであれば異なる構造のデータでも入れる事
 ができる。
 →スキーマレス
 →柔軟な構造のデータベース




                                   7
Document on MongoDB
MongoDBの中でのデータ


> db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"})
> db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"})
> db.musicians.save({name : "Pat Metheny" , country : "US" , awards :
{ name : "grammy", count:19}})
>
> db.musicians.find()
{ "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada",
"age" : 60, "genre" : "fork" }
{ "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz",
"menbers" : 4, "companey" : "Road & Sky" }
{ "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny",
"country" : "US", "awards" : { "name" : "grammy", "count" : 19 } }




                                                                            8
Document on MongoDB
MongoDBの中でのデータ


> db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"})
> db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"})
> db.musicians.save({name : "Pat Metheny" , country : "US" , awards :
{ name : "grammy", count:19}})
>
> db.musicians.find()
{ 各ドキュメントの構造は同じでなくても良い Sada",
  "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi
"age" : 60, "genre" : "fork" }
{ "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz",
"menbers" : 4, "companey" : "Road & Sky" }
{ "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny",
"country" : "US", "awards" : { "name" : "grammy", "count" : 19 } }




                                                                            9
Document on MongoDB
MongoDBの中でのデータ


> db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"})
> db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"})
> db.musicians.save({name : "Pat Metheny" , country : "US" ,
awards : { name : "grammy", count:19}})
>
> db.musicians.find()
{ ドキュメントの中に階層的なデータを入れるこ
  "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada",
"age" : 60, "genre" : "fork" }
{ とができる。
  "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz",
"menbers" : 4, "companey" : "Road & Sky" }
{ "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny",
"country" : "US", "awards" : { "name" : "grammy", "count" : 19 } }




                                                                            10
Document on MongoDB
MongoDBの中でのデータ


> db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"})
> db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"})
> db.musicians.save({name : "Pat Metheny" , country : "US" , awards :
{ name : "grammy", count:19}})
>
> db.musicians.find()
{ "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada",
"age" : 60, "genre" : "fork" }
{ "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz",
"menbers" : 4, "companey" : "Road & Sky" }
{ "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny",
"country" : "US", "awards" : { "name" : "grammy", "count" : 19 } }


   各ドキュメントには必ず一意のIDが割り振られ
 る。デフォルトはMongo独自のID(ObjectID)
  明示的に指定も可。
                                                                            11
Document on MongoDB
MongoDBの中でのデータ


> db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"})
> db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"})
> db.musicians.save({name : "Pat Metheny" , country : "US" , awards :
{ name : "grammy", count:19}})
>
> db.musicians.ensureIndex({name : 1})
> db.musicians.getIndices()
[
	 {"v" : 1,"key" : {"_id" : 1},"ns" : "music.musicians","name" : "_id_"},
	 {"v" : 1,"key" : {"name" : 1},"ns" : "music.musicians","name" : "name_1"}
]
>


  任意のフィールドにインデックスを貼ることが
 できる。(B-Tree)

                                                                              12
Document on MongoDB
MongoDBの中でのデータ


 •入れ物の中に、異なる構造のデータを格納するこ
  とができる(スキーマレス)

 •階層構造を持つデータを格納することができる。

 •かつ、RDBに近い操作性を持っている。




                           13
Scalability
MongoDBにおけるスケーラビリティ


•Replica Set(High Availability)

•Sharding(Horizontal Scaling)




            http://www.mongodb.org/display/DOCS/Introduction

                                                               14
Scalability
MongoDBにおけるスケーラビリティ


•Replica Set(High Availability)

•Sharding(Horizontal Scaling)




   Replica Setは同一のデータを複数インスタンス
  で管理することでHA構成を実現するもの。
  1 Replica Setあたり最低3台が必要。

            http://www.mongodb.org/display/DOCS/Introduction

                                                               15
Scalability
MongoDBにおけるスケーラビリティ


•Replica Set(High Availability)

•Sharding(Horizontal Scaling)




   Shardingはデータを複数クラスターで分散配置
  させるための仕組み。
  (≒マルチマスタ化)

            http://www.mongodb.org/display/DOCS/Introduction

                                                               16
Scalability
MongoDBにおけるスケーラビリティ


 •標準機能としてReplica Set / Sharding機能が備
  わっている。

 •カタログスペック上は手軽にHA構成、水平
  sharding構成を組むことができる。

 •実際はshard間のデータ偏り調整など運用にコツ
  がいる




                                      17
Other Features
その他の特徴的な機能


 •GridFS

   •大きいサイズのファイルを扱うための仕組み

 •地理空間インデックス

   •緯度経度検索

 •Capped Collection

   •固定サイズの入れ物。サイズを超えたら古いも
    のから自動的に削除される。

                            18
Cons.
MongoDBの欠点(主観含む)


 •トランザクション未サポート

   •トランザクションは甘え (ドヤァ

 •Global Lock(2.2からCollection Lockに?)

 •システムリソースが肥大化(メモリ、ディスク)

 •データ圧縮未対応(通信、データストア共)

 •セキュリティ周りが弱い etc.


                                        19
Cons.
MongoDBの欠点(主観含む)


 •厳密なトランザクション処理が必要なシステムに
  は向かない。(課金、会員管理など...)

 •書き込み過多なシステムには基本向かない。

 •Big Dataを扱う環境には向かない。

   •スケールするが故に、下手にそれなりの規模の
    システムに導入するとサーバー無限増殖の刑
    に...


                            20
Ref. PFI Tech. White Paper
参考:PFI Technical White Paper




                                                            (P.17)




  http://preferred.jp/wp-content/uploads/2012/03/PFIwhitepaper.pdf




                                                                     21
Compress vs Not Compress
圧縮:非圧縮のデータサイズの差


 •下記例は同一フォーマットの文字列データを格納
 した際の比較(MongoDB / HBase)

 •MongoDBはHBase(snappy圧縮時)の三倍強。
 700000000                            MongoDB
 600000000                            MongoDB(fragment)
 500000000                            HBase
                                      HBase(fragment)
 400000000                            HBase(snappy)
 300000000
 200000000
 100000000
         0
             size(1,000,000 record)


                                                          22
Summary
ここまでのまとめ


 •ドキュメント指向DB。異なる構造や複雑な構造
 のデータを扱える。検索機能も強力。

 •HA機能、Sharding機能を標準的に持っている。

 •トランザクションは甘え。

 •富豪的な作りのミドルウェアなので使用するリ
 ソースの多さに起因する課題があるので注意。




                               23
向いてそうな適用範囲




             24
Suitable Cases
向いてそうな使い方(主観)


 •(注)下記以外にも適切な使い方はたくさんある
 と思うので皆さんも考えてください。

 1.RDBやKVSでは表現しきれない複雑な構成の
 データを扱う。

 2.一時的なログ集計、ログ管理。データ集計基
 盤。

 3.プロトタイピング用の環境。


                            25
#1 Complex Data
複雑な構成のデータ


 •既存のRDBやKVSでは扱いづらいデータ。

  •RDBは複数の構造(schema)のデータをひとつ
   の入れ物(table)に入れて扱いづらい

  •KVSは自由度が高いが、Valueの検索が難し
   い。

 •複数の構造のデータをひとつの入れ物に入れて、
 検索性も高めるためにはどうすれば?


                               26
#1 Complex Data
複雑な構成のデータ


 •例:ソーシャルサービスのActivity Feed




    http://photoalbum.naver.jp/


                                  27
#1 Complex Data
複雑な構成のデータ


 •例:ソーシャルサービスのActivity Feed

                    •Activityごとにデータ構
                    造が違う。
                    (コメント、like 、写真 etc...)




                                             28
#1 Complex Data
複雑な構成のデータ


 •例:ソーシャルサービスのActivity Feed

                    •ひとつのActivityの中に
                    複数のアイテムが存在す
                    るケースがある。




                                       29
#1 Complex Data
複雑な構成のデータ


 •例:ソーシャルサービスのActivity Feed

                    •Activityに含まれるアイ
                    テム(写真など)を個別
                    に検索する必要がある。
                    (データの消し込みなど)




                                       30
#1 Complex Data
複雑な構成のデータ


 •RDBでモデリングした場合




 •Oops...


                  31
#1 Complex Data
複雑な構成のデータ


 •KVSでモデリング?した場合




 •Valueの検索に課題


                   32
MongoDB Can Do It!
MongoDBならできるよ!


 •そこでMongoDBですよ。

 •スキーマレスなので...

   •複数のフォーマットのActivityをひとつの入れ
    物に詰め込める。

   •かつ検索性能も落とさずに済む。




                                33
Delete Photo(Column)
 例:写真の削除




#lookup photo
db.activity.find({feedList.feedData.photoList, photoId})
#delete photo
db.activity.remove({feedList.feedId, feedId})
#re-insert timeline data
db.activity.insert(newFeedData)
                                                          34
Delete Album(Row)
 例:アルバムの削除




#lookup album
db.activity.find({feedList.feedData.albumList.albumId,
alubmId})
#delete album
db.activity.remove({feedList.feedId, feedId})


                                                        35
Dot Notation
 dot notation記法による階層の深いデータの検索


  •MongoDBはdot notationという記法で階層の深い
   データの検索が可能。
   (db.hoge.find({a.b.c.d.e : 1}) のような形が可)


  •インデックスを貼ることも可能。

#lookup album
db.activity.find({feedList.feedData.albumList.albumI
d, alubmId})
#delete album
db.activity.remove({feedList.feedId, feedId})


                                                      36
#1 Summary
#1 ここまでのまとめ


 •複雑な構造のデータを検索性を落とさずに使うに
  はMongoDBは向いている。

   •ただし先に紹介したような設計にするとデータ
    が肥大化しがちなので注意。

   •参照・更新のスループットを落とさないために
    はデータ・インデックスをオンメモリで乗るサ
    イズに収めるのが前提。



                            37
#2 Storing Logs
ログファイルの保存先としてのMongoDB


 •ログファイルは多くの場合非構造・スキーマレス
  で保存されている。

   •ただ保存するだけでなく、ログの検索や集計を
    手軽に行いたい

   •RDBなどスキーマを厳密に定義した入れ物はあ
    まり向かない。
    →MongoDB!



                             38
Advanced Queries
MongoDBの高度なクエリー


 •MongoDBはNoSQLと言われる群の中では検索・
  集計クエリーの機能が           っているのが特徴。

   •count()

   •group()

   •MapReduce

   •正規表現

   •Aggregation Framework


                                   39
Queries : count()
  count() 文


    •条件に合致する件数を返す。SQLのcount文とだ
      いたい同じ。




> db.accesslogs.find({method : 'GET', code: '200'}).count()
6644


                                                             40
Queries : group()
  group() 文


     •集計処理を実現するための機能。Sharding環境で
      は動かない(後述のMapReduce推奨)

     •後述のAggregation Frameworkに今後は統合され
      る。
> db.accesslogs.group(
... {key: {method: true},
... cond: {},
... initial: {count: 0},
... reduce: function(doc, out) { out.count++; }
... });
[
        {"method" : "GET","count" : 6644},
        {"method" : "POST","count" : 3}
]

                                                  41
MapReduce
  MapReuce機能


    •Map/Reduceモデルで集計処理を行う。複数の
      Shardで集計した結果をReduceする。

    •処理中ずっとLockがかかるのでProductionで実行
      するには不向き。
> db.accesslogs.mapReduce(map ,reduce , {out: { inline : 1}});
{
    "results" : [
          {"_id" : "GET","value" : {"count" : 6644}},
          {"_id" : "POST","value" : {"count" : 3}}
    ],
    "timeMillis" : 444,
    "counts" : {"input" : 6647,"emit" : 6647,"output" : 2},
    "ok" : 1,
}

                                                                 42
Regular Expressions
  正規表現機能


     •検索条件に正規表現の文を指定できる (PCRE)。
      ログの検索には便利。




> db.accesslogs.find({agent : /Mozilla/5.0/i})
{ "_id" : ObjectId("4f2a9ad6a03a3a34ef000001"), "host" : "0.0.0.0""method" : "GET",
"path" : "/odai/2132564671424954401", "code" : "200", "size" : "15947", "referer" :
"http://matome.naver.jp/", "agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7", "time" :
ISODate("2012-02-01T02:02:19Z") }
{ "_id" : ObjectId("4f2a9ad6a03a3a34ef000002"), "host" : "0.0.0.0","method" : "GET",
"path" : "/odai/2132564671424954401", "code" : "200", "size" : "16084", "referer" :
"http://matome.naver.jp/", "agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7") }

                                                                                       43
Aggregation Framework
Aggregation Framework


  •様々な集約ルールをUnixのPipeのような感じでつ
   ないでいくことができる機能(2.1.0以降)
   http://www.mongodb.org/display/DOCS/Aggregation+Framework




                        http://datablend.be/?p=1400



                                                               44
Problem of Log Collecting
ログ収集における課題


 •MongoDBにログを保存する際は以下のような点
 が課題に。

  •非構造データ→構造データの変換
   (生ログ→BSON)


  •ログの収集
   (web/app server→log server)


  •ログ保存時の負荷分散
   (一度にまとめて保存しようとするとMongoDBのGlobal Lockの   食
   に...)


                                               45
Fluentd
 Fluentd : The event collector service




https://github.com/fluent/fluentd
http://fluentd.org/doc/
http://community.fluentd.org/browse/help-center/

                                                  46
Fluentd
Fluentd : The event collector service


•syslogのように、準リアルタイムにネットワーク越
 しのログ転送が行えるミドルウェア。

  •JSON準拠の構造化データでやりとりをする。

  •設定・導入が非常に簡単。

  •プラグイン形式で入出力処理の拡張が行える

      •MongoDBに書き込むためのプラグインもある
        https://github.com/fluent/fluent-plugin-mongo



                                                      47
Fluentd
Fluentd : The event collector service


•以下の構成のようにすると、web/appのログを準リ
 アルタイムで別システム(Hadoop/MongoDB/etc)
 に書き込む事ができる。


                 Apps                      Hadoop
                     fluentd                Clusters
                                        fluentd
                 Apps
                     fluentd
                                         mongod
                 Apps
                                        fluentd
                     fluentd


                                                      48
Fluentd
Fluentd : The event collector service


•準リアルタイムでログの保存ができると、データの
 準リアルタイムでの集計や可視化ができる。




                                        49
Fluentd
参考資料




  http://dl.dropbox.com/u/224433/kamakura_pm_2/index.html


                                                            50
#2 Summary
#2 ここまでのまとめ


 •ログデータの保存集計にMongoDBは向いている

   •検索性を落とさずスキーマレスなデータの格納
    ができる。

   •検索・集計クエリーがそれなりに        っている

   •Fluentdと組み合わせると煩わしいログの収集
    処理も簡単に。欲しいデータが常に手元に。

   •一時保存の場合はCapped Collectionが便利

                                   51
#3 Prototyping
#3 プロトタイピング向けのDBとしてMongoDBを使用


 •プロトタイプアプリで「とりあえず動くもの」を
  作成するにはRDBを使用するのが面倒くさい。

   •テーブル作成のたびにcreate table文。

   •開発中にDBのスキーマが頻繁に変わる。

 •MongoDBなら事前定義不要。クエリー実行した
  内容のとおりにデータが作成される。

 •プログラマ側でコントロールできる。

                                52
#3 Prototyping
参考資料




       http://www.slideshare.net/fungoing/mongodb-7948933

                                                            53
ソーシャルゲームと
MongoDB(資料紹介)




                54
Ref. Ameba pico
Ameba Pico(piggの海外版)での事例資料


 •『Ameba PicoとMongoDB』
  http://www.slideshare.net/snamura/mongo-db-
  couchdb20101214

 •『AmebaPico 裏側の技術やAWS活用について』
  http://www.slideshare.net/KoheiMorino/
  amebapico-aws




                                                55
Ref. Animal Land
Animal Land(海外向けブラウザゲーム)の事例


 •『ソーシャルゲームにおけるMongoDB適用事
  例』
  http://www.slideshare.net/matsukaz/mongodb-
  animal-land-11134607




                                                56
まとめ




      57
Conclusion
まとめにかえて


 •広く浅くMongoDBに関する話をしてきました。

 •個人的な主観は以下です。

  •比較的平和なケース:
   複雑なデータ構造をメモリに載りきる範囲で運
   用。ログ集計などバックエンドで使用。

  •チャレンジングなケース(お金的な意味で):
   Big Dataを扱う。大規模システムのストレージ
   として用いる。
                               58
Conclusion
まとめにかえて


 •開発が活発でたくさんの新機能も予定されている
 ので、今後の進展が期待できるプロダクトです。

 •今後の動きにぜひ注目していてください。

 •個人的にはRedisも好きです。

  •2.6から導入されるLua Scriptingは楽しそうで
   すね




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




              60

Weitere ähnliche Inhalte

Was ist angesagt?

MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!Tetsutaro Watanabe
 
Mongo db勉強会の補足
Mongo db勉強会の補足Mongo db勉強会の補足
Mongo db勉強会の補足CROOZ, inc.
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)Ryuji Tamagawa
 
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話leverages_event
 
Db tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersDb tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersHiroaki Kubota
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろうCROOZ, inc.
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜Masakazu Matsushita
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎Naruhiko Ogasawara
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandMasakazu Matsushita
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualYasuhiro Matsuo
 
MongoDBのはじめての運用テキスト
MongoDBのはじめての運用テキストMongoDBのはじめての運用テキスト
MongoDBのはじめての運用テキストAkihiro Kuwano
 
日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについてippei_suzuki
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムHitoshi Asai
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレするAkihiro Kuwano
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 

Was ist angesagt? (20)

MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!
 
Mongo db勉強会の補足
Mongo db勉強会の補足Mongo db勉強会の補足
Mongo db勉強会の補足
 
初めてのMongo db
初めてのMongo db初めてのMongo db
初めてのMongo db
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
 
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話
 
Db tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersDb tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clusters
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasual
 
MongoDBのはじめての運用テキスト
MongoDBのはじめての運用テキストMongoDBのはじめての運用テキスト
MongoDBのはじめての運用テキスト
 
日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステム
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレする
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
MongoDB3.2の紹介
MongoDB3.2の紹介MongoDB3.2の紹介
MongoDB3.2の紹介
 
Cassandra v0.6-siryou
Cassandra v0.6-siryouCassandra v0.6-siryou
Cassandra v0.6-siryou
 

Ähnlich wie Introduction to MongoDB

PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQLkeki3
 
社会ネットワーク分析第7回
社会ネットワーク分析第7回社会ネットワーク分析第7回
社会ネットワーク分析第7回Satoru Mikami
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - Tetsutaro Watanabe
 
Casual Compression on MongoDB
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDBmoai kids
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRecruit Technologies
 
Cassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlCassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlYutuki r
 
私の考えるドキュメント指向
私の考えるドキュメント指向私の考えるドキュメント指向
私の考えるドキュメント指向Yohei Yamamoto
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会otmb
 
シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京Yu Ito
 
企業等に蓄積されたデータを分析するための処理機能の提案
企業等に蓄積されたデータを分析するための処理機能の提案企業等に蓄積されたデータを分析するための処理機能の提案
企業等に蓄積されたデータを分析するための処理機能の提案Toshiyuki Shimono
 
DB Tech Showcase 大阪: Amazon DynamoDB Deep Dive
DB Tech Showcase 大阪: Amazon DynamoDB Deep DiveDB Tech Showcase 大阪: Amazon DynamoDB Deep Dive
DB Tech Showcase 大阪: Amazon DynamoDB Deep DiveKenta Yasukawa
 
Dat009 クラウドでビック
Dat009 クラウドでビックDat009 クラウドでビック
Dat009 クラウドでビックTech Summit 2016
 
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説decode2016
 

Ähnlich wie Introduction to MongoDB (20)

PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Mongodb 紹介
Mongodb 紹介Mongodb 紹介
Mongodb 紹介
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL
 
社会ネットワーク分析第7回
社会ネットワーク分析第7回社会ネットワーク分析第7回
社会ネットワーク分析第7回
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
 
Casual Compression on MongoDB
Casual Compression on MongoDBCasual Compression on MongoDB
Casual Compression on MongoDB
 
MongoDB勉強会資料
MongoDB勉強会資料MongoDB勉強会資料
MongoDB勉強会資料
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
Mongodb
MongodbMongodb
Mongodb
 
Cassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlCassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sql
 
私の考えるドキュメント指向
私の考えるドキュメント指向私の考えるドキュメント指向
私の考えるドキュメント指向
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
企業等に蓄積されたデータを分析するための処理機能の提案
企業等に蓄積されたデータを分析するための処理機能の提案企業等に蓄積されたデータを分析するための処理機能の提案
企業等に蓄積されたデータを分析するための処理機能の提案
 
DB Tech Showcase 大阪: Amazon DynamoDB Deep Dive
DB Tech Showcase 大阪: Amazon DynamoDB Deep DiveDB Tech Showcase 大阪: Amazon DynamoDB Deep Dive
DB Tech Showcase 大阪: Amazon DynamoDB Deep Dive
 
Dat009 クラウドでビック
Dat009 クラウドでビックDat009 クラウドでビック
Dat009 クラウドでビック
 
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
 

Mehr von moai kids

中国最新ニュースアプリ事情
中国最新ニュースアプリ事情中国最新ニュースアプリ事情
中国最新ニュースアプリ事情moai kids
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係moai kids
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについてmoai kids
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4moai kids
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3moai kids
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1moai kids
 
Hadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたHadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたmoai kids
 
HBase本輪読会資料(11章)
HBase本輪読会資料(11章)HBase本輪読会資料(11章)
HBase本輪読会資料(11章)moai kids
 
snappyについて
snappyについてsnappyについて
snappyについてmoai kids
 
第四回月次セミナー(公開版)
第四回月次セミナー(公開版)第四回月次セミナー(公開版)
第四回月次セミナー(公開版)moai kids
 
第三回月次セミナー(公開版)
第三回月次セミナー(公開版)第三回月次セミナー(公開版)
第三回月次セミナー(公開版)moai kids
 
Pythonで自然言語処理
Pythonで自然言語処理Pythonで自然言語処理
Pythonで自然言語処理moai kids
 
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークHandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークmoai kids
 
Yammer試用レポート(公開版)
Yammer試用レポート(公開版)Yammer試用レポート(公開版)
Yammer試用レポート(公開版)moai kids
 
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)moai kids
 
中国と私(仮題)
中国と私(仮題)中国と私(仮題)
中国と私(仮題)moai kids
 
不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料moai kids
 
n-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてn-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてmoai kids
 
Analysis of ‘lang-8’
Analysis of ‘lang-8’Analysis of ‘lang-8’
Analysis of ‘lang-8’moai kids
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてmoai kids
 

Mehr von moai kids (20)

中国最新ニュースアプリ事情
中国最新ニュースアプリ事情中国最新ニュースアプリ事情
中国最新ニュースアプリ事情
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
 
Hadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたHadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきました
 
HBase本輪読会資料(11章)
HBase本輪読会資料(11章)HBase本輪読会資料(11章)
HBase本輪読会資料(11章)
 
snappyについて
snappyについてsnappyについて
snappyについて
 
第四回月次セミナー(公開版)
第四回月次セミナー(公開版)第四回月次セミナー(公開版)
第四回月次セミナー(公開版)
 
第三回月次セミナー(公開版)
第三回月次セミナー(公開版)第三回月次セミナー(公開版)
第三回月次セミナー(公開版)
 
Pythonで自然言語処理
Pythonで自然言語処理Pythonで自然言語処理
Pythonで自然言語処理
 
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークHandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
 
Yammer試用レポート(公開版)
Yammer試用レポート(公開版)Yammer試用レポート(公開版)
Yammer試用レポート(公開版)
 
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
 
中国と私(仮題)
中国と私(仮題)中国と私(仮題)
中国と私(仮題)
 
不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料
 
n-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてn-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法について
 
Analysis of ‘lang-8’
Analysis of ‘lang-8’Analysis of ‘lang-8’
Analysis of ‘lang-8’
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能について
 

Kürzlich hochgeladen

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Kürzlich hochgeladen (9)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

Introduction to MongoDB

  • 1. Introduction to MongoDB @just_do_neet 1
  • 2. Today’s Agenda 今日のお題目 •MongoDBの一般的な解説 •向いてそうな適用範囲 •ソーシャルゲームとMongoDB(資料紹介のみ) •まとめ 2
  • 4. MongoDB Mongoは「でっかい」という意味らしいです http://www.mongodb.org/ http://www.mongodb.jp/ •10gen社が主体として開発しているオープンソース 所謂「NoSQL」の一つ 4
  • 6. Document Oriented ドキュメント指向の概念 •ある一定のフォーマットにてエンコードされた データをひとつの「ドキュメント」として扱う。 •フォーマット:XML、YAML、BSON、etc. •ドキュメントは一般的に構造化データの形式を取 ることが多い。 • “The central concept of a document-oriented database is the notion of a Document. While each document-oriented database implementation differs on the details of this definition, in general, they all assume documents encapsulate and encode data (or information) in some standard format(s) (or encoding(s)).” http://en.wikipedia.org/wiki/Document-oriented_database 6
  • 7. Document Oriented ドキュメント指向の概念 •MongoDBはドキュメントを「BSON」形式で扱 う。http://bsonspec.org/ •一つの入れ物(collection)の中には、BSONフォー マットであれば異なる構造のデータでも入れる事 ができる。 →スキーマレス →柔軟な構造のデータベース 7
  • 8. Document on MongoDB MongoDBの中でのデータ > db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"}) > db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"}) > db.musicians.save({name : "Pat Metheny" , country : "US" , awards : { name : "grammy", count:19}}) > > db.musicians.find() { "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada", "age" : 60, "genre" : "fork" } { "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz", "menbers" : 4, "companey" : "Road & Sky" } { "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny", "country" : "US", "awards" : { "name" : "grammy", "count" : 19 } } 8
  • 9. Document on MongoDB MongoDBの中でのデータ > db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"}) > db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"}) > db.musicians.save({name : "Pat Metheny" , country : "US" , awards : { name : "grammy", count:19}}) > > db.musicians.find() { 各ドキュメントの構造は同じでなくても良い Sada", "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi "age" : 60, "genre" : "fork" } { "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz", "menbers" : 4, "companey" : "Road & Sky" } { "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny", "country" : "US", "awards" : { "name" : "grammy", "count" : 19 } } 9
  • 10. Document on MongoDB MongoDBの中でのデータ > db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"}) > db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"}) > db.musicians.save({name : "Pat Metheny" , country : "US" , awards : { name : "grammy", count:19}}) > > db.musicians.find() { ドキュメントの中に階層的なデータを入れるこ "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada", "age" : 60, "genre" : "fork" } { とができる。 "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz", "menbers" : 4, "companey" : "Road & Sky" } { "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny", "country" : "US", "awards" : { "name" : "grammy", "count" : 19 } } 10
  • 11. Document on MongoDB MongoDBの中でのデータ > db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"}) > db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"}) > db.musicians.save({name : "Pat Metheny" , country : "US" , awards : { name : "grammy", count:19}}) > > db.musicians.find() { "_id" : ObjectId("4f4ce8621b5c3f27d189c5bc"), "name" : "Masashi Sada", "age" : 60, "genre" : "fork" } { "_id" : ObjectId("4f4ce8ed1b5c3f27d189c5bd"), "name" : "Spitz", "menbers" : 4, "companey" : "Road & Sky" } { "_id" : ObjectId("4f4ce95c1b5c3f27d189c5be"), "name" : "Pat Metheny", "country" : "US", "awards" : { "name" : "grammy", "count" : 19 } } 各ドキュメントには必ず一意のIDが割り振られ る。デフォルトはMongo独自のID(ObjectID) 明示的に指定も可。 11
  • 12. Document on MongoDB MongoDBの中でのデータ > db.musicians.save({name:"Masashi Sada", age:60, genre:"fork"}) > db.musicians.save({name:"Spitz", menbers : 4 , companey: "Road & Sky"}) > db.musicians.save({name : "Pat Metheny" , country : "US" , awards : { name : "grammy", count:19}}) > > db.musicians.ensureIndex({name : 1}) > db.musicians.getIndices() [ {"v" : 1,"key" : {"_id" : 1},"ns" : "music.musicians","name" : "_id_"}, {"v" : 1,"key" : {"name" : 1},"ns" : "music.musicians","name" : "name_1"} ] > 任意のフィールドにインデックスを貼ることが できる。(B-Tree) 12
  • 13. Document on MongoDB MongoDBの中でのデータ •入れ物の中に、異なる構造のデータを格納するこ とができる(スキーマレス) •階層構造を持つデータを格納することができる。 •かつ、RDBに近い操作性を持っている。 13
  • 15. Scalability MongoDBにおけるスケーラビリティ •Replica Set(High Availability) •Sharding(Horizontal Scaling) Replica Setは同一のデータを複数インスタンス で管理することでHA構成を実現するもの。 1 Replica Setあたり最低3台が必要。 http://www.mongodb.org/display/DOCS/Introduction 15
  • 16. Scalability MongoDBにおけるスケーラビリティ •Replica Set(High Availability) •Sharding(Horizontal Scaling) Shardingはデータを複数クラスターで分散配置 させるための仕組み。 (≒マルチマスタ化) http://www.mongodb.org/display/DOCS/Introduction 16
  • 17. Scalability MongoDBにおけるスケーラビリティ •標準機能としてReplica Set / Sharding機能が備 わっている。 •カタログスペック上は手軽にHA構成、水平 sharding構成を組むことができる。 •実際はshard間のデータ偏り調整など運用にコツ がいる 17
  • 18. Other Features その他の特徴的な機能 •GridFS •大きいサイズのファイルを扱うための仕組み •地理空間インデックス •緯度経度検索 •Capped Collection •固定サイズの入れ物。サイズを超えたら古いも のから自動的に削除される。 18
  • 19. Cons. MongoDBの欠点(主観含む) •トランザクション未サポート •トランザクションは甘え (ドヤァ •Global Lock(2.2からCollection Lockに?) •システムリソースが肥大化(メモリ、ディスク) •データ圧縮未対応(通信、データストア共) •セキュリティ周りが弱い etc. 19
  • 20. Cons. MongoDBの欠点(主観含む) •厳密なトランザクション処理が必要なシステムに は向かない。(課金、会員管理など...) •書き込み過多なシステムには基本向かない。 •Big Dataを扱う環境には向かない。 •スケールするが故に、下手にそれなりの規模の システムに導入するとサーバー無限増殖の刑 に... 20
  • 21. Ref. PFI Tech. White Paper 参考:PFI Technical White Paper (P.17) http://preferred.jp/wp-content/uploads/2012/03/PFIwhitepaper.pdf 21
  • 22. Compress vs Not Compress 圧縮:非圧縮のデータサイズの差 •下記例は同一フォーマットの文字列データを格納 した際の比較(MongoDB / HBase) •MongoDBはHBase(snappy圧縮時)の三倍強。 700000000 MongoDB 600000000 MongoDB(fragment) 500000000 HBase HBase(fragment) 400000000 HBase(snappy) 300000000 200000000 100000000 0 size(1,000,000 record) 22
  • 23. Summary ここまでのまとめ •ドキュメント指向DB。異なる構造や複雑な構造 のデータを扱える。検索機能も強力。 •HA機能、Sharding機能を標準的に持っている。 •トランザクションは甘え。 •富豪的な作りのミドルウェアなので使用するリ ソースの多さに起因する課題があるので注意。 23
  • 25. Suitable Cases 向いてそうな使い方(主観) •(注)下記以外にも適切な使い方はたくさんある と思うので皆さんも考えてください。 1.RDBやKVSでは表現しきれない複雑な構成の データを扱う。 2.一時的なログ集計、ログ管理。データ集計基 盤。 3.プロトタイピング用の環境。 25
  • 26. #1 Complex Data 複雑な構成のデータ •既存のRDBやKVSでは扱いづらいデータ。 •RDBは複数の構造(schema)のデータをひとつ の入れ物(table)に入れて扱いづらい •KVSは自由度が高いが、Valueの検索が難し い。 •複数の構造のデータをひとつの入れ物に入れて、 検索性も高めるためにはどうすれば? 26
  • 27. #1 Complex Data 複雑な構成のデータ •例:ソーシャルサービスのActivity Feed http://photoalbum.naver.jp/ 27
  • 28. #1 Complex Data 複雑な構成のデータ •例:ソーシャルサービスのActivity Feed •Activityごとにデータ構 造が違う。 (コメント、like 、写真 etc...) 28
  • 29. #1 Complex Data 複雑な構成のデータ •例:ソーシャルサービスのActivity Feed •ひとつのActivityの中に 複数のアイテムが存在す るケースがある。 29
  • 30. #1 Complex Data 複雑な構成のデータ •例:ソーシャルサービスのActivity Feed •Activityに含まれるアイ テム(写真など)を個別 に検索する必要がある。 (データの消し込みなど) 30
  • 31. #1 Complex Data 複雑な構成のデータ •RDBでモデリングした場合 •Oops... 31
  • 32. #1 Complex Data 複雑な構成のデータ •KVSでモデリング?した場合 •Valueの検索に課題 32
  • 33. MongoDB Can Do It! MongoDBならできるよ! •そこでMongoDBですよ。 •スキーマレスなので... •複数のフォーマットのActivityをひとつの入れ 物に詰め込める。 •かつ検索性能も落とさずに済む。 33
  • 34. Delete Photo(Column) 例:写真の削除 #lookup photo db.activity.find({feedList.feedData.photoList, photoId}) #delete photo db.activity.remove({feedList.feedId, feedId}) #re-insert timeline data db.activity.insert(newFeedData) 34
  • 35. Delete Album(Row) 例:アルバムの削除 #lookup album db.activity.find({feedList.feedData.albumList.albumId, alubmId}) #delete album db.activity.remove({feedList.feedId, feedId}) 35
  • 36. Dot Notation dot notation記法による階層の深いデータの検索 •MongoDBはdot notationという記法で階層の深い データの検索が可能。 (db.hoge.find({a.b.c.d.e : 1}) のような形が可) •インデックスを貼ることも可能。 #lookup album db.activity.find({feedList.feedData.albumList.albumI d, alubmId}) #delete album db.activity.remove({feedList.feedId, feedId}) 36
  • 37. #1 Summary #1 ここまでのまとめ •複雑な構造のデータを検索性を落とさずに使うに はMongoDBは向いている。 •ただし先に紹介したような設計にするとデータ が肥大化しがちなので注意。 •参照・更新のスループットを落とさないために はデータ・インデックスをオンメモリで乗るサ イズに収めるのが前提。 37
  • 38. #2 Storing Logs ログファイルの保存先としてのMongoDB •ログファイルは多くの場合非構造・スキーマレス で保存されている。 •ただ保存するだけでなく、ログの検索や集計を 手軽に行いたい •RDBなどスキーマを厳密に定義した入れ物はあ まり向かない。 →MongoDB! 38
  • 39. Advanced Queries MongoDBの高度なクエリー •MongoDBはNoSQLと言われる群の中では検索・ 集計クエリーの機能が っているのが特徴。 •count() •group() •MapReduce •正規表現 •Aggregation Framework 39
  • 40. Queries : count() count() 文 •条件に合致する件数を返す。SQLのcount文とだ いたい同じ。 > db.accesslogs.find({method : 'GET', code: '200'}).count() 6644 40
  • 41. Queries : group() group() 文 •集計処理を実現するための機能。Sharding環境で は動かない(後述のMapReduce推奨) •後述のAggregation Frameworkに今後は統合され る。 > db.accesslogs.group( ... {key: {method: true}, ... cond: {}, ... initial: {count: 0}, ... reduce: function(doc, out) { out.count++; } ... }); [ {"method" : "GET","count" : 6644}, {"method" : "POST","count" : 3} ] 41
  • 42. MapReduce MapReuce機能 •Map/Reduceモデルで集計処理を行う。複数の Shardで集計した結果をReduceする。 •処理中ずっとLockがかかるのでProductionで実行 するには不向き。 > db.accesslogs.mapReduce(map ,reduce , {out: { inline : 1}}); { "results" : [ {"_id" : "GET","value" : {"count" : 6644}}, {"_id" : "POST","value" : {"count" : 3}} ], "timeMillis" : 444, "counts" : {"input" : 6647,"emit" : 6647,"output" : 2}, "ok" : 1, } 42
  • 43. Regular Expressions 正規表現機能 •検索条件に正規表現の文を指定できる (PCRE)。 ログの検索には便利。 > db.accesslogs.find({agent : /Mozilla/5.0/i}) { "_id" : ObjectId("4f2a9ad6a03a3a34ef000001"), "host" : "0.0.0.0""method" : "GET", "path" : "/odai/2132564671424954401", "code" : "200", "size" : "15947", "referer" : "http://matome.naver.jp/", "agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7", "time" : ISODate("2012-02-01T02:02:19Z") } { "_id" : ObjectId("4f2a9ad6a03a3a34ef000002"), "host" : "0.0.0.0","method" : "GET", "path" : "/odai/2132564671424954401", "code" : "200", "size" : "16084", "referer" : "http://matome.naver.jp/", "agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7") } 43
  • 44. Aggregation Framework Aggregation Framework •様々な集約ルールをUnixのPipeのような感じでつ ないでいくことができる機能(2.1.0以降) http://www.mongodb.org/display/DOCS/Aggregation+Framework http://datablend.be/?p=1400 44
  • 45. Problem of Log Collecting ログ収集における課題 •MongoDBにログを保存する際は以下のような点 が課題に。 •非構造データ→構造データの変換 (生ログ→BSON) •ログの収集 (web/app server→log server) •ログ保存時の負荷分散 (一度にまとめて保存しようとするとMongoDBのGlobal Lockの 食 に...) 45
  • 46. Fluentd Fluentd : The event collector service https://github.com/fluent/fluentd http://fluentd.org/doc/ http://community.fluentd.org/browse/help-center/ 46
  • 47. Fluentd Fluentd : The event collector service •syslogのように、準リアルタイムにネットワーク越 しのログ転送が行えるミドルウェア。 •JSON準拠の構造化データでやりとりをする。 •設定・導入が非常に簡単。 •プラグイン形式で入出力処理の拡張が行える •MongoDBに書き込むためのプラグインもある https://github.com/fluent/fluent-plugin-mongo 47
  • 48. Fluentd Fluentd : The event collector service •以下の構成のようにすると、web/appのログを準リ アルタイムで別システム(Hadoop/MongoDB/etc) に書き込む事ができる。 Apps Hadoop fluentd Clusters fluentd Apps fluentd mongod Apps fluentd fluentd 48
  • 49. Fluentd Fluentd : The event collector service •準リアルタイムでログの保存ができると、データの 準リアルタイムでの集計や可視化ができる。 49
  • 51. #2 Summary #2 ここまでのまとめ •ログデータの保存集計にMongoDBは向いている •検索性を落とさずスキーマレスなデータの格納 ができる。 •検索・集計クエリーがそれなりに っている •Fluentdと組み合わせると煩わしいログの収集 処理も簡単に。欲しいデータが常に手元に。 •一時保存の場合はCapped Collectionが便利 51
  • 52. #3 Prototyping #3 プロトタイピング向けのDBとしてMongoDBを使用 •プロトタイプアプリで「とりあえず動くもの」を 作成するにはRDBを使用するのが面倒くさい。 •テーブル作成のたびにcreate table文。 •開発中にDBのスキーマが頻繁に変わる。 •MongoDBなら事前定義不要。クエリー実行した 内容のとおりにデータが作成される。 •プログラマ側でコントロールできる。 52
  • 53. #3 Prototyping 参考資料 http://www.slideshare.net/fungoing/mongodb-7948933 53
  • 55. Ref. Ameba pico Ameba Pico(piggの海外版)での事例資料 •『Ameba PicoとMongoDB』 http://www.slideshare.net/snamura/mongo-db- couchdb20101214 •『AmebaPico 裏側の技術やAWS活用について』 http://www.slideshare.net/KoheiMorino/ amebapico-aws 55
  • 56. Ref. Animal Land Animal Land(海外向けブラウザゲーム)の事例 •『ソーシャルゲームにおけるMongoDB適用事 例』 http://www.slideshare.net/matsukaz/mongodb- animal-land-11134607 56
  • 57. まとめ 57
  • 58. Conclusion まとめにかえて •広く浅くMongoDBに関する話をしてきました。 •個人的な主観は以下です。 •比較的平和なケース: 複雑なデータ構造をメモリに載りきる範囲で運 用。ログ集計などバックエンドで使用。 •チャレンジングなケース(お金的な意味で): Big Dataを扱う。大規模システムのストレージ として用いる。 58
  • 59. Conclusion まとめにかえて •開発が活発でたくさんの新機能も予定されている ので、今後の進展が期待できるプロダクトです。 •今後の動きにぜひ注目していてください。 •個人的にはRedisも好きです。 •2.6から導入されるLua Scriptingは楽しそうで すね 59