「MongoDB」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Turin9 (会話 | 投稿記録)
新しいリリース番号を反映(2.6.7)
m →‎Sharding: シャーディング(Sharding)
137行目: 137行目:
MongoDBは、レプリカセット (Replica Sets) と呼ぶ仕組みによって高い可用性を提供する。1つのレプリカセットはデータの2つ以上のコピーからなる。レプリカセットの各メンバーは、常時、プライマリレプリカもしくはセカンダリレプリカとしての役割を果す。プライマリレプリカはすべての書き込みおよび読み込みを実行する。セカンダリレプリカは、組み込みのレプリケーションを用いて、プライマリにあるデータのコピーを保持する。プライマリレプリカが機能しなくなった時は、レプリカセットが自動的に投票プロセスを開始して、どのセカンダリがプライマリになるべきかを決定する。
MongoDBは、レプリカセット (Replica Sets) と呼ぶ仕組みによって高い可用性を提供する。1つのレプリカセットはデータの2つ以上のコピーからなる。レプリカセットの各メンバーは、常時、プライマリレプリカもしくはセカンダリレプリカとしての役割を果す。プライマリレプリカはすべての書き込みおよび読み込みを実行する。セカンダリレプリカは、組み込みのレプリケーションを用いて、プライマリにあるデータのコピーを保持する。プライマリレプリカが機能しなくなった時は、レプリカセットが自動的に投票プロセスを開始して、どのセカンダリがプライマリになるべきかを決定する。


===シャーディング(Sharding)===
===Sharding===


