こんにちは。
事業開発本部 コンシューマーサービス部の木村です。
普段はソーシャルゲームの開発を行ってます。
先日、1泊2日の開発合宿に言ってまいりました。
行ったこと
MongoDB
・インストール
・文法
・レプリケーション
・シャーディング
下知識がなかったので、1から学習しました。
学習して感じたこと
・スキーマレスでRDBよりもデータ構造に汎用性をもたせやすい。・jsonがそのまま使える。
・レプリケーション・シャーディングが簡単に設定できる。
Replica Setsの構築
今回はレプリケーションについて取り上げます。レプリケーションのアーキテクチャ
・Master/Slave
・Replica Sets
ノードとなるディレクトリを作成。
mkdir /data/node1 mkdir /data/node2 mkdir /data/node3
レプリカセットの割り当て
mongod --dbpath=/data/node1 --replSet=rep -port=27021 --fork --logpath=/var/log/mongo/node1.log --logappend --nojournal mongod --dbpath=/data/node2 --replSet=rep -port=27022 --fork --logpath=/var/log/mongo/node2.log --logappend --nojournal mongod --dbpath=/data/node3 --replSet=rep -port=27023 --fork --logpath=/var/log/mongo/node3.log --logappend --nojournal
-
- fork
バックグランドで処理
その際に--logpathでログの出力先を指定する必要があります。
-
- logpath
ログの出力先
-
- logappend
ログローテーションをせずにログを追記
-
- nojournal
ジャーナルを無効にする。
ディスク容量を消費するジャーナルを無効にしました。
また、ジャーナルについての詳しいソースは以下となります。
http://doryokujin.hatenablog.jp/entry/20110614/1308010072
mongoシェルを起動
mongo localhost:27021
mongoシェルはそのままjsonを記述できます
config = { _id: 'rep', members: [ { _id: 0, host: 'localhost:27021' }, { _id: 1, host: 'localhost:27022' }, { _id: 2, host: 'localhost:27023',arbiterOnly : true } ] } rs.initiate(config);
これでReplica Setsの完成。
rs.status();
で確認できるかと思います。
ハマったこと
AWSの8GBのインスタンスで作業してたらすぐにディスク容量がなくなった。MongoDBは使用する前に、そのデータベースファイルを事前に割り当てが行われ、
比較的大きなファイルを使用することが約束されているそうです。
レプリケーション・シャーディングのためにノードを割り振っていたらすぐに死亡しました・・
感想
都内を離れて開発するのはすごくよかったです。休日に研究するにも家に閉じこもって作業するのを余儀なくされていたので、
こういう機会はありがたいことであります。