• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
はじめてのMongoDB
 

はじめてのMongoDB

on

  • 883 views

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

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

Statistics

Views

Total Views
883
Views on SlideShare
883
Embed Views
0

Actions

Likes
1
Downloads
10
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    はじめてのMongoDB はじめてのMongoDB Presentation Transcript

    • はじめてのMongoDB 2013/09/18 TechCircle IT基盤サービス企画室 泉谷圭祐
    • アジェンダ MongoDBとは MongoDBの特徴 MongoDBの基本 MongoDBの操作 MongoDBの運用 まとめ
    • MongoDBとは 米10gen社が開発しているオープンソースNoSQLデータベース 2009年2月に初回リリース 最新版は2.4.6 C++で書かれている
    • !?
    • MongoDBとは 公式サイト http://www.mongodb.org/
    • MongoDBの特徴 ドキュメント指向データベース アドホッククエリが使える 高い可用性 多数のメジャーな言語でAPIを提供
    • MongoDBの特徴 ドキュメント指向データベース JSONでデータを保存 スキーマレス {❴ }❵ id : "1" name : "hoge" age : "25" email : "hoge@tis.co.jp" company : {❴ name : "TIS" address : "新宿区西新宿8-17-1 }❵ ※厳密にはBSON(❨Binary JSON)❩で保存される
    • MongoDBの特徴 アドホッククエリが使える RDBライクな操作が可能 > db.user.findOne(❨{❴"name" : "hoge"}❵)❩ ! {❴ "id" : "1", "name" : "hoge", "email" : "hoge@tis.co.jp" }❵
    • MongoDBの特徴 高い可用性 レプリカセット Cluster Node Node Node Node
    • MongoDBの特徴 多数のメジャーな言語でAPIを提供 C Erlang PHP C++ Java Python C# Javascript Ruby Go Node.js Scala
    • 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)❩;
    • MongoDBの基本 データベースの表現について ドキュメントについて Mongo Console
    • MongoDBの基本 データベースの表現について MySQL MongoDB DatabaseA DatabaseA TableA CollectionA TableB CollectionB DatabaseB TableC DatabaseB CollectionC
    • 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" <= !?
    • 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まで
    • 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以外に変数やメソッドを使った操作も可能
    • MongoDBの操作 ドキュメントの作成 ドキュメントの参照 ドキュメントの更新 ドキュメントの削除
    • MongoDBの操作 ドキュメントの作成 > use test #DBの指定 > db.test_collection.insert(❨{❴ "name" : "hoge", "email" : "hoge@tis.co.jp" }❵)❩; > コレクションはuse等する必要がない データベースもコレクションも初めてドキュメントを追加した時に
 自動で作成される
    • 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",
    • 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"}❵)❩;
    • 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"}❵)❩; ・・・?
    • MongoDBの操作 mongoDBにはトランザクションがない!! > db.test_collection.remove(❨)❩;
    • MongoDBの操作 Demo
    • MongoDBの運用 レプリカセット シャーディング その他の機能
    • MongoDBの運用 レプリカセット 複数台のノードでクラスタを組んでミラーリング PRIMARY1台、他はすべてSECANDARY 書き込みはPRIMARYで行う PRIMARYが落ちたら投票が行われ、
 次のPRIMARYが選出される
 (❨10∼20のダウンタイムが発生)❩ ノード数は奇数が推奨されている
    • MongoDBの運用 Demo
    • MongoDBの運用 シャーディング 複数台のレプリカセットクラスタでデータを分割
    • MongoDBの運用 シャーディング構成図
    • MongoDBの運用 シャーディング構成 シャード 通常はレプリカセットで構成する コンフィグサーバー 1台か3台で構成(プロダクションでは3台構成とされている) 勝手に同期しているのでレプリカセットにする必要はない ルーティングサーバー(❨mongos)❩ mongoを使う各サーバー自身が持つ コンフィグサーバーに問い合わせをして読み書きを分散
    • MongoDBの運用 その他の機能 ダンプ / リストア cappedコレクション TTLインデックス MapReduce
    • MongoDBの運用 ダンプ / リストア ユーティリティが付属 $ mongodump --collection "COLLECTION_NAME" --db "DB_NAME" $ mongorestore --collection "COLLECTION_NAME" --db "DB_NAME"
    • MongoDBの運用 cappedコレクション サイズ制限付きのコレクション 容量もしくはドキュメント数の制限をかけられる 古いものから自動的に削除される ※シャーディング環境では使えません
    • MongoDBの運用 TTL index 保持期限付きのコレクション 時刻型のフィールドが必要 古いものから自動的に削除される
    • 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"}❵)❩ ! /* 結果サマリ(省略)*/
    • MongoDBの運用 その他にも GridFS 地理空間インデックス など、便利な機能がある
    • まとめ MongoDBのいいところ スキーマレス アドホッククエリ 冗長化が楽 便利な機能が豊富 コミュニティが活発
    • まとめ MongoDBのイケてないところ トランザクションがない 結合がない、外部キーがない 悪い意味でスキーマレス 運用面で苦労話の が。。。
    • まとめ NoSQL全般に言えることだが。。。 新しい万能兵器ではない 限られた使い所で効力を発揮 非正規型データが大量にある場合 データ構造が確定していない場合
    • 興味を持った方は うちのリーダーが書いた記事を参考にまずはインストールから http://codezine.jp/article/ detail/6982
    • 御静聴ありがとうございました eXcaleもよろしくお願いします https://www.excale.net/