MongoDBは、Sharding<ref name="sharding">[http://www.mongodb.org/display/DOCS/Sharding sharding]</ref>というシステムによって水平スケーリングが可能である。これは[[BigTable]]や[[PNUTS]]のスケーリングモデルに非常に良く似ている。開発者はshardキーを選択し、このキーがデータをどのように分散させるかを決める。データ中のキーを元にデータを分散させるshardが決められる。(一つのshardは1つ以上のスレーブを持つマスタである)
MongoDBは、シャーディング(Sharding)<ref name="sharding">[http://www.mongodb.org/display/DOCS/Sharding sharding]</ref><ref>[http://www.atmarkit.co.jp/ait/articles/1211/09/news056_3.html 開発者が知っておくべき、ドキュメント・データベースの基礎 (3/3)]</ref>というシステムによって水平スケーリングが可能である。これは[[BigTable]]や[[PNUTS]]のスケーリングモデルに非常に良く似ている。開発者はshardキーを選択し、このキーがデータをどのように分散させるかを決める。データ中のキーを元にデータを分散させるshardが決められる。(一つのshardは1つ以上のスレーブを持つマスタである)


アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。<ref name="findAndModify">[http://www.mongodb.org/display/DOCS/findAndModify+Command#]</ref> アプリケーションは、`mongos`と呼ばれる特別なルーティングプロセスと対話する。このプロセスは、shardクラスタを単一のMongoDBサーバに見えるようにする。`mongos`プロセスはどのデータがどのshardにあるかを知っており、クライアントのリクエストを適切にルーティングする。すべてのリクエストはこのプロセスを通して流れる: リクエストやレスポンスを転送するだけでなく、必要に応じてマージやソートも行う。 `mongos`プロセスはいくつでも実行できるが、通常は1つのアプリケーションに対して1つが推奨される。
アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。<ref name="findAndModify">[http://www.mongodb.org/display/DOCS/findAndModify+Command#]</ref> アプリケーションは、`mongos`と呼ばれる特別なルーティングプロセスと対話する。このプロセスは、shardクラスタを単一のMongoDBサーバに見えるようにする。`mongos`プロセスはどのデータがどのshardにあるかを知っており、クライアントのリクエストを適切にルーティングする。すべてのリクエストはこのプロセスを通して流れる: リクエストやレスポンスを転送するだけでなく、必要に応じてマージやソートも行う。 `mongos`プロセスはいくつでも実行できるが、通常は1つのアプリケーションに対して1つが推奨される。

2015年2月17日 (火) 07:41時点における版

MongoDB
開発元 MongoDB Inc.
初版 2009年 (15年前) (2009)
最新版
2.6.7 / 2015年1月14日 (9年前) (2015-01-14)
リポジトリ ウィキデータを編集
プログラミング
言語
C++
対応OS クロスプラットフォーム
対応言語 英語
種別 ドキュメント指向データベース
ライセンス GNU AGPL v3.0
(ドライバはApache License
公式サイト www.mongodb.org
テンプレートを表示

MongoDBは、オープンソースドキュメント指向データベースである。C++言語で記述されており、開発とサポートはMongoDB Inc.によって行なわれている。[1]

概要

MongoDBはRDBMSではなく、いわゆるNoSQLと呼ばれるデータベースに分類されるものである。RDBMSのようにレコードをテーブルに格納するのではなく、「ドキュメント」と呼ばれる構造的データをJSONライクな形式で表現し、そのドキュメントの集合を「コレクション」として管理する(このデータの物理的な格納はBSONと呼ばれるJSONのバイナリ版といえる形式で行われる)。コレクションはRDBMSのような固定的なスキーマを持たない。ドキュメントには複雑な階層構造を持たせることもでき、それらの構造に含まれるフィールドを指定したクエリやインデクス生成も簡単な指定によって行える。RDBMSのように高度な結合操作を効率的に行うことはできないが、データの追加・更新・削除・クエリは高速に行うことができる。また、アプリケーションは自身の構造やデータ型に合った自然な形でデータを格納することができるため、扱うデータの特性によっては、RDBMSよりも容易かつ迅速に開発を行うことができる可能性がある。

Mongoという名前は、英語で「ばかでかい」を意味する "humongous" に由来する。

MongoDBの開発は10gen(現MongoDB Inc.)によって2007年10月から開始され、最初の公開リリースは2009年2月に行われた。[2]

特徴

特徴の一部:

  • 整合的なUTF-8エンコーディング。非UTF-8データも、特殊なバイナリデータ型によって保存・取得できる。
  • クロスプラットフォームのサポート: バイナリは、Windows, Linux, OS X, Solarisで利用できる。MongoDBはほとんどのリトルエンディアンシステムで利用できる。
  • 豊富なデータ型: 日付、正規表現、バイナリ型、コード、など(すべてのBSONデータ型)
  • クエリ結果にカーソルが使える

アドホックなクエリ

MongoDBでは、任意のフィールドを好きな時にクエリできる。フィールドの完全一致に加えて、範囲をもつクエリ、正規表現検索など様々な種類のクエリが使える。ユーザ定義のJavaScript関数を述語として使うこともできる(関数がtrueを返したときにドキュメントがマッチする)。

クエリでは、(全フィールドをとりだす代わりに)指定したフィールドだけを取り出せる。また、ソートを行ったり、結果の数を制限したり、一部をスキップすることもできる。

ネストされたフィールドのクエリ

埋め込みオブジェクトおよび配列にも「たどりつく」ことができる。以下のオブジェクトが users コレクションに挿入されているとする:

{
    "username" : "bob",
    "address" : {
        "street" : "123 Main Street",
        "city" : "Springfield",
        "state" : "NY"
    }
}

このドキュメント(およびNYの住所をもつすべてのドキュメント)は、以下のクエリで取得できる:

> db.users.find({"address.state" : "NY"})

配列の要素を指定することもできる:

> db.food.insert({"fruit" : ["peach", "plum", "pear"]})
> db.food.find({"fruit" : "pear"})

インデックス

MongoDBは、追加のインデックスをサポートする。インデックスは、単一キー、複合キー、ユニーク/非ユニーク、地理空間インデクス[3]をサポートする。ネストされたフィールドもインデックスできるし、配列型をインデックスすると配列内の各要素がインデックスされる。

MongoDBのクエリオプティマイザはクエリの実行時にいくつかのクエリ計画を試し、最速のものを選択する。定期的に再サンプリングを行う。開発者は使用されるインデックスを `explain` 関数で見ることができ、 `hint` 関数で異なるインデックスを参照できる。

インデックスはいつでも作成・削除できる。

集約

アドホックなクエリに加えて、MongoDBは集約のためのいくつかのツールをサポートしている。これには、SQLのGRUOP BYに似たgroup関数や、MapReduce[4]などがある。

ファイルストレージ

MongoDBは、GridFS[5]と呼ばれるプロトコルを実装しており、これを使うことで大きなファイルをデータベースに格納・取得することができる。このファイルストレージ機構はnginx[6]lighttpd [7]のプラグインからも使用できる。

サーバサイドJavaScript実行

JavaScriptはMongoDBにおけるLingua franca(共通語)であり、クエリや集約関数(MapReduce等)で使用したり、データベースに直接送信して実行できる。

クエリでのJavaScriptの例:

> db.foo.find({$where : function() { return this.x == this.y; }})

データベースに送信して実行させるコードの例:

> db.eval(function(name) { return "Hello, "+name; }, ["Joe"])

これは "Hello, Joe" を返す。

JavaScriptの変数はデータベースに格納でき、他のJavaScriptからグローバル変数として利用できる。関数を含むすべての正当なJavaScript型を格納できるため、JavaScriptを「ストアドプロシージャ」として利用できる。

Cappedコレクション

MongoDBは、Cappedコレクションと呼ばれる固定サイズのコレクションもサポートしている[8]。Cappedコレクションはサイズ(オプションで要素数も使える)を指定して作成される。capped collectionsは、挿入した順にコレクションを管理する: 指定したサイズに到達したら、古いものから順に削除される。

Cappedコレクションでは、tailable cursor[9]と呼ばれる特殊なカーソルを利用できる。このカーソルの名前は `tail -f` に由来し、結果を返し終えてもクローズせずに待機し続けて、それ以降に追加されたドキュメントを返却しつづける。

デプロイ

MongoDBはソースファイルからビルドすることもできるが、より一般的にはバイナリパッケージからインストールされる。多くのLinuxパッケージ管理システムはMongoDBのパッケージを含んでいる: CentOSとFedora,[10] DebianとUbuntu,[11] Gentoo[12], Arch Linux。[13] 公式Webサイトから入手することもできる。[14]

MongoDBはメモリマップトファイルを用いるため、32-bitシステムではサイズが2GBに制限される。[15] MongoDBのサーバはリトルエンディアンのシステムのみで動作する。ただし、ほとんどのドライバはビッグエンディアンのシステムでも動作する。

言語サポート

MongoDBは、以下の言語に公式ドライバを提供している:

非公式のドライバも大量に存在する: C#と.NET,[18] ColdFusion,[28] Delphi,[29] Erlang,[30][31] Factor,[32] Fantom,[33] Go,[34] Java VM 言語(Clojure, Groovy,[35] Scala など),[36] Lua,[37] node.js,[38] HTTP REST,[39] Ruby,[40] Racket,[41] Smalltalk[42]

レプリケーション

MongoDBは、レプリカセット (Replica Sets) と呼ぶ仕組みによって高い可用性を提供する。1つのレプリカセットはデータの2つ以上のコピーからなる。レプリカセットの各メンバーは、常時、プライマリレプリカもしくはセカンダリレプリカとしての役割を果す。プライマリレプリカはすべての書き込みおよび読み込みを実行する。セカンダリレプリカは、組み込みのレプリケーションを用いて、プライマリにあるデータのコピーを保持する。プライマリレプリカが機能しなくなった時は、レプリカセットが自動的に投票プロセスを開始して、どのセカンダリがプライマリになるべきかを決定する。

シャーディング(Sharding)

MongoDBは、シャーディング(Sharding)[43][44]というシステムによって水平スケーリングが可能である。これはBigTablePNUTSのスケーリングモデルに非常に良く似ている。開発者はshardキーを選択し、このキーがデータをどのように分散させるかを決める。データ中のキーを元にデータを分散させるshardが決められる。(一つのshardは1つ以上のスレーブを持つマスタである)

アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。[45] アプリケーションは、`mongos`と呼ばれる特別なルーティングプロセスと対話する。このプロセスは、shardクラスタを単一のMongoDBサーバに見えるようにする。`mongos`プロセスはどのデータがどのshardにあるかを知っており、クライアントのリクエストを適切にルーティングする。すべてのリクエストはこのプロセスを通して流れる: リクエストやレスポンスを転送するだけでなく、必要に応じてマージやソートも行う。 `mongos`プロセスはいくつでも実行できるが、通常は1つのアプリケーションに対して1つが推奨される。

管理とグラフィカルフロントエンド

公式ツール

最もパワフルで便利な管理ツールはデータベースシェルの mongo である。このシェルは、データベースの内容を閲覧・挿入・削除・更新する機能を提供すると同時に、レプリケーション情報を取得したり、shadingを設定したり、サーバを停止したり、JavaScriptを実行したりすることができる。mongoは、SpiderMonkeyの上に構築されているため、MondoDBサーバに接続できると同時に、完全なJavaScriptシェルでもある。

管理情報にはWebベースのadminインタフェースを通してもアクセスできる。これは、現在のサーバ情報を送信するシンプルなHTMLのWebページである。デフォルトでは、このインタフェースにはデータベースのポートの1000番上のポート (http://localhost:28017) からアクセスできる。--norestオプションによってこの機能を無効化できる。

mongostat は、直近の統計情報のシンプルな一覧を表示するコマンドラインツールである。挿入された数、更新された数, 削除された数, クエリの数, 実行されたコマンドの数, データベースがロックされた時間のパーセンテージ、メモリの使用状況などを表示する。

mongosniff は、MongoDBのネットワークトラフィックを覗くツールである。

監視

MongoDBを監視するためのプラグインが存在する:

GUI

データの可視化を助けるいくつかのGUIが開発されている:

  • Fang of Mongo[50] - DjangoとjQueryで作られたWebベースのUI
  • Futon4Mongo[51] - CouchDBのFuton Webインタフェースのクローン
  • Mongo3[52] - Rubyベースのインタフェース
  • MongoHub[53] - MongoDBを管理するためのネイティブなOS Xアプリケーション
  • Opricot[54] - PHPで書かれたWebベースのMongoDBシェル
  • Database Master - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • BI Studio - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • RockMongo - PHPベース

ライセンスとサポート

MongoDBは、GNU Affero General Public Licenseライセンスの下で利用できる。言語ドライバはApache Licenseライセンスの下で利用できる。[55]

批判

  • データの永続性が保証されないという指摘がある[56]

有名な利用者

関連項目

脚注

  1. ^ MongoDB website
  2. ^ MongoDB Blog - March 2010
  3. ^ Geospatial indexes
  4. ^ MapReduce
  5. ^ GridFS
  6. ^ NGINX
  7. ^ lighttpd
  8. ^ capped collections
  9. ^ [1]
  10. ^ CentOS and Fedora
  11. ^ Debian and Ubuntu,
  12. ^ Gentoo
  13. ^ Arch Linux
  14. ^ official website
  15. ^ [2]
  16. ^ C driver
  17. ^ C++ driver
  18. ^ a b C# driver 引用エラー: 無効な <ref> タグ; name "csharp"が異なる内容で複数回定義されています
  19. ^ Haskell driver
  20. ^ Java driver
  21. ^ JavaScript driver
  22. ^ [3]
  23. ^ Perl driver
  24. ^ PHP driver
  25. ^ Python driver
  26. ^ Ruby driver
  27. ^ Casbah, the officially supported Scala Driver for MongoDB
  28. ^ ColdFusion driver
  29. ^ Delphi
  30. ^ Emongo Erlang driver
  31. ^ Erlmongo Erlang driver
  32. ^ Factor driver
  33. ^ Fantom driver
  34. ^ gomongo Go driver
  35. ^ GMongo
  36. ^ JVM language center
  37. ^ LuaMongo
  38. ^ node.js driver
  39. ^ REST interface
  40. ^ rmongo
  41. ^ [4]
  42. ^ Smalltalk driver
  43. ^ sharding
  44. ^ 開発者が知っておくべき、ドキュメント・データベースの基礎 (3/3)
  45. ^ [5]
  46. ^ Munin plugin
  47. ^ Ganglia plugin
  48. ^ Scout slow-query plugin
  49. ^ Cacti plugin
  50. ^ Fang of Mongo
  51. ^ Futon4Mongo
  52. ^ Mongo3
  53. ^ MongoHub
  54. ^ Opricot
  55. ^ The AGPL - MongoDB Blog: May 5, 2009
  56. ^ Broken by Design: MongoDB Fault Tolerance
  57. ^ MongoDB Powering MTV's Web Properties” (2011年5月10日). 2011年7月6日閲覧。
  58. ^ MongoDB live at craigslist” (2011年5月16日). 2011年7月6日閲覧。
  59. ^ Disney Central Services Storage: Leveraging Knowledge and skillsets” (2011年5月24日). 2011年7月6日閲覧。
  60. ^ 12 Months with MongoDB” (2010年10月25日). 2011年5月24日閲覧。
  61. ^ MongoDB - diasporatest.com” (2010年12月23日). 2010年12月23日閲覧。
  62. ^ Implementing MongoDB at Shutterfly - Presentation at MongoSF” (2010年4月30日). 2010年6月28日閲覧。
  63. ^ MongoDB at foursquare - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  64. ^ bit.ly user history, auto-sharded - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  65. ^ Maher, Jacqueline (2010年5月25日). “Building a Better Submission Form”. NYTimes Open Blog. http://open.blogs.nytimes.com/2010/05/25/building-a-better-submission-form/ 2010年6月28日閲覧。 
  66. ^ How Python, TurboGears, and MongoDB are Transforming SourceForge.net”. PyCon 2010 (2010年2月20日). 2010年6月28日閲覧。
  67. ^ How This Web Site Uses MongoDB”. Business Insider (2010年11月6日). 2010年6月28日閲覧。
  68. ^ MongoDB at Etsy”. Code as Craft: Etsy Developer Blog (2010年5月19日). 2010年6月28日閲覧。 [リンク切れ]
  69. ^ Holy Large Hadron Collider, Batman!”. The MongoDB NoSQL Database Blog (2010年6月3日). 2010年8月3日閲覧。
  70. ^ Building Our Own Tracking Engine With MongoDB”. Thumbtack Blog (2011年5月3日). 2011年5月15日閲覧。
  71. ^ http://appscale.cs.ucsb.edu/datastores.html#mongodb
  72. ^ Node.js Meetup: Distributed Web Architectures ? Curtis Chambers, Uber | JoyentCloud:”. 2011年8月12日閲覧。

外部リンク