ubuntu に mongodb をインストール - with pymongo / vs couchdb
一段落ついたので、couchdb に引き続き mongodb もインストールしてみた。環境は同じく VMWare 上の ubuntu。シングルサーバ、シングルクライアント (python) な環境で比較することに。
というのも、設定に誤りがあるためか、 couchdb が期待できるようなパフォーマンスが出なかったため。100 万件のデータを insert 処理するストレステスト (本番バッチ処理環境を考慮) をしているのですが、途中で conflict -> socket error -> down になってしまう。途中 sleep を入れると socket error は出なくなるけど、それだと遅いのと、なんだか気持ち悪い。前ポストで書いたように、0.8.0, 0.11.0b, 0.10.0 で試したけど、結果は同じでした。何が悪いのだろう・・・。
気は取り直して、mongodb は期待する結果が得られたので、インストールと pymongo 経由での処理方法です。
- 依存パッケージ類のインストール
sudo aptitude install tcsh git-core scons g++ sudo aptitude install libpcre++-dev libboost1.37-dev libreadline-dev libmozjs-dev
- git から mongodb のダウンロードとインストール (/opt/mongo へ)
cd /usr/src/ git clone git://github.com/mongodb/mongo.git cd mongo sudo scons all sudo scons --prefix=/opt/mongo install
- mongo ユーザの追加
sudo adduser --system --home /opt/mongo/ --no-create-home --shell /bin/bash --group --gecos "mongoDB Administrator" mongo
- db データディレクトリーの追加とパーミッション設定
sudo mkdir -p /data/db sudo chown -R mongo:mongo /data/ sudo chmod a+x /data/db/
データディレクトリは任意だけど、デフォルトのパスは上記のディレクトリになってる - デーモン monbod の起動
sudo /opt/mongo/bin/mongod
もしデータディレクトリを別の場所にしている場合は、--dbpath オプションで渡してやるsudo /opt/mongo/bin/mongod --dbpath /path/to/db
バックグラウンドプロセスで起動するために、末尾に "&" をつけてやる。
もし、そのまま起動してしまった場合は <Ctrl>+z でプロセスを停止し、 bg でバックグラウンドプロセスに放り込む
正常に起動した場合は、以下のようなメッセージが標準出力に表示される。Fri Nov 6 11:43:02 Mongo DB : starting : pid = 3558 port = 27017 dbpath = /data/db master = 0 slave = 0 32-bit ** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data ** see http://blog.mongodb.org/post/137788967/32-bit-limitations for more Fri Nov 6 11:43:02 *** warning: spider monkey build without utf8 support. consider rebuilding with utf8 support Fri Nov 6 11:43:02 db version v1.1.3-, pdfile version 4.5 Fri Nov 6 11:43:02 git version: 9ecceafbca1c0f88ec69aa659f12a7098f563095 Fri Nov 6 11:43:02 sys info: Linux wb01 2.6.28-16-generic #55-Ubuntu SMP Tue Oct 20 19:48:24 UTC 2009 i686 Fri Nov 6 11:43:02 waiting for connections on port 27017
- mongodb の停止
mongo プロンプトからやるか ps からプロセスIDを取得して kill するらしい。プロンプトでやろう (笑sudo /opt/mongo/bin/mongo > use admin switched to db admin > db.shutdownServer() Fri Nov 6 11:55:57 terminating, shutdown command received Fri Nov 6 11:55:57 dbexit: Fri Nov 6 11:55:57 shutdown: going to flush oplog... Fri Nov 6 11:55:57 shutdown: going to close sockets... Fri Nov 6 11:55:57 shutdown: waiting for fs... Fri Nov 6 11:55:57 shutdown: closing all files... Fri Nov 6 11:55:57 closeAllFiles() finished Fri Nov 6 11:55:57 shutdown: removing fs lock... Fri Nov 6 11:55:57 dbexit: really exiting now ERROR: Client::shutdown not called! server should be down... Fri Nov 6 11:55:57 trying reconnect to 127.0.0.1 Fri Nov 6 11:55:57 reconnect 127.0.0.1 ok Fri Nov 6 11:55:57 JS Error: Error: error doing query: failed (anon):99 > exit bye [3]- Done sudo /opt/mongo/bin/mongod
- pymongo のインストール (setuptools を使う)
sudo easy_install pymongo
- pymongo を使ってみる (pymongo のドキュメント通りにやってみる)
>>> from pymongo.connection import Connection >>> connection = Connection("localhost", 27017) Fri Nov 6 12:02:30 connection accepted from 127.0.0.1:29390 #2 Fri Nov 6 12:02:30 end connection 127.0.0.1:29390 >>> db = connection.test >>> db.name() u'test' >>> db.my_collection Collection(Database(Connection('localhost', 27017), u'test'), u'my_collection') >>> db.my_collection.save({"x": 10}) Fri Nov 6 12:03:12 connection accepted from 127.0.0.1:29646 #3 Fri Nov 6 12:03:12 allocating new datafile /data/db/test.ns, filling with zeroes... ObjectId('4af391f07ad5bd0fc4000000') >>> Fri Nov 6 12:03:12 done allocating datafile /data/db/test.ns, size: 16MB, took 0.102 secs Fri Nov 6 12:03:12 allocating new datafile /data/db/test.0, filling with zeroes... Fri Nov 6 12:03:13 done allocating datafile /data/db/test.0, size: 64MB, took 0.55 secs Fri Nov 6 12:03:13 building new index on { _id: ObjId(000000000000000000000000) } for test.my_collection... Fri Nov 6 12:03:13 Buildindex test.my_collection idxNo:0 { name: "_id_", ns: "test.my_collection", key: { _id: ObjId(000000000000000000000000) } } Fri Nov 6 12:03:13 done for 0 records 0.257secs Fri Nov 6 12:03:12 insert test.my_collection 913ms >>> db.my_collection.save({"x": 8}) ObjectId('4af392067ad5bd0fc4000001') >>> db.my_collection.save({"x": 11}) ObjectId('4af392107ad5bd0fc4000002') >>> db.my_collection.find_one() {u'x': 10, u'_id': ObjectId('4af391f07ad5bd0fc4000000')} >>> for item in db.my_collection.find(): ... print item["x"] ... 10 8 11
最初に my_connection にアクセスした際に、test バイナリーファイルが作成されるみたいですね。
適当に connection.foo, db.bar とかやっても動きます。
- couchdb は CPU 使用率やメモリ使用率は少ないです。それと比較すると mongodb はストレステストの間中 99.9% の CPU を消費していました
- couchdb はストレスをかけると comflict -> socket error -> down になりましたが、mongodb は落ちずにより高速に処理できました
ちょっと今回の検証では couchdb を使いこなせなかった感じです。とりあえず、mongodb を使うことにしましたが、 couchdb についてももうちょっと勉強したいと思います。あっ tokyo tyrant も。
コメント
コメントを投稿