More Related Content Similar to Introduction to MongoDB Similar to Introduction to MongoDB (20) Introduction to MongoDB6. 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
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
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
26. #1 Complex Data
複雑な構成のデータ
•既存のRDBやKVSでは扱いづらいデータ。
•RDBは複数の構造(schema)のデータをひとつ
の入れ物(table)に入れて扱いづらい
•KVSは自由度が高いが、Valueの検索が難し
い。
•複数の構造のデータをひとつの入れ物に入れて、
検索性も高めるためにはどうすれば?
26
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
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
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
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
51. #2 Summary
#2 ここまでのまとめ
•ログデータの保存集計にMongoDBは向いている
•検索性を落とさずスキーマレスなデータの格納
ができる。
•検索・集計クエリーがそれなりに っている
•Fluentdと組み合わせると煩わしいログの収集
処理も簡単に。欲しいデータが常に手元に。
•一時保存の場合はCapped Collectionが便利
51
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