CouchDBを始めてみようと思ったのですが。。。
Update: 2012-12-13
Apache CouchDB を始めてみようと思ったのですが、日本のコミュニティのメーリングリスト は今年の1月あたりが最後の投稿になっているような。。。周回遅れだったかな。。。とりあえず登録はしました。
CouchDB は JSON 形式でデータを格納する Document-oriented な NoSQL です。
- HTTP による単純なインターフェース ( REST API )
- いつでも電源OFFしてOKな感じの耐障害性
- Optimistic locking
- MapReduce による view
といった特徴が気に入りました。これができるなら、ディスクを余分に使うことになっても、性能面で劣るとしても、 Mongo DB よりおもしろそうだと思ったのです。アプリケーションの処理の複雑さによっては CouchDB の方が性能が出る場合もあるかもしれません。 Mongo DB との比較は Comparing Mongo DB and Couch DB をご覧ください。 CouchDB のストレージの概要については The Power of B-trees を。まだ斜め読んだだけですが、確かにこの仕組みなら SSD が長持ちしそうです。
まず、なにはともあれ動かしてみます。
現時点 ( 2012-12-13 ) の最新の 1.2.0 を使います。 Mac OS X では後述する "Test Suite" が通りませんでした。 Ubuntu 12.04 で aptitude show couchdb
してみると、 Version: 1.0.1-0ubuntu18
。。。 ソースからインストール することにします。まず、 OS のグループとユーザが必要です。こんな感じでいいのではないかと。
/etc/group
couchdb:x:114:
/etc/passwd
couchdb:x:114:114::/opt/couchdb1.2.0:/bin/sh
/etc/shadow
couchdb:*:15680:0:99999:7:::
以下、実行したコマンドです。 /opt/coucdb1.2.0
にインストールしたのは後で消しやすいようにということです。
$ sudo apt-get install build-essential erlang libicu-dev libmozjs-dev libcurl4-openssl-dev
$ sudo mkdir /opt/couchdb1.2.0
$ wget http://ftp.kddilabs.jp/infosystems/apache/couchdb/releases/1.2.0/apache-couchdb-1.2.0.tar.gz
$ tar xzvf apache-couchdb-1.2.0.tar.gz
$ cd apache-couchdb-1.2.0/
$ ./configure --prefix=`/opt/couchdb1.2.0
$ make && sudo make install
$ sudo chown -R couchdb.couchdb /opt/couchdb1.2.0/etc/couchdb/
$ sudo chown -R couchdb.couchdb /opt/couchdb1.2.0/var/lib/couchdb/
$ sudo chown -R couchdb.couchdb /opt/couchdb1.2.0/var/log/couchdb/
$ sudo chown -R couchdb.couchdb /opt/couchdb1.2.0/var/run/couchdb/`
管理者のユーザ名とパスワードをこのファイルに
$ sudo vi /opt/couchdb1.2.0/etc/couchdb/local.ini
こんな感じで書いておくと、
... ... ...
[admins]
admin = secret
初回起動時にパスワードを暗号化してくれるという妙な仕様になっています。だから /etc/couchdb の所有者を設定するのか、なるほど。セットアップが終わったら、起動して、ログ見て、トップページ ( と言うのかな? ) を見てみます。
$ sudo /opt/``couchdb1.2.0``/etc/init.d/couchdb start
$ cat /opt/``couchdb1.2.0``/var/log/couchdb/couch.log
$ curl http://127.0.0.1:5984/`
こんなものも JSON で出力するこだわりがなんとも。基本的な使い方は Getting Started をご覧ください。
{"couchdb":"Welcome","version":"1.2.0"}
デフォルトでは 127.0.0.1 しか Listen していません。外からもアクセスしたい場合は
/opt/couchdb1.2.0/etc/couchdb/local.ini
bind_address = 0.0.0.0
とすればいいそうです ( Why can't I access my CouchDB instance externally on Ubuntu 9.04 server? ) 。ただし、この後の "Test Suite" はどうも http://127.0.0.1:5984/ でないとうまくいかないようです。 http://localhost:5984/ でもだめというような記述もありました。そんなわけで Firefox を入れて ssh -X
で外から起動して、管理ツール Futon を開いて "Test Suite" をやってみます。 "Test Suite" 実行中は Firefox が固まったようになってしまって不安なので、ログを表示しておきます。
$ sudo apt-get install firefox
$ firefox http://127.0.0.1:5984/_utils/ &
$ tail -f /opt/couchdb1.2.0/var/log/couchdb/couch.log`
Firefox で表示した Futon のページの右下の Login をクリックしてログインします。
ページの右側のメニュー "Verify Installation" を選択して "Verify Your Installation" を実行します。正常にインストールできていれば "√ Your installation looks fine. Time to Relax." となります。
ページの右側のメニュー "Test Suite" を選択して "Run All" を実行します。すると、 「このテストは Admin Party mode で実行するから "Remove Admins" をクリックしてね(抄訳)」とのたまうのでしょうがないからその通りにします。するとターミナルの方ではびゅんびゅんとログが流れ始めて Futon の方も Status に "success", "success", "success"... と出始めて待つこと10分くらい、 "rev_stemming" でエラーが出ました。メッセージ見てもわからないなあ。
追記: まっさらの OS にインストールしてやり直したら、すべて "success" になりました。
1. Assertion failed: db.open("bar", {revs:true})._revisions.ids.length == newLimit + 1
2. Assertion failed: docB2._conflicts[0] == docB1._rev) // We having already updated bar before setting the limit, so it's still got // a long rev history. compact to stem the revs. T(db.open("bar", {revs:true})._revisions.ids.length == newLimit + 1
上の方にある "Share Test Reports" を押して報告しておきました。
ページの右側のメニュー "Overview" を選択します。するとテスト用のデータベースがたくさん残っています。掃除しておこうかな。。。
まず、データベースの一覧を取得します。
$ curl -X GET http://127.0.0.1:5984/_all_dbs
JSON 形式で出てきます。実物は1行ですが、見やすいように改行入れます。
[
"_replicator",
"_users",
"test_suite_db",
"test_suite_db/with_slashes",
"test_suite_db_a",
"test_suite_db_b",
"test_suite_db_c",
"test_suite_foobar",
"test_suite_reports"
]
削除します。データベースの名称の "/"
は "%2F"
に置き換えるといいようです。
$ curl -X DELETE http://admin:password@127.0.0.1:5984/test_suite_db
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_db%2Fwith\_slashes
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_db\_a
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_db\_b
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_db\_c
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_foobar
$ curl -X DELETE http://`admin:password@127.0.0.1:5984/test\_suite\_reports
正常に処理すると {"ok":true}
と出力されます。
最後に、couchdb を停止して、管理者のユーザ名とパスワードを設定し直して、再起動して終わりです。