MongoDBの変更点 - Masanoriのメモ帳

MongoDBの変更点

!!!MongoDB
NoSQLなドキュメント指向データベース [MongoDB|http://www.mongodb.org/] (v2.x〜)についてのメモです。
ゆるふわと言わたりしますが、サッと使うのには便利。まともに実用するには他と同様、相応の工夫と知見が必要な印象です。(良い意味で) 少し枯れ始めてきたかもしれません。
ゆるふわと言わたりしますが、サッと使うのには便利。まともに実用するには他と同様、相応の知見と工夫が必要な印象です。(良い意味で) 少し枯れ始めてきたかもしれません。
開発元は"10gen"でしたが、わりと最近、["MongoDB"という社名になりました|http://www.atmarkit.co.jp/ait/articles/1308/30/news096.html]。
!!特徴
*NoSQL
*スキーマレス&ドキュメント型(JSON(BSON))
**なんといっても、スキーマレス。
**フィールドをネスト可能
**joinは無い。RDBのような正規化はほとんど必要ない。([スキーマデザイン|http://www.mongodb.org/pages/viewpage.action?pageId=7209156#%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%95%B0])
*indexキー検索だけでなく、いかなるフィールドに対しても(ネストさえも)検索が可能。{{br}}like検索、location(位置情報)検索もサポート。
**→但し、indexを適切に張っておかないと全スキャンを行うことになる。
*CPUリソースはともかく(single-coreサポート)だが、I/O、メモリ、HDDは贅沢に消費する。
**→メモリに載る範囲であれば、とても高速。(載りきらなくなった場合は...場合は...orz)
*GridFSによる大容量ファイル格納をサポート
*[Journaling|http://www.mongodb.org/display/DOCSJP/Journaling]をサポート
*JavaScriptベースのインタラクティブシェル
*総じて、RDBMSっぽい機能が備わっており、MySQLなどからも移行しやすい。(但し、RDBMSから見ると、相当割り切ったといえる仕様が多いため、理解が必要。)
!!!RDB用語との対応
,MongoDB,RDB
,コレクション,テーブル
,行,ドキュメント
!!!Query
*http://www.mongodb.org/pages/viewpage.action?pageId=6029355
!!!Index
http://www.mongodb.org/pages/viewpage.action?pageId=5800049
Indexを張らない場合、データ増加に伴うfindの性能劣化が激しくなる。
なるべくIndexを張っておくこと。また、複合Indexも生成可能。
但し、読み込みよりも書き込みのほうが多いコレクションには、Indexを張らないほうがいい。
!!シェル: Indexの生成
 db.foo.ensureIndex({hoge:1});
!!シェル: クエリの実行計画
db.foo.find(bar).explain()で確認可能。
 db.foo.find({ hoge:"piyo"}).explain();
http://www.slideshare.net/matsuou1/20110514-mongo-db
!!!cappedコレクション
固定されたサイズのコレクション。ロギングなどに最適。
http://www.mongodb.org/pages/viewpage.action?pageId=5079212
cappedコレクションには、Indexを張らないほうがいい。
!!!Journal (ジャーナリング、先行書き込みログ)
v1.8から導入された機能。v1.9.2からデフォルトで有効となった。
オペレーションを行う前に、ジャーナルファイルにオペレーションログを先行書き込みする。

* メリット:
**mongodの異常終了などからの復帰時に、整合性確認のための Repair が不要となり、迅速かつ安全に復帰できる。
* デメリット:
**3GB程度のディスク領域が必要となる。
**パフォーマンスにわずかながら影響する。
単体で開発に使っている場合などは、無効化しても構わないであろう。
 $ mongod --nojournal
(異常発生した場合は、今までどおり repair するか、もしくは、不要ならばデータを消去すれば良い。)

参照: [MongoDB journal casebook|http://www.slideshare.net/YukihikoSawanobori/mongodb-journal-casebook]
参照: [MongoDBの新機能:ジャーナリングについて詳しく|http://doryokujin.hatenablog.jp/entry/20110614/1308010072]
!!!HTTP Admin UI
WebブラウザからMongoDBの状態を確認できる。
mongodの起動時に--restオプション付きで実行する必要がある。
 mongod --port 27017 --rest
ポートは、mongodのポート + 1000 (即ちデフォルトでは 28017)となる。

また、yumなどでインストールした場合は、
/etc/mongodb.conf に 以下を追加する
 rest = true
([参照|http://www.mongodb.org/display/DOCS/File+Based+Configuration])

尚、SELinuxにより実行がブロックされる場合は 
 semanage port -a -t http_port_t -p tcp 28017
 grep mongod /var/log/audit/audit.log | audit2allow -M mypol
 semodule -i mypol.pp
のようにして許可する。
!!!Mongos router
複数のmongodプロセスをまとめるためのルータ
http://www.mongodb.org/pages/viewpage.action?pageId=5800002
http://d.hatena.ne.jp/matsukaz/20110417/1303057728
!!!Replica set (冗長構成)
Replica setは、Replica pairsよりさらに柔軟に構成が可能。
*master (primary)
*slave (secondary)
*[arbiter]
の__3台以上__で構成できる。(slaveとarbiterを物理的な1台で兼用も一応可能)
arbiterは、障害発生時のmaster昇格決定をサポートするのみの役割。
master/slaveのみの2台構成となると正常に動作しない。([参照|http://qiita.com/items/b5e99bf4923b84b2bb40])

http://d.hatena.ne.jp/ryopeko/20101005/1286262922
http://sssslide.com/www.slideshare.net/naverjapan/mongodb-9422893
http://doryokujin.hatenablog.jp/entry/20101102/1288651712

!!SlaveOK
slaveに対する参照を可能にする。(masterに対してはinsert/update/deleteのみを行う運用)
!!!Replica pairs (冗長構成 (旧))
*master
*slave
*[arbiter]
の__2台または3台__で構成できる。
http://www.mongodb.org/display/DOCSJP/Replica+Pairs

arbiterは、障害発生時のmaster昇格決定をサポートするのみの役割。
--arbiterオプションにより、arbiterなしでの運用も可能。(即ち、ネットワーク分断時には両方がmasterとなる。)
!!!Sharding (負荷分散)
http://sssslide.com/www.slideshare.net/doryokujin/mongodb-9208855
!!!Tips
*like検索: http://d.hatena.ne.jp/hikaruright/20121022/1350874420
!!!事例
*NAVER Photo Album{{br}}http://sssslide.com/www.slideshare.net/naverjapan/mongodb-9422893
----
{{category Linux,MongoDB,データベース,nolink}}


メニュー


未整理

Linux

プログラミングx

Android

サービス

製品

執筆中


筆者のサイト


スポンサード リンク