Successfully reported this slideshow.
Your SlideShare is downloading. ×
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 24 Ad

More Related Content

Slideshows for you (20)

Similar to MongoDB (20)

Advertisement

More from あしたのオープンソース研究所   (13)

MongoDB

  1. 1. mongoDB のご紹介 インフォサイエンス 永江 哲朗
  2. 2. mongoDB とは (※) <ul><li>[ 開発元 ] 10gen </li></ul><ul><li>[ 実装 ] C++ </li></ul><ul><li>[ タイプ ] ドキュメント指向データベース </li></ul><ul><li>[OS] Windows, Linux, OS X, Solaris でバイナリ配布 </li></ul><ul><li>[ 言語サポート ] ( 公式 ) C, C++, C#, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala </li></ul><ul><li>[ ライセンス ]   </li></ul><ul><li>  DB: GNU AGPL v3.0 もしくは商用ライセンス </li></ul><ul><li> 各種言語用ドライバー : Apache License v2 </li></ul>※ [Wikipedia]
  3. 3. mongoDB の歴史 <ul><li>・ PAAS を開始するため、 2007 年に 10gen はアプリケーションサーバーと DB を統合し、 web アプリケーションをホスティングするためのスケール性の高いソフトウェアを開発しました。 </li></ul><ul><li>その後 PAAS はうまく行きませんでしたが、 DB のスケーラビリティ性と開発のしやすさにユーザーが注目。 10gen は DB に注力し、 2009 年 2 月に MongoDB としてリリースしました。 (※1) </li></ul><ul><li>・現在の最新版は 1.8.1 (2011 年 5 月 26 日現在 ) です。 (※2) </li></ul>※ 1 [Banker] p.6 ※ 2 [Mongo]
  4. 4. mongoDB の特徴 (※1) <ul><li>※ 2 シャーディング : データベース内のテーブルのデータを複数のシャード ( 破片 ) サーバーにまたがって分散させる方法 </li></ul>※ 1 [Inoue-1] p.6 MapReduce 機能内蔵 [MapReduce] 二次元の地理空間のインデックス (geospatial index) を持つ [ 地理空間のインデックス ] マスター・スレーブ構成。自動フェイルオーバー [ レプリケーション ] あらゆる属性でインデックス作成 [ インデックスサポート ] あらゆるカラムで条件指定可能 [ クエリ ] 自動シャーディング。ただし適切なシャーディングキーを管理者が指定する必要があります [ シャーディング (※2)] JSON ( 内部では BSON(Binary JSON)) [ ドキュメント指向 DB]
  5. 5. <ul><li>{ _id: ObjectID('4bd9e8e17cefd644108961bb'), </li></ul><ul><li>title: 'Adventures in Databases', </li></ul><ul><li>url: 'http://example.com/databases.txt', </li></ul><ul><li>author: 'msmith', </li></ul><ul><li>vote_count: 20, </li></ul><ul><li>tags: ['databases', 'mongodb', 'indexing'], </li></ul><ul><li>image: { </li></ul><ul><li>url: 'http://example.com/db.jpg', </li></ul><ul><li>caption: '', </li></ul><ul><li>type: 'jpg', </li></ul><ul><li>size: 75381, </li></ul><ul><li>data: &quot;Binary&quot; </li></ul><ul><li> }, </li></ul><ul><li>comments: [ </li></ul><ul><li>{user: 'bjones', </li></ul><ul><li> text: 'Interesting article!' </li></ul><ul><li>}, </li></ul><ul><li>{user: 'blogger', </li></ul><ul><li> text: 'Another related article is at http://example.com/db/db.txt' </li></ul><ul><li>} </li></ul><ul><li>] </li></ul><ul><li>} </li></ul>ドキュメントのデータモデル (※1) ※ 1 [Banker] p.7 ドキュメントは RDB でいう行に相当します。 ( したがって左のデータは RDB での 1 行に相当します ) ドキュメントのデータは JSON (JavaScript Object Notation) で表されます。 ( 内部では BSON(Binary JSON) で格納されます ) _id というフィールドはプライマリキーになります。 値として配列をもつこともできます。
  6. 6. mongoDB の用語 ノード データベース コレクション ドキュメント コレクション コレクション データベース コレクションの集合です。 データベース (database) RDB ではテーブルに相当します。 コレクション (collection) RDB では行 (row) に相当します。 ドキュメント (document) 説明 MongoDB での用語
  7. 7. mongoDB でのクエリ (1) <ul><li>・ users というコレクションで” username” が” joe” であるドキュメントの” username” と” email” の値を検索するときのクエリ </li></ul><ul><li>  > db.users.find({“username” : “joe”}, {“username” : 1, “email” : 1}) </li></ul><ul><li>{ </li></ul><ul><li>“ _id” : ObjectId(“4ba0f0dfd22aa494fd523620”), </li></ul><ul><li>“ username” : “joe”, </li></ul><ul><li>“ email” : joe@example.com </li></ul><ul><li>} </li></ul><ul><li>・同じく users で、年齢が 18 ~ 30 歳のドキュメントを検索する場合 </li></ul><ul><li>> db.users.find({“age” : { “$gte” : 18, “$lte” : 30}}) </li></ul><ul><li>($gte は “≧” , $lte は “≦”を表します。 $ のつく演算子は他にもたくさんあります ) </li></ul><ul><li>・正規表現を使った検索 </li></ul><ul><li>  > db.users.find({“name” : /joey?/}) </li></ul><ul><li>(“y?” は、 y が 0 文字もしくは 1 文字を表しますので、例えば” joe” と” joey” の両方にマッチします ) </li></ul>
  8. 8. mongoDB でのクエリ (2) 配列 (※) <ul><li>products というコレクションに以下のようなドキュメントがあるとします。 </li></ul><ul><li>{ _id: ObjectId(&quot;4c4b1476238d3b4dd5003981&quot;), </li></ul><ul><li>slug: &quot;wheel-barrow-9092&quot;, </li></ul><ul><li>sku: &quot;9092&quot;, </li></ul><ul><li>tags: [“tools”, “equipment”, “soil”] (← タグ (tags) を配列で表現 ) </li></ul><ul><li>} </li></ul><ul><li>このドキュメントをタグ (tags) に” soil” が含まれるという条件で検索したい場合: </li></ul><ul><li>  > db.products.find({tags: &quot;soil&quot;}) </li></ul><ul><li>このクエリは tags フィールドにインデックスを張っていれば効率がよくなります。 </li></ul><ul><li>  > db.products.ensureIndex({tags: 1}) </li></ul>※ [Banker] p.106
  9. 9. mongoDB のインデックス <ul><li>・インデックスを作るには、 ensureIndex メソッドを使います。 </li></ul><ul><li>  > db.people.ensureIndex({“username” : 1}) </li></ul><ul><li>・ username は昇順で、 age は降順のインデックスを作成する場合 : </li></ul><ul><li>> db.people.ensureIndex({“username” : 1, “age”: -1}) </li></ul><ul><li>(“1” が昇順を、” -1” が降順を表します ) </li></ul><ul><li>・ユニークインデックスを作成する場合 : </li></ul><ul><li>  > db.people.ensureIndex({“username” : 1}, {“unique” : true}) </li></ul><ul><li>ただし、 insert のデフォルトの動作としては、その insert 文によってドキュメントが実際に追加されたかどうかチェックしません。 </li></ul><ul><li>  そのため、重要なデータの場合には各ドライバの getlasterror コマンドでチェックするか、ドライバの “ safe” モードを使う必要性が出てきます。 </li></ul>※ [Chodorow&Dirolf] chapter 5. Indexing
  10. 10. mongoDB でのインサート <ul><li>・ users という中身のないコレクションに” username” が” smith” というドキュメントを追加する場合 </li></ul><ul><li>> db.users.insert({“username” : “smith”}) </li></ul><ul><li>> db.users.find() </li></ul><ul><li>{ </li></ul><ul><li>“ _id” : ObjectId(“4ba0f0dfd22aa494fd523623”), </li></ul><ul><li>“ username” : “smith”, </li></ul><ul><li>} </li></ul><ul><li>  -> “ _id” の値はクライアント ( ドライバー ) で作成され、 mongoDB に格納されます。 </li></ul>
  11. 11. mongoDB での更新 <ul><li>・ユーザー” smith” のドキュメントに、国 “ Canada” を追加する場合 </li></ul><ul><li>  > db.users.update({“username” : “smith”), {$set: (“country”: “Canada”}}) </li></ul><ul><li>($set をつけないと、” username”=“smith” のドキュメントがすべて上書きされてしまいます ) </li></ul><ul><li>・ mongoDB はスキーマフリーなので、スキーマ構成変更命令なしで以下のような update を実行できます。 </li></ul><ul><li>> db.users.update( {“username”: &quot;smith&quot;}, </li></ul><ul><li>{ $set: {“favorites”: </li></ul><ul><li>{ </li></ul><ul><li>“ cities”: [&quot;Chicago&quot;, &quot;Cheyenne&quot;], </li></ul><ul><li>“ movies”: [&quot;Casablanca&quot;, &quot;The Sting&quot;] </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul>
  12. 12. mongoDB での削除 <ul><li>・ users コレクションから favorite.city が” Cheyenne” のドキュメントを削除する場合 </li></ul><ul><li>  > db.users.remove({&quot;favorites.cities&quot;: &quot;Cheyenne&quot;}) </li></ul><ul><li>・ users コレクションをまるごと削除する場合 </li></ul><ul><li>  > db.users.remove({ }) </li></ul>
  13. 13. ジャーナリング (※) <ul><li>・ version1.8 から、ジャーナリング機能が導入されました。ジャーナリング機能が有効化されると、 mongoDB はデータファイルに書き込む前に、そのデータをジャーナルに書き込むようになります。 </li></ul><ul><li>・ジャーナル機能が無効の場合 : </li></ul><ul><li>mongoDB はデータファイルをヴァーチャルメモリーにマップしており、ヴァーチャルメモリーを定期的にディスクに書き込みます。従ってサーバーが突然停止してしまった場合、メモリ上のデータは失われます。 </li></ul><ul><li>・ジャーナリング機能はデフォルトの設定では 100ms 間隔でメモリの内容をディスクに書き込みます。従ってデフォルト設定の場合、サーバー停止によって最大で 100ms ぶんのデータロストが発生します。 </li></ul>※ [Banker] p.265
  14. 14. レプリケーション (1) (※) <ul><li>・レプリカセット </li></ul><ul><li> ・レプリカセットは非同期なマスター / スレーブ構成のレプリケーションで、自動的なフェイルオーバー機能をもちます。 </li></ul><ul><li> ・プライマリ ( マスター ) ノードが存在しない場合、レプリカセットは自動的にプライマリを選出します。 </li></ul><ul><li> ・各言語のドライバーはプライマリが変わったことを検知し、新しいプライマリノードに書込みリクエストを送信します。 </li></ul>※ [Mongo] Replica Sets (http://www.mongodb.org/display/DOCSJP/Replica+Sets), (http://www.mongodb.org/display/DOCS/Replica+Sets)
  15. 15. レプリケーション (2) (※) <ul><li>・レプリカセットのフェイルオーバー (1) 2 台構成の場合 </li></ul><ul><li>  </li></ul>※ [Chodorow&Dirolf] p.130-p.131 (1) 通常状態。 プライマリはセカンダリに対してデータを同期します。   (2) プライマリ停止。 プライマリが停止すると、セカンダリがプライマリを引継ぎます。   (3) 旧プライマリ再起動。 旧プライマリが起動すると、新プライマリがセカンダリ ( 旧プライマリ ) にデータを同期します。   (1)   (2)   (3)  
  16. 16. レプリケーション (3) (※) <ul><li>・レプリカセットのフェイルオーバー (2) 5 台構成の場合 </li></ul>※ [Chodorow&Dirolf] p.135-p.136 (1) 通常状態。 プライマリはセカンダリに対してデータを同期します。   (2) プライマリ停止。 プライマリが停止すると、最もプライオリティが高いノード間でどれが最新のデータをもつかが比較されます。 (3) データ同期の再開。 新プライマリはセカンダリノードにデータを同期します。   (1)   (2)   (3)  
  17. 17. <ul><li>・シャーディング機能 : MongoDB はデータベースやコレクション、コレクション内のオブジェクトを、シャーディングキーに基づき、複数のシャードにまたがって、ダウンタイムなしで自動的に配布します。 </li></ul><ul><li>・ mongos: クライアントからのリクエストをそれぞれのシャードにルーティングします。 </li></ul><ul><li>・ config server: どのシステムにどんなシャードが存在しているかといったような、クラスタのメタデータを保存します。 </li></ul>シャーディング (※) ※ [Mongo] Sharding (http://www.mongodb.org/display/DOCSJP/Sharding), Sharding Introduction (http://www.mongodb.org/display/DOCS/Sharding+Introduction) レプリカセット
  18. 18. mongoDB のユースケース (1) (※) <ul><li>● 向いているケース </li></ul><ul><li>(1) web サイトの操作データの蓄積 </li></ul><ul><li> リアルタイムの insert, update, クエリ </li></ul><ul><li> スケーラビリティとレプリケーション </li></ul><ul><li>-> 例 . </li></ul><ul><li>- コンテンツ管理 (Web コンテンツを構成するテキストや画像、レイアウト情報などを一元的に保存・管理 ) </li></ul><ul><li>- コメントの格納、管理、投票 </li></ul><ul><li>- ユーザー登録、プロファイル、セッションデータ等の格納 </li></ul><ul><li>(2) キャッシング </li></ul><ul><li>(3) 大量データ </li></ul><ul><li>(4) プログラムのオブジェクトと JSON のデータ ( または同等のもの ) の格納 </li></ul><ul><li>(5) リアルタイム統計 / 解析 </li></ul><ul><li>(6) アーカイブとイベントのログ取得 </li></ul>※ [Mongo] Use Cases (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
  19. 19. mongoDB のユースケース (2) (※) <ul><li>● あまり向いていないところ </li></ul><ul><li>(1) 銀行系のように複雑なトランザクションに重点を置くシステム </li></ul><ul><li>- mongoDB は単一のドキュメントに対するアトミックな操作はサポートしていますが、マルチ・オブジェクト・トランザクションをサポートしていません。 </li></ul><ul><li>(2) 伝統的なビジネスインテリジェンス (BI) </li></ul><ul><li>- mongoDB はリアルタイムにデータを計算したり集約したりするのに向いていますが、夜間にバッチで動かすような BI には向いていません。 </li></ul><ul><li>(3) SQL を必要とする問題 </li></ul><ul><li>  - mongoDB は SQL をサポートしていません。 </li></ul>※ [Mongo] Use Cases (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
  20. 20. mongoDB はどんなところで使われているか (1-1) (※) <ul><li>・ foursquare </li></ul><ul><li>foursquare はスマートフォンの GPS 機能を使った位置情報 SNS です。 [Nikkei-Trendy] </li></ul><ul><li>  ・お店や駅など、自分がいる場所でチェックインすると、自分の場所がネット上に登録され、友人に公開されます。 </li></ul><ul><li>  ・ Tips といって自分の訪れたお店や施設について情報を書き込み、それを他の人が読むことができる機能があります。 </li></ul><ul><li>  ・他にも「品川駅に来たらこの店に行く」などとタスクを書いておくと、品川駅近辺でチェックインしたときにタスクを自動的に通知してくれる To-Do List 機能もあります。 </li></ul>※ [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
  21. 21. mongoDB はどんなところで使われているか (1-2) <ul><li>・ foursquare ( 続き ) </li></ul><ul><li>foursquare では、 25 台以上の Amazon EC2 サーバー上のシャーディングした mongoDB に、ユーザーの”チェックイン”情報を格納しています。また、お店や駅などの場所の情報に、 mongoDB の地理空間インデックスを使っています。 (※) </li></ul><ul><li>( 例 )  基本的なクエリ </li></ul><ul><li>与えられた位置情報に近いお店や施設を 20 個みつける場合 </li></ul><ul><li>> db.venues.find({latlng: {$near: [40.72, -73.99]}).limit(20) </li></ul>※ [Heymann] p8 現在地 …
  22. 22. mongoDB はどんなところで使われているか (2) <ul><li>・ Ameba Pico ( 仮想空間サービス「アメーバピグ」の海外版 ) </li></ul><ul><li>  Ameba Pico では、 AWS と以下の </li></ul><ul><li>技術を使用しています。 (※1 。図も ) </li></ul><ul><li>- MongoDB </li></ul><ul><li>- node.js </li></ul><ul><li>- WebSocket </li></ul><ul><li>- Flash Player </li></ul>※ 1 [Namura] p.6, p.9 ※ 2 [AmebaPico] スクリーンショット (※2)
  23. 23. mongoDB はどんなところで使われているか (3) (※) <ul><li>・ intuit </li></ul><ul><li>intuit では、小規模ビジネス用の web サイトにおいて、ユーザーの活動状況をリアルタイムに記録するのに mongoDB を使用しています。 </li></ul>mongoDB は、 craigslist, sourceforge, NY times, Springer, Taobao, サイバーエージェント等の有名な会社、組織で多数採用されています。 ※ [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
  24. 24. 参考文献 <ul><li>・ [Mongo] MongoDB ホームページ (http://www.mongodb.org/) </li></ul><ul><li>・ [Chodorow&Dirolf] ”MongoDB: The Definitive Guide”, Kristina Chodorow & Michael Dirolf, 2010, O’reilly </li></ul><ul><li>・ [Banker] ”MongoDB in Action”, Kyle Banker, 2011, Manning MEAP Edition version 8 </li></ul><ul><li>・ [Inoue-1] ”MongoDB 全機能解説 (1)”, 井上 敬浩 , 2011, MongoDB 勉強会 第 3 回 資料 (http://www.slideshare.net/doryokujin/mongodb1) </li></ul><ul><li>・ [Namura] “MongoDB + node.js で作るソーシャルゲーム” , 名村 卓 , 2011, Mongo Tokyo 2011 資料 (http://www.slideshare.net/snamura/mongodb-nodejs) </li></ul><ul><li>・ [AmebaPico] “About Ameba Pico” (http://www.cyberagentamerica.com/games/) </li></ul><ul><li>・ [Wikipedia] Wikipedia 英語版 MongoDB (http://en.wikipedia.org/wiki/MongoDB) </li></ul><ul><li>・ [Nikkei-Trendy] “Twitter の次に来るのか、新世代ソーシャルサービス「 foursquare 」って何だろう?” , 日経トレンディネット , 2011/2/25 (http://trendy.nikkeibp.co.jp/article/pickup/20110223/1034598) </li></ul><ul><li>・ [Heymann] “Foursquare & MongoDB”, Harry Heymann, 2010 (https://docs.google.com/present/view?id=dhkkqm6q_13gm6jq5fv) </li></ul>

×