ドキュメント指向データベースMongoDB [10]
こんにちは、ursmです。
先月の話になりますが、MongoDBのメジャーアップデートであるバージョン2.0がリリースされました。新機能の中からいくつか面白そうなものを見てみましょう。
Compact Command
MongoDBはいくらドキュメントを削除しても削除マークを付けるだけで、実際にはコレクションのサイズを縮める処理を行いません。これはパフォーマンスを考慮して設計判断がなされた結果ですが、長期間運用を続けると穴だらけになったコレクションが大量のディスクスペースを占拠するという事態を招いてしまいます。この問題はrepairDatabaseコマンドで解消できるものの、データベース全体を長時間ロックし、対象データベースのサイズと同じだけのディスク容量を必要とするため、酷く使いにくいものでした。
今回追加されたcompactコマンドは、コレクション単位での最適化を行うものです。repairDatabaseと比較すると、わずかなディスク容量のみを必要とする点、比較的高速な点が優れているとされています。 ただし、依然としてデータベース全体がロックされるため、日常的に実行することは難しいでしょう。レプリカセット構成であれば各ノードを個別に最適化できるため、ダウンタイムをゼロにすることが可能です。
Index Performance Enhancements
インデックス構造の見直しにより、インデックス利用時の速度が25%向上し、サイズが25%削減されました (「ただしユースケースによる」と注意書きされています)。旧バージョンから移行したデータベースの場合、インデックスを再生成しないと恩恵に与れませんので、注意が必要です。
Replica Sets: Priorities
レプリカセット構成でノードごとに優先度が付けられるようになりました。優先度が一番高いノードがプライマリとなり、プライマリがダウンしたときは次に優先度の高いノードが昇格します。
Journaling enhancements
MongoDBはデータの変更操作をディスクに即時反映せず、一定時間 (デフォルトでは60秒) メモリ上のバッファに溜めて、後でまとめて書き込むという動作を行います。これはパフォーマンスの向上に寄与する反面、異常終了時に多くのデータを失う危険と隣り合わせでした。
バージョン1.8で追加されたジャーナリングという機能を使うと、変更操作をジャーナルログと呼ばれるファイルに記録し、異常終了後の復帰時にはそこから操作を再生することでデータ損失の可能性を劇的に低減させられます。バージョン2.0ではジャーナルログを圧縮することでディスクへの書き込みを高速化し、デフォルトでジャーナリングが有効になりました。
Shell features: Default shell init script
mongo shell起動時にホームディレクトリの .mongorc.js というファイルを読み込むようになりました。自作のユーティリティ関数などを用意しておくと良さそうですね。
