FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

MongoDBに触れてみた(Replica Sets)@開発合宿

こんにちは。
事業開発本部 コンシューマーサービス部の木村です。

普段はソーシャルゲームの開発を行ってます。

先日、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は使用する前に、そのデータベースファイルを事前に割り当てが行われ、
比較的大きなファイルを使用することが約束されているそうです。

レプリケーション・シャーディングのためにノードを割り振っていたらすぐに死亡しました・・

感想

都内を離れて開発するのはすごくよかったです。
休日に研究するにも家に閉じこもって作業するのを余儀なくされていたので、
こういう機会はありがたいことであります。