3月25日にMongoDB("humongous"より)1.4がリリースされた直後に、そのクリエータであるDwight Merriman氏(DoubleClickの前CEOおよびCTO)は、10gen(オープンソースのドキュメント・データベースを支援する企業)が、この製品の商用のトレーニングおよびサポートを提供する予定であることを発表した。
InfoQはこの機会を利用し、MongoDBについて、またその機能、適用範囲、NoSQLデータベースのコミュニティにおける立場についてMerriman氏に話を聞いた。Merriman氏の回答は、本記事の該当セクションで引用している。
MongoDBの概要
MongoDBは、スケーラブルでハイパフォーマンスな次世代データベースです。MongoDBのデータはドキュメントとして1つのデータ・オブジェクト内にすべて格納されます。これにより、複雑なリレーションシップを表すことができます。ドキュメントは、プリミティブ型の個別のフィールド("埋め込みドキュメント")、またはドキュメントの配列で構成されます。
このように、フレキシブルな構造になっているため、開発者は、別テーブルへのデータ分割に依存せずに、問題のほとんどの部分をフレキシブルかつ処理しやすい方法でモデル化できます。1つのドキュメントとしてデータのモデル化が最適に行われていない場合、MongoDBには、ドキュメント内のフィールドから別のドキュメントへのポインタを意味する、"DBRef"というコンセプトがあります。
MongoDBデータベースからのデータの取得やクエリは、フレキシブルに行えます。メインのドキュメントをベースに、ドキュメント内のあらゆるフィールド、埋め込みドキュメント、または配列内のドキュメントを動的にクエリできます。埋め込みドキュメントを指定するには、ドット表記を使用します。
機能
MongoDBはC++で記述されており、以下のような機能がある。
- ドキュメント指向ストレージ(JSONをベースとしたパワフルでフレキシブルなデータ・スキーマ)
- インナー・オブジェクト、組み込み配列、地理空間情報
- 動的クエリ
- 補助インデックスを含む、完全なインデックスのサポート
- クエリ・プロファイリング
- 高速なインプレースでのアップデート
- バイナリ・ラージ・オブジェクトの効率的な保存(例: 写真や動画)
- レプリケーションおよびフェイルオーバ機能のサポート
- クラウドレベルのスケーラビリティを備えたauto-sharding(alpha版)
- 複雑な集約のためのMapReduce
- 商用サポート、トレーニング、コンサルティング
原点と目的
MongoDBの目的について、ブログでは次のように述べられている。
問題のごく一部に対するニッチなデータベースを目的として、MongoDBを設計したわけではありません。MongoDBは、開発者コミュニティの大部分における実世界の多くの問題を解決する新しいタイプのデータベースです。
MongoDBプロジェクトの目的は、スケーラビリティの高さ、パフォーマンス、開発のしやすさなど、非リレーショナル・モデルの最も優れた特徴を、従来のデータベース(主要なオペレーショナル・データストアでは有用)では一般的である、重要な機能を用いて組み合わせることです。
MongoDBはラボで設計されたものではありません。われわれは、規模が大きく、可用性も高く、堅牢なシステムを構築した経験に基づいてMongoDBを作成しました。
MongoDBは16カ月前の2009年11月2日に、まず一般に向けてリリースされた。背景にある設計理念では、「スケーラビリティやパフォーマンスを優先し、トランザクションのセマンティックスは緩和されているものの、広く導入してもらい普及させるには、単なる純粋なキーバリュー・ストアではなく、もっと機能を充実させる必要がある」と説明している。
DDDとの関連
ドキュメント・パラダイムは、複雑なオブジェクト構造の永続化に向けた興味深いアプローチである。特に、ドメイン駆動設計(DDD)が提案する集約は、他のエンティティからのリンクが可能なのはルート・エンティティに限られており、依存するエンティティと値は、ルートを介してのみアクセス可能となっている。MongoDBベースのリポジトリであれば、DDDに基づくプロジェクトで永続性を実現するためのシンプルなアプローチが可能となる。関連する別の考え方に、ビジネス・ドメインは、ビジネス・エンティティと関連している場合には、ドキュメントについて表わすことが多いという事実関係がある。このため、ドキュメントを表記として内部的に使用すれば、他のデータ構造やオブジェクトそのものを使用するよりも、優れた適合性を実現できる可能性もある。
さらに、スキーマレスなドキュメント・データベースの場合、データ・モデリングは、いっそう重要となる。ドキュメントを作成する前に慎重に検討すべきリレーションシップの側面がいくつか存在し、これを行わないと、データの重複やパフォーマンスの劣化などの問題を引き起こすことになる。
サンプルとチュートリアル
たとえば、メイン記事、コメント、コメントへの投票を含むブログの投稿では、リレーショナル・データベースの場合、複数のテーブルに分割されることになります。MongoDBでは、ブログの投稿は、メイン記事のドキュメント内にコメントや投票をドキュメントの配列として含む1つのドキュメントとして表わすことができます。このアプローチを使用すると、データを処理しやすくなり、従来のリレーショナル・データベースでは、パフォーマンスや水平方向に拡張する際の妨げとなっていたJOIN処理の必要性が軽減されます。
> db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1}, comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post" }] }) > db.blogposts.find( { "author.name" : "Jane" } ) > db.blogposts.findOne({ title : "My First Post", "author.name": "Jane", comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post" } ] }) > db.blogposts.find( { "comments.by" : "Ada" } ) > db.blogposts.ensureIndex( { "comments.by" : 1 } );
このサンプルは、対話的なMongoDB web console shellで直接試すことができ、オンラインのチュートリアルも組み込まれている。
InfoQのCTOであるAlex Popescu氏が運営するサイト、myNoSQLには、NoSQLデータストア(MongoDBなど)に関するニュース、レビュー、比較などが数多くあり、その一例として、プロダクション・ノートを手掛けている。
Teach Me To Codeでは、MongoDBのさまざまな側面を紹介する3つのスクリーンキャストが公開されている。
Pivotallabsでは、10genのMichael Dirolf氏による導入用のプレゼンテーションが動画および音声バージョンで提供されている。Kyle Banker氏がMongoDBに関して全体的な見解を述べたプレゼンテーションも、slideshareで閲覧できる。
インストールおよび統合
MongoDBは、GNU AGPL v3.0ライセンスで公開されており、mongodb.org内のドライバのライセンスには、Apache License v2.0が採用されている。C++のソースコードは、githubから入手でき、どのオペレーティング・システムでもビルド可能だ。
また、Linux、MacOS X、Windows、およびSolaris用のバイナリ・パッケージとしてインストールすることもできる。
MongoDB自体は、mongod
デーモン・プロセス(コア・データベース・サーバ)として実行され、これに各種ドライバがアクセスする。Shardingのサポートとデータベース・ルーティングは、mongos
サービスが提供する。
ほぼすべてのプログラミング言語においてMongoDBがサポートされるよう、統合に取り組んでおり、C、C++、C# & .NET、ColdFusion、Erlang、Factor、Java、Javascript、PHP、Python、Ruby、Perl 、その他多くのドライバが利用できる。
MongoDBは、gremlin(グラフ・データベースのライブラリ)のコネクタ・ライブラリである"blueprints"など、他のフレームワークでもサポートされている。
また、スケーラブルなアクター・フレームワークAkkaで利用可能な永続化モジュールの一つとして、Debasish Ghosh氏によって統合された。
運用とスケーラビリティ
運用上、MongoDBはアプリケーションのニーズに応じて、2つのモードで実行できます。1つは、'single master'モードで、1つのsingle masterサーバがすべての書き込みを行います。読み込みは、このデータベースから行うか、読み込みのスケーラビリティを考慮して、任意の数の読み込みスレーブからも実行できます(Sourceforgeの使用事例)。
データ量や書き込みの頻度が非常に多く、single masterで処理するのが難しいアプリケーションの場合は、MongoDBのauto-shardingモード(現時点ではalpha版)を利用できます。このモードでは、任意の数の'shard'(shardとは、単純に1つ以上のMongoDBサーバの集まり)の間で、書き込みが自動的に分散されます。各サーバは、データセットの一部の読み書きを担当します。
いずれの場合も、MongoDBは'強固な一貫性'のアプローチを取ります(MongoDBはCAP定理におけるC-Pシステムと考えられます)。データを複数のMongoDBノードにレプリケートすることによって、高可用性を実現しています。そのいずれも、ある時点でshard内のマスタとしての役割を果たすことがあり、MongoDBはこれを自動的にフェイルオーバします。 このアプローチにより、極めて書き込みに対する高度な可用性を常に維持しつつ、強固な一貫性という多くの使用事例にとって重要な特性がもたらされます。
mongodbのサイトには、管理者向けの情報があり、運用上の要件をサポートする以下のような項目がある。
- Admin UIs(英語)
- Hosting Center(英語)
- Import Export Tools(英語)
- モニターと診断、DBA Operations from the Shell(英語)
- データベースプロファイラ
- Sharding、レプリケーション
- Production Notes(英語)
- Security and Authentication(英語)
- Mongoアーキテクチャ
- バックアップ、Troubleshooting(英語)、耐障害性と修復
ドキュメンテーション、サポート、トレーニング
MongoDBのドキュメンテーションは、mongodb.org wikiから、クリエイティブ・コモンズ・ライセンスで利用できる(PDF版はこちら)。
10genは、アプリケーション開発コミュニティの多くに対し、実世界の問題を解決するためにMongoDBを設計してきました。その意味では(さらに、お客様の導入事例からも明らかなように)、MongoDBはデータベース支援型アプリケーションの多くにとって、データストレージに向けたアプローチになると考えています。
現在10genでは、製品アプリケーションにてMongoDBを使用するお客様を対象に、サポート、コンサルティング、トレーニングを提供しています。近い将来、クラウドベースのサービス(MongoDBのサービスがホストするような)や、大規模なMongoDBクラスタ用の高度な管理ツールも10genから提供する予定です。
最近の使用事例
MongoDBは、バージョン1.3から頻繁にプロダクション環境で使用されている。データストアの適応事例で著名なものを以下に示す。
- Boxed Ice
- SourceForge
- Justin.tv
- GitHub
- The Business Insider
- Disqus
もちろん、ドキュメントストアの使用事例は、この他にもたくさんある。
今後の開発予定
MongoDBチームは、データストアに関して非常に幅広いビジョンを持っている。彼らは、対象とする機能の約半分を最新の1.4リリースに取り入れることを検討しており、来年取りかかる予定だ。
- 優れたレプリケーション: リアルタイム、レプリカセット、データの耐障害性に対するオプションの追加
- プロダクション対応のSharding
- 埋め込みドキュメントとの連携機能の追加
- さらにアトミックなアップデートオペレータのフラッシュアウト
- シングル・サーバの耐障害性
- フルテキスト検索