レポート

「第3回 MongoDB 勉強会 in Tokyo」活動報告

この記事を読むのに必要な時間:およそ 4.5 分

5月14日(土)第3回 MongoDB 勉強会 in Tokyoが開催されました。今回の勉強会参加登録は100人を超え,前回以上の人に足を運んでいただきました。本稿では,今回の勉強会をレポートします。

なお,本勉強会の運営はフューチャーアーキテクト株式会社様の全面協力によって支えられました。 @understeerさん,@uoratさん,@ixixiさんをはじめとしたスタッフの皆さんにも運営協力いただきました。お礼申し上げます。

会場風景。広い会場もあっという間に一杯になりました。

会場風景。広い会場もあっという間に一杯になりました

当日の発表

今回のタイムテーブルは次のとおりです。機能と仕組みの紹介からPHPへの応用の話,クエリチューニング,実サービスへの適用と注意点まで,多岐にわたる内容が発表されました。

発表者タイトル資料ビデオブログ
@doryokujinMongoDB全機能解説1スライドビデオ
(途中より)
ブログ
@bibrostソーシャルアプリのプロトタイプ制作にMongoDBを活用スライドビデオブログ
@matsuou1MongoDBチューニング~スロークエリ撲滅までの道筋~スライドビデオブログ
@ygenkiMongoDBを使用したモバイルゲーム開発についてスライドビデオブログ

@doryokujin「MongoDB全機能解説(1)」

画像

筆者@doryokujinより,MongoDBの機能についての解説を行いました。すべてを一度に解説するのは無理があったため,今回は前編として以下の内容を話しました。本発表の目的は,機能の単純なチュートリアルというよりも,その機能を使う上での注意点をしっかりと理解してもらうことにありました。MongoDBにはあまり知られていない機能や振る舞いをたくさん持っています。それを知っていることが,これからの使用に当たって大きな助けとなるはずです。

1. MongoDBの構成

MongoDBは1つのデータベースに複数のコレクションを持ちます(MySQLでいうテーブル)⁠その各コレクションがたくさんのドキュメントを保存しています。MongoDBの格納するデータの単位はドキュメントと呼ばれるもので,JSON形式になっています(内部ではBSON形式で保持されます)⁠MongoDBを稼動させるためには mongodサーバーをまず起動しないといけません。このようなMongoDBを構成する要素を「サーバー」⁠データベース」⁠コレクション」にわけてそれぞれを紹介しました。

特に特殊なコレクション,⁠Capped Collection」の特徴に興味を持ってくれた人が多かったのが印象的でした。Capped Collectionは固定サイズのコレクションで,サイズを超えるデータが入ってくる場合には最も古いデータを順に削除して挿入していきます。また,インデックスを作成しない限り,ファイルシステムにせまるほどの高速なWriteを行ってくれます。データがディスクを溢れる心配がない,高速なWrite,これらの特徴を活かしてログ集約ストレージや複雑なオブジェクトのキャッシュ機構として用いることができます。Capped Collectionについてはまた機会があれば紹介したいと思います。

2. Insertとその周辺

わざわざinsertを改めて取り上げたのは,insert処理については注意してほしい点がたくさんあったからです。

まずMongoDBを各種言語ドライバで使用する場合,基本的にinsert処理は"fire and forget"と呼ばれ,1回ごとの書き込みの成功を確認することなく次の処理へ進む動作になっています。これはいくつかのinsert処理が失敗しても気づかない場合があることを示しています。各種の統計計算を行うためのデータベースとして活用している場合はまだしも,決済系やユーザーの登録情報を保持する場合には一部のデータの欠損なんていうものは許されません。毎回の書き込み成功を確認するためのgetLastError()コマンドの重要性を述べた後,書き込みの安全性に関する機能:fsyncやjournalingについて説明しました。ちなみにMongoShellからのinsertコマンドはすべて毎回の書き込みの成功の有無を確認しています。

3. Query

MongoDBは非常に豊富なクエリを備えており,ドキュメントのあらゆるキーに対する要素に対して様々な条件で検索(findコマンド)をおこなうことができます。例えばある範囲内のデータを抽出するためのクエリ,特定の要素集合を(すべて/1つでも)含む配列を持つデータを抽出するためのクエリ,などです。

主要な注意点として,キーが入れ子になったフィールド(例えば "name: { firstname: Takahiro, lastname: Inoue }" )に対するクエリの記述は「Dot Notation」「Sub Object」と呼ばれるものがあります。後者の場合は記述順序や数に依存するため,意図した結果を得ることができない可能性があることを紹介しました。

4. Update

Updateに関しても,特定のキーの値(数値)に指定した数だけインクリメントするコマンドや配列に要素を追加,削除するコマンドなど,こちらも非常に多くの機能を有しています。また,Update後にもドキュメントのサイズが変わらない場合には"In-Place Update"と呼ばれる非常に高速なupdateになります。

逆にサイズが大きく変わる場合には現在の保存領域には収まらないので領域の移動が行われます。その際はその移動の分だけ時間がかかるばかりか,移動前と移動後の2回重複してデータを取ってきてしまう可能性もあります。それに対しての対処法としてsnapshot()コマンドを使用することなどを挙げました。また,1回のコマンドで複数のドキュメントに更新が与えられる場合には,更新中に他の動作が介入しないように$atmicコマンドでロックをかける必要があることなどの注意点を述べました。

5. Index

MongoDBはドキュメントのあらゆるキーに対して(B-Tree)インデックスを作成することができます。これと豊富なクエリと併せて高速かつ柔軟なデータの取得を容易にしてくれます。ただし,MongoDBのindexは他に比べてindex sizeが大きくなりがちで,また,writeパフォーマンスにも影響を与えること,順序依存の問題などで必ずしもそのインデックスが使用されているとは限らないこと,またそれを調べるためにexplain()コマンドがあること等について触れました。

6. Replication

Master-SlaveとReplica Setsのうち,後者について詳しく説明しました。特に,細かな設定方法は割愛し,フェイルオーバー時の挙動などについて紹介しました(このあたりの話は普通に使っている限り,なかなか知ることのできない部分ですので,基礎を飛ばしました)⁠Replicationについては,もう一回ほど機会を設けて実際にフェールオーバーを確認してもらうなどの実演を交えて紹介したいと思います。

画像

MongoDBは特に海外においては非常に多くの企業がプロダクションとして導入しています。日本でも導入事例が増えてくることを目標に活動を進めていきたいと思います。

著者プロフィール

井上敬浩(いのうえたかひろ)

MongoDB JP主催者。MongoDB日本語ドキュメント訳もしています。芸者東京エンターテインメントGTE所属(データマイングエンジニア)。Hadoop,MongoDB,GraphDB(Neo4j),Redis等を使用して,大規模かつ複雑なソーシャルデータの解析を行っています。解析技術においては業界一を本気で目指しています。

Twitter:@doryokujin

コメント

コメントの記入