MongoDBドキュメントチュートリアル
こんにちは@doroykujinです。まずは皆さんのおかげでMongoDB JPを立ち上げることができ、かつ150名以上の方に参加していただいている事に感謝したいと思っています。今後積極的な活動を行っていきますのでどうぞ宜しくお願いします。
さて、本エントリーはMongoDB JPの方で日本語ドキュメントを手伝ってくれる方を募集し、かつどの部分を翻訳したいですかと尋ねたところ、「ドキュメントの構成がどうなっているのかわからない」という貴重なご意見を頂きました。確かにおっしゃるとおりでどのようなドキュメントの構成なんてわかりませんよね、しかもそれをすぐに把握するのも大変ですし。そこで今回はドキュメントがどのような構成になっているのか、ドキュメントに沿ってMongoDBの機能を簡単に紹介するようなチュートリアルをやってみたいと思います。そういう意味で全て本家ドキュメントからの引用になります。
なお、前エントリー、MongoDBのちょっと詳しいチュートリアルも参考になると思いますので宜しくお願いします。
※日本語ドキュメント訳には現在10名程度の方が手を挙げて下さっています。本当にありがとうございます。実際の進め方や管理方法、用語の統一など、スムーズな作業ができるようにそちらの環境を整えていきますので宜しくお願いします。もし経験者の方で複数人での訳の進め方について何かアドバイスがございましたらコメントいただけると幸いです。
ドキュメントインデックス
現在のドキュメントの目次は以下のようになっています。本日のアジェンダはこの目次に沿って行きたいと思います。フライングしますが、Aboutのページはあまり読まれなかったりしますが、かなりの情報が詰まっていますので是非とも見落とさずに読んでみて下さいね。
1. Introduction
まず一番初めに見るべきイントロダクションです。10gen CTOであるEliot Horowitz氏の言葉に始まり、MongoDBの特徴、
- Document-oriented
- High performance
- High availability
- Rich query language
が簡単に書かれています。箇条書きで詳しく書かれていないのであまり読む必要は無いような気がします。
2. Quickstart
Windows、Mac、Linuxでのインストール手順が記載されています。各種32bit/64bitが選べますが、オンメモリーデータベースにおける32bitの利用はデータが2GBに限られるというかなり厳しい制約を受けるため、できる限り64bitをインストールするようにして下さい。
3. Downloads
本ブログ執筆時点(2010年11月22日)の最新安定バージョンは 1.6.4 です。このバージョンでかなり多くの改善がなされたので、今から導入される方はこのバージョンをお薦めします。1.6 Release Notesより、主な変更点を記しますと、
Sharding
Sharding がこのバージョンで初めて正式にサポートされました。スケーラブルで単一障害点を持たず、設定・管理が非常に簡単で、かつ現在の単体構成から容易にスケールさせることのできるMongoDBの魅力的な機能です。
Replica Sets
従来のMaster/Slave構成・Replica Pair構成に加えて新たにReplica Sets構成が加わりました。正しく言えばReplica Pairの拡張で、Pairの2台構成からSetsは7台構成まで可能になりました。ではなぜ7台なのか、その台数で必要十分であるということをMongoDBの代表的なプロダクションカンパニーであるBoxed IceのブログWhen would ever need more than 7 replica set members?で書かれています。Boxed IceのMongoDBに関するブログ記事はとても参考になります。
その他 - クエリの強化・64bit
その他、いくつかの機能が改善されています。例えば$or、$slice オペレーターが増え、1コレクション当たり64インデックス(以前は40)を作成できるようになりました。
4. Drivers
MongoDBは非常に多くの言語でドライバをサポートしています。ここに掲載されている以外でも多数のドライバが存在します。また、RubyOnRailsやDjango、@cakephperさんの作られたCakePHPといったフレームワークのORMとしてのライブラリも各種充実しています。現在サポートされている言語は、
になっています。さらに最近ではRからMongoDBを呼び出せるRmongoやmongo-hadoopといったHadoopとの連携をサポートするツールも公開されるようになってきました。特にHadoopとの連携は今後サポートを強化していくという正式アナウンスがありました。今後が楽しみですね。
5. Developer Zone
さて、MongoDBの機能を説明してあるページはこのDeveloper Zoneと次のAdmin Zoneになります。Developer Zoneでは、機能説明であるManualに入るまでにその他紹介されている事項を先に記入しておきます:
cookbook.mongodb.org
MongoDB Cook Bookです。といってもそこまで豊富なTipsが掲載されているわけではありませんが、あるコレクションからデータを一様ランダムに抽出する方法、MapReduceのサンプルなどが掲載されており、今後Tipsが増えていくことを期待しています。
Tutorial
こちらのチュートリアルは具体的に手を動かしながらMongoプロセスを立ち上げ、基本的な挿入・検索コマンドからどんな値がどのような形式で返ってくるのかを具体的に指示してくれています。こちらは有用なので一読をお勧めします。
mongo - The Interactive Shell
MongoDBはシェル上でCRUDの操作やReplicationやShardingの管理構築ができます。実はMongoDBのコマンドはJavaScriptで書かれており、わかりやすい形式でコマンドが表現できます。また、ユーザーが関数を定義することもできますし、定義関数が書かれたJSファイルをシェル起動時に読み込ませることもできますので非常に便利です。このシェルこそ最もMongoDBらしい部分かもしれません。
Developer FAQ
ネームスペースとは何か?どのRAIDで構成すべきか?などの興味深い点についての説明がなされています。最後の質問、「Why are my data files so large?」MongoDBは保存するデータサイズが巨大になりがちなのですが、これについての説明がされています。実際運用するに当たってはディスク・メモリ使用量やフラグメンテーションといった部分が気になると思います。前エントリーの「foursquareの11時間にも及ぶサービスダウンの原因を詳細に調査してみた」もこの辺りに少しだけ関係してきそうです。
Manual
Developper Zone、主に使用者(反対は管理者)が扱うための主要な機能が網羅されているManualになります:
Databases
シェル上でMongoDBを扱うためのガイドです。シェル上のコマンドは管理者向け、CRUDを行うため、サーバーステータスを確認するため、といった様々な用途で使用する事ができます。前述しましたようにJSで記述されています。API Documentationでソースを読むこともできます。
Collections
MySQLのテーブルのような概念はMongoDBではcollectionと呼びます。MongoDBのcollectionはまたBSONドキュメントの集合になっています。MongoDBから取得したデータはたいていJSONとして扱うのですが、内部的にはJSONよりも(多くの場合で)効率的なBSON形式でデータ格納されています。
- Capped Collections
Capped collectonsはあらかじめサイズの固定されたcollectionで、サイズがいっぱいになった場合は古いデータが消されて追記されて行きます。Capped collectionsは書き込みが非常に多く発生する場面(ロギングなど)において非常に高いパフォーマンスを発揮することが期待されます。現バージョンではオブジェクトの削除ができないなどのいくつかの制約がありますが、それが問題にならない特定の用途に対しては最適な選択になります。MongoDB自身のオペレーションログ(oplog)はこのCapped collectionで構成されています。ですのでoplogは初めに大きめのサイズを指定しておくことで障害時の復旧時などのロールバック時に役立ちます。このページは今後MongoDBをよりうまく活用したい場合などに有用なページになりますし、色々丁寧に書かれていますので一度読んでおくことをお薦めします。
Data Types and Conventions
MongoDBに格納されたオブジェクトのDocument IDである "_id" キーについて、BSONについて、MongoDBのデータタイプについてやや詳しく記述されています。また、MongoDBはUTF-8での正規表現をサポートしています。
GridFS
他のDBが持たない希有な機能の代表としてこのGridFSがあります。これはMongoDBで大容量のファイルを扱うための仕組みを提供してくれます。BSONでのオブジェクトサイズの上限は4MBですが、GridFSはそれ以上の例えばビデオや音楽ファイルを扱うことができます。大きなファイルを複数のファイルに分割して、それがあたかも一つのデータであるように扱っています。各種言語向けにDridFS APIが用意されています。
Indexes
MongoDBは完全なインデックスをサポートしており、あらゆるキーに対してそれを作成することができます。ここではインデックスの詳細な利用方法が記述されています。運用上重要な項目ですが、しっかりと書かれていると思います。最後にここで特筆すべき事として、Geospatial Indexing(地理情報インデックス)をサポートしていまして、例えばfoursquareは積極的にこのインデックスを活用しています。
Querying
MongoDBでのクエリーの作り方について書かれています。MongoDBが豊富なクエリを持つことは、Advanced Queryから確認できると思います。このページはとても読んでいて楽しいです。また、countやdistinctといった集約関数も使えます。
Optimization
最適化の説明になります。MongoDBの性能を落とさない/性能を導き出すための様々な提案が書かれています。インデックスを張る、必要な項目のみを指定して取り出す…などの重要な情報がたくさん書かれています。
Inserting
データの挿入方法についての説明です。MongoDBへの挿入データはJSON形式で記述します。挿入オブジェクトにはかならずDOCUMENT IDである一意なキー "_id" が無いといけません。キーに含まれていない場合は自動で作成されます。Schema DesignではMongoDBにおけるデータのスキーマデザインについて詳しく書かれています。また bulk insert という高速にinsertを行うための機構を備えています。
Removing
MongoDBのオブジェクトを削除します。removeコマンドは基本的には検索と同じように条件を指定し、それに合致したオブジェクトを削除します。条件を指定しない場合は始めの1件だけが削除されます。
Updating
MongoDBには基本的なupdateコマンドに併せて、Modifier Operationsという非常に高速・効率の良い更新方法を備えています。オブジェクトの特定のキーの値のみをインクリメントするする場合などで用いることができますが、他にも$inc、$set、$push、$addToSet、$pop、$pull、$renameなど、なかなか多くのModifierコマンドがありますので、updateの際はまずはModifier Operationを検討してみて下さい。
MapReduce
MongoDBはShardingを行っているサーバー間でMapReduceを実行することができます。また、大規模のコレクションに対するgroupなどの一部の集約関数はMapReduceで代用することが推奨されています。サンプルコードたくさんあってそれなりに丁寧な説明がなされています。
6. Admin Zone
続いてAdmin Zoneの紹介です。こちらはMongoDBの監視からReplication、Sharding、バックアップの方法などの機能が紹介されています。
Production Notes
基本のTCP port番号は、
- Standalone mongod : 27017
- mongos : 27017
- shard server (mongod --shardsvr) : 27018
- config server (mongod --configsvr) : 27019
- web stats page for mongod : add 1000 to port number (28017, by default)
Replication
Replicationの主要な2つの構成、Master/SlaveとReplica setsについて、詳細に記述されています。Replica sets は現在のPrimaryに障害があってダウンした場合、自動的にメンバー内で次のPrimaryを選択するフェイルオーバー機能を祖備えています。MongoDBのレプリケーションとバックアップ機能の紹介に少し詳しく書いています。この部分のドキュメントは多数のサンプルコードが使われており、実際に自分で手を動かしながら動作の確認を行う事ができます。
Sharding
MongoDBのShardingはこちらがキーの分割の仕方を示してやらなくても、自動で適切に配備した複数のサーバーに割り振ってくれます。また、Shardingしているサーバー間でMapReduceを行うこともできます。まずSharding IntroductionにてMongoDBにおけるShardingを丁寧に解説してもらった後、Configuring Shardingで実際に設定方法が細かく記載されています。前述のReplicationとこのShardingの部分はかなり丁寧なドキュメント構成になっている印象を受けます。
Hosting Center
非常にホットな話題です。MongoHQなどのホスティングサービスの紹介から、AmazonEC2上で動かす方法まで、簡単ですが述べられています。
Monitoring and Diagnostics
現在のMongoDBの状態の監視・診断といって、管理者にとっては重要な項目です。muminやgangliaで状況を確認するアダプターも存在しています。
Backups
データファイルをコピーしてバックアップする方法、Slaveの同期によって行う方法、mongodumpコマンドを利用してエクスポートする方法など、いくつかの方法が提案されています。2番目のReplicationのメンバーを追加することによってバックアップを行う方法は、データのが大きいと非常に多くの時間がかかる場合があるので注意が必要です。
Admin UIs
MySQLのphpmyadminのような、UIから直感的にMongoDBを扱えるツールが多数スクリーンショット付きで紹介されています。僕も一通り試してみましたが、結局はシェルで操作するのが一番柔軟で楽なので使わずに終わっています。ただ、管理者以外の複数のメンバーがデータを閲覧できる方法として考えると非常に便利かもしれません。
その他
その他細かい項目がありますが、割愛させて頂きます。
7. Contributors
Contributer向けのルールや加入方法などについて記載されています。肝心のドキュメント翻訳のContributing to the Documentationになっていますが、日本語ドキュメント訳を手伝って下さる方を募集しています。MongoDB JAの募集スレッドからの返信か、僕@doryokujinに連絡いただければ申請を行いますので是非という方は宜しくお願いします。
8. Community
はなかなか重要な情報が満載です。まず本家ユーザーグループ・IRC・Blog・バグトラッカーへのアクセス方法が紹介されています。そして現在の開発陣の紹介、そしてジョブボード。非常に個人的な意見ですが、Looking for Data Scientistsという役職があるのが海外らしく、かつ大変興味深いですね−。QualificationsにHadoopやPigやMapReduceと書かれていたりします。
9. About
完全に見落としがちなAboutページですが、MongoDBを全体を俯瞰して理解を深めるにはここが最適です。なぜならば、Slide Galleryにて今まで紹介してきたMongoDBの機能がスライドでわかりやすく紹介されており、またUse Casesではロギングやテキストサーチといった具体的なMongoDBの利用例が紹介されています。Production DeploymentsではMongoDBを活用する企業の名前が資料とともにリストアップされています。この資料がとてもわかりやすいので、色々読まれてみる事をお薦めします。 BenchmarksではMongoDBとMySQL、あるいはCouchDBなどといった他のDBとの比較を行った記事のリンクがあります。こちらも非常に参考になります。
11. Books
現在出版されているMongoDBに関する書籍の情報です。MongoDB The Definitive Guideはやや薄めの書籍ですが、ReplicationやShardingといったAdmin Zoneの内容について、その原理から具体的な構成方法まで記述してくれていますのでお薦めです。 The Definitive Guide to MongoDB: The NoSQL Database for Cloud and Desktop Computingの方は時が少し読みにくいのと、ドキュメントとかぶるところが多いのですが、こちらもしっかり書かれているので勉強になると思います。この2冊は買って持っていますが、どちらかと言えば前者がお薦めです。日本語訳本が待たれるところです。というより訳をしたいですよね。残りの2冊はまだ発売されていませんが、MongoDB in Actionは筆者のブログで色々と情報が公開されています。というよりとても貴重な情報源です。
最後に
いかがでしたでしょうか?以前のエントリー、MongoDBのちょっと詳しいチュートリアルはそれなりにまとめて書いていますので、こちらも併せて見て頂けると幸いです。今後はMongoDBの各機能にもっとフォーカスして具体例を出しながら紹介していきたいと思っています。今後とも宜しくお願いします。