kiyokaのブログアーカイブ

Archive of old blog posts

MongoDB試用開始

MongoDBをさわりはじめた。versionは現時点の最新の version 2.0.1 。

メモリがいくらあっても足りない。4GByte RAMのサーバマシンで3.8GByteまで使っている。 もちろん他にもいろいろ走っているので、2GByteほどswapしている。

まず、1GByte程度のapacheログをmongoimportできるJSON形式にしてimportした。 mongoimport用の変換内容は時刻部分をDate型に、転送サイズを数値型に変換した。それ以外は文字列のまま。 mongoimportで投入し、リクエスト時刻フィールドにIndexを張ったらDBサイズが5GByteになった。 うげー、でかいよ。

その後、リクエスト時刻部分から時分秒を00:00:00に切り落としたDate型をもうひとつ追加したら、DBサイズがまた肥大した。 DISKもよく食う。

結局次のようなドキュメントの構造になった。 Indexはtimestampとurlに張って、14GByteのDBサイズに!

 $ mongo --host black sumibi
MongoDB shell version: 2.0.1
connecting to: black:27017/sumibi
> db.apachelog.findOne()
{
	"_id" : ObjectId("4eaf66c734168d18eb210c4e"),
	"client_id" : "-",
	"hostname" : "111.111.111.111",
	"referer" : "-",
	"req" : {
		"method" : "GET",
		"url" : "/sumibi/Sumibi_stable.wsdl"
	},
	"request" : "GET /sumibi/Sumibi_stable.wsdl HTTP/1.0",
	"result_code" : "200",
	"tfrsize" : 6940,
	"timestamp" : ISODate("2011-10-08T21:56:22Z"),
	"timestampDaily" : ISODate("2011-10-08T15:00:00Z"),
	"user_agent" : "-",
	"username" : "-"
}
> db.apachelog.count();
6072350

※ hostname部分はblog用にマスクしてあります。

それにしてもMongoDBのshellがJavaScriptなのが便利だなーと思ったのも束の間、すぐにJavaScriptの非力さが気になりはじめた。 Prototypejsを使いたくなるほどのプレーンさだ。でも、mongo shellには載らないだろうな。うーん。なんとかならんかな。

久々にこんなプレーンなfor文を書いたよ。半年ぶりくらいかなー。

 for ( i = 0 ; i < a.length ; i++ ) {
 ...
}

Prototypejsを使えば、mapやeachなんかを使って書くのでループ変数を使ったコーディングは懐しささえ感じる。 まだ使い始めたばかりなので、癖はわからないが、いろいろ負荷の高い処理をやらせたりMapReduceをやったりして数日使ってみようと思う。

※ ちなみに個人的な学習用リポジトリはkiyoka/learn-mongodb - GitHubで公開しているので、クエリのサンプルとか見れますよ。


コメント by kiyoka:
自分でコメントします。 なんかメモリが足りないという発想がMongoDBに合っていない気がする。 データベースのサイズに対してメモリが足りないのであればマシンを増やして分散するのが筋かなー。 もうちょっと実験が進んだら、AWSの時間貸しインスタンスを借りるのがいいのかな。