はじめてのMongoDB

1,741
-1

Published on

社内勉強会での発表資料です

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,741
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

はじめてのMongoDB

  1. 1. はじめてのMongoDB 2013/09/18 TechCircle IT基盤サービス企画室 泉谷圭祐
  2. 2. アジェンダ MongoDBとは MongoDBの特徴 MongoDBの基本 MongoDBの操作 MongoDBの運用 まとめ
  3. 3. MongoDBとは 米10gen社が開発しているオープンソースNoSQLデータベース 2009年2月に初回リリース 最新版は2.4.6 C++で書かれている
  4. 4. !?
  5. 5. MongoDBとは 公式サイト http://www.mongodb.org/
  6. 6. MongoDBの特徴 ドキュメント指向データベース アドホッククエリが使える 高い可用性 多数のメジャーな言語でAPIを提供
  7. 7. MongoDBの特徴 ドキュメント指向データベース JSONでデータを保存 スキーマレス {❴ }❵ id : "1" name : "hoge" age : "25" email : "hoge@tis.co.jp" company : {❴ name : "TIS" address : "新宿区西新宿8-17-1 }❵ ※厳密にはBSON(❨Binary JSON)❩で保存される
  8. 8. MongoDBの特徴 アドホッククエリが使える RDBライクな操作が可能 > db.user.findOne(❨{❴"name" : "hoge"}❵)❩ ! {❴ "id" : "1", "name" : "hoge", "email" : "hoge@tis.co.jp" }❵
  9. 9. MongoDBの特徴 高い可用性 レプリカセット Cluster Node Node Node Node
  10. 10. MongoDBの特徴 多数のメジャーな言語でAPIを提供 C Erlang PHP C++ Java Python C# Javascript Ruby Go Node.js Scala
  11. 11. MongoDBの特徴 統一的なインターフェースを提供 Ruby require 'mongo' ! db = MongoClient.new(❨'localhost', '27017')❩.db(❨'mydb')❩ collection = db.collection(❨'test_col')❩ ! documents = collection.find(❨'name' => 'hoge')❩ Java import com.mongodb."いろいろ" ! DB db = new MongoClient(❨ "localhost" , 27017 )❩.getDB(❨"mydb")❩; DBCollection collection = db.getCollection(❨"test_coll")❩; ! BasicDBObject query = new BasicDBObject(❨"name", "hoge")❩; DBCursor documents = collection.find(❨query)❩;
  12. 12. MongoDBの基本 データベースの表現について ドキュメントについて Mongo Console
  13. 13. MongoDBの基本 データベースの表現について MySQL MongoDB DatabaseA DatabaseA TableA CollectionA TableB CollectionB DatabaseB TableC DatabaseB CollectionC
  14. 14. MongoDBの基本 1レコード=1ドキュメント {❴ MongoDB DatabaseA CollectionA _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" }❵ {❴ CollectionB _id : ObjectId(❨"523444c714a05837e26ca8a1")❩ name : "huga" age : "30" email : "huga@tis.co.jp" }❵ DatabaseB CollectionC {❴ _id : ObjectId(❨"523444c714a05837e26ca8a2")❩ name : "foo" age : "32" phone : "090-1234-5678" <= !?
  15. 15. MongoDBの基本 ドキュメントについて {❴ }❵ _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" language : ["Japanese", "English"] home : {❴ name : "hoge apart" address : "新宿区西新宿1-1-1" }❵ "updatedAt" : ISODate(❨"2013-09-18T18:00:15.598Z")❩ 自動でidが割り振られる(❨DBで一 意)❩ 配列を要素にできる 入れ子にすることもできる 時刻を入れることもできる コレクション内で要素が異なっていても良い 1ドキュメントのサイズはBSONで16MBまで
  16. 16. MongoDBの基本 Mongo Console MongoDBのコンソールはJavascriptで実装されている [hogeuser@localhost]$ mongo MongoDB shell version: 2.4.6 connecting to: test ! > > var test = db.test.find(❨)❩.length(❨)❩; > > print(❨test)❩ 3 > 標準API以外に変数やメソッドを使った操作も可能
  17. 17. MongoDBの操作 ドキュメントの作成 ドキュメントの参照 ドキュメントの更新 ドキュメントの削除
  18. 18. MongoDBの操作 ドキュメントの作成 > use test #DBの指定 > db.test_collection.insert(❨{❴ "name" : "hoge", "email" : "hoge@tis.co.jp" }❵)❩; > コレクションはuse等する必要がない データベースもコレクションも初めてドキュメントを追加した時に
 自動で作成される
  19. 19. MongoDBの操作 ドキュメントの参照 ! #全件検索 > db.test_collection.find(❨)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! # クエリ検索 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #1件検索 > db.test_collection.findOne(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge",
  20. 20. MongoDBの操作 ドキュメントの更新 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #更新 > db.test_collection.update(❨{❴"name":"hoge"}❵, {❴$set : {❴"email" : "hoge@excale.net"}❵}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩;
  21. 21. MongoDBの操作 ドキュメントの削除 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #削除 > db.test_collection.remove(❨{❴"name":"hoge"}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; ・・・?
  22. 22. MongoDBの操作 mongoDBにはトランザクションがない!! > db.test_collection.remove(❨)❩;
  23. 23. MongoDBの操作 Demo
  24. 24. MongoDBの運用 レプリカセット シャーディング その他の機能
  25. 25. MongoDBの運用 レプリカセット 複数台のノードでクラスタを組んでミラーリング PRIMARY1台、他はすべてSECANDARY 書き込みはPRIMARYで行う PRIMARYが落ちたら投票が行われ、
 次のPRIMARYが選出される
 (❨10∼20のダウンタイムが発生)❩ ノード数は奇数が推奨されている
  26. 26. MongoDBの運用 Demo
  27. 27. MongoDBの運用 シャーディング 複数台のレプリカセットクラスタでデータを分割
  28. 28. MongoDBの運用 シャーディング構成図
  29. 29. MongoDBの運用 シャーディング構成 シャード 通常はレプリカセットで構成する コンフィグサーバー 1台か3台で構成(プロダクションでは3台構成とされている) 勝手に同期しているのでレプリカセットにする必要はない ルーティングサーバー(❨mongos)❩ mongoを使う各サーバー自身が持つ コンフィグサーバーに問い合わせをして読み書きを分散
  30. 30. MongoDBの運用 その他の機能 ダンプ / リストア cappedコレクション TTLインデックス MapReduce
  31. 31. MongoDBの運用 ダンプ / リストア ユーティリティが付属 $ mongodump --collection "COLLECTION_NAME" --db "DB_NAME" $ mongorestore --collection "COLLECTION_NAME" --db "DB_NAME"
  32. 32. MongoDBの運用 cappedコレクション サイズ制限付きのコレクション 容量もしくはドキュメント数の制限をかけられる 古いものから自動的に削除される ※シャーディング環境では使えません
  33. 33. MongoDBの運用 TTL index 保持期限付きのコレクション 時刻型のフィールドが必要 古いものから自動的に削除される
  34. 34. MongoDBの運用 MapReduce APIを叩くことで実行可能 #初期データ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a0")❩, "name" : "hoge", "age" : 25, "likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a1")❩, "name" : "huga", "age" : 30, "likes" : "sport" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a2")❩, "name" : "foo", "age" : 40,"likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a3")❩, "name" : "bar", "age" : 21, "likes" : "coding" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a4")❩, "name" : "test", "age" : 19, "likes" : "sport" }❵)❩ ! > var map = function(❨)❩{❴ emit(❨this.likes,1)❩; }❵; > > var reduce = function(❨key, value)❩{❴ return Array.sum(❨value)❩; }❵; > > db.test.mapReduce(❨map, reduce, {❴ query : {❴"age" : {❴$gt : 20}❵}❵, out : "likes_map"}❵)❩ ! /* 結果サマリ(省略)*/
  35. 35. MongoDBの運用 その他にも GridFS 地理空間インデックス など、便利な機能がある
  36. 36. まとめ MongoDBのいいところ スキーマレス アドホッククエリ 冗長化が楽 便利な機能が豊富 コミュニティが活発
  37. 37. まとめ MongoDBのイケてないところ トランザクションがない 結合がない、外部キーがない 悪い意味でスキーマレス 運用面で苦労話の が。。。
  38. 38. まとめ NoSQL全般に言えることだが。。。 新しい万能兵器ではない 限られた使い所で効力を発揮 非正規型データが大量にある場合 データ構造が確定していない場合
  39. 39. 興味を持った方は うちのリーダーが書いた記事を参考にまずはインストールから http://codezine.jp/article/ detail/6982
  40. 40. 御静聴ありがとうございました eXcaleもよろしくお願いします https://www.excale.net/

×