Web開発者の非リレーショナルデータベースへの注目
Ajax, REST, Lightweight Java, Ruby, Python, オープンソースデータベース等々、近年、Web を取り巻く周辺技術は幅広く、力強く動いています。この流れを積極的に取り入れたシステムでは、多くの場合、Web 空間におけるリソースモデル – (A) – サーバープログラム上のオブジェクトモデル – (B) – ディスク空間上のデータモデルの変換を、何らかの形で検討することになるでしょう(図 1)。ここでは、(A) を MVCのController に近いもの、(B) は ORM とお考え下さい。例えば、Web アプリケーションフレームワークである Ruby on Rails では、(A) は ActionPack(map.resources)、(B) を ActiveRecord が担当します。Java には多くの選択肢が存在します。
ディスク上のデータモデルは、多くの場合、リレーショナルデータベース (RDB) です。RDB の有用性はすでに十分証明されており、Web でも以前から広く活用されています。XML への対応も進んできています。
しかしここ数年、図 1 (A) の周辺で、Web を巡る状況は劇的に変わりました。REST が改めて注目され、URI の設計や HTTP Method の選択により注意が払われるようになり、Web 空間内のリソースモデルが変わりつつあります。Ajax の流行はブラウザと Web サーバー間でのデータ交換形式を大きく変え、JSON をサーバーサイドでも容易に、様々な言語で扱えるデータ形式に押し上げました。
このような状況下、ディスク空間上のデータモデルとして、リレーショナルではないデータベースを採用することに、新たなメリットは生まれていないのでしょうか。本シリーズで取り上げる CouchDB は、大きな可能性を秘めていると考えています。
Apache CouchDB とは
では、CouchDB はいったい何なのでしょうか。CouchDB は現在 Apache の incubator project として開発が進められている“ドキュメント指向”データベースで、様々な特徴を持っています。以下に Web 開発者が注目するその一部を紹介します。
- リレーショナルデータベースではありません。
- SQL は要りません。
- データベースとのすべての通信に HTTP を使用し、RESTful API を提供します。
- 特別なデータベースドライバは必要なく、HTTP Client 機能を使える環境であればどこでも (例えば telnet でも) データベースにアクセスできます。
- ドキュメントの取得・保存・削除は REST の原則に従います。
- データ構造にスキーマは不要です。
- データはすべて JSON フォーマットで表現される“ドキュメント”としてやりとりします。
- JSON の構造について、事前定義は必要なく、後から属性を追加したり、削除したりするのは自由です。
- 問い合わせ (ビュー) は MapReduce フレームワークに基づいて記述します。
- データベースエンジンは Erlang で実装されていますが、問い合わせ言語には標準入出力をサポートしている任意のプログラミング言語を使用することができます (標準は JavaScript です)。
- 大規模分散並列データベースとしての可能性を秘めています。
CouchDB は Web で使用可能な HTTP データサービスの機能を果たすことができるデータベースです。JSON をベースにした ORM 不要のデータアクセス機能と、MapReduce フレームワークによる大規模展開の可能性を考えると、Web 開発者にとって大いに魅力のあるデータベースに見えないでしょうか。
このシリーズでは、上で言及した CouchDB の特徴について、サンプルコードを交えながら解説を行います。
- 第 2 回では、RESTful API に焦点を当て、Ruby on Rails を用いて CouchDB をデータベースにする簡単な wiki を作成します。
- 第 3 回では、問い合わせ機能に注目し、MapReduce フレームワークを用いたクエリの作成方法を覚えます。
- 第 4 回では、CouchDB が使用する JSON ドキュメントの細部について考察します。
- 第 5 回では、レプリケーションなどのその他の機能について紹介し、このシリーズを通して説明したことをまとめます。
Ubuntu 8.04 への Apache CouchDB のインストール
このシリーズでは、Ubuntu 8.04 と、Apache CouchDB 0.8.0 の環境を前提に、サンプルプログラムを紹介していきます。まず今回は、Apache CouchDB のインストール方法を説明します。2008年6月26日現在、CouchDB はバージョン 0.8.0 がリリースされています。
前提モジュールのインストール
Apache CouchDB をビルドおよび動作させるために必要な前提モジュールを Ubuntu のパッケージシステムを使ってインストールします。
sudo apt-get install build-essentials
sudo apt-get install libtool
sudo apt-get install automake
sudo apt-get install libmozjs-dev
sudo apt-get install libicu-dev
sudo apt-get install erlang
Apache CouchDB のダウンロードとインストール
Apache CouchDB はソースコードからビルドすることでインストールします。プロジェクトサイトから現在の最新リリースを取得できます。sapache-couchdb-0.8.0-incubating.tar.gz のリンクを経由して、Apache のミラーサイトからファイルをダウンロードします。ダウンロード後、コンソールから以下のようにインストールを行います。
tar zxvf apache-couchdb-0.8.0-incubating.tar.gz
cd apache-couchdb-0.8.0-incubating
./configure
make
sudo make install
デフォルトでは /usr/local 以下にインストールされます。インストール先を変更する場合は configure スクリプト実行時に、–prefix オプションで指定してください。この連載では /usr/local 以下にインストールしたことを前提に説明を進めます。
Apache CouchDB の起動
CouchDB を開始する前に、専用のユーザーを作成し、ディレクトリパーミッションを変更します。/usr/local/var/lib/couchdb はデータベースファイルが作成される場所、/usr/local/var/log/couchdb は CouchDB のサーバープロセスのログファイルが出力される場所になります。
sudo adduser -group -home /usr/local/var/lib/couchdb -no-create-home couchdb
sudo chown couchdb.couchdb /usr/local/var/lib/couchdb /usr/local/var/log/couchdb
また、起動停止の init.d スクリプト が /usr/local/etc/init.d に作成されています。以下のコマンドを使用して CouchDB が起動できます。
sudo /usr/local/etc/init.d/couchdb start
デフォルトでは 127.0.0.1:5984 で HTTP サーバーが起動します。ログレベルやバインドする IP アドレスやポートなどを変更したい場合は、/usr/local/etc/couchdb/couch.ini の項目を編集して、再起動します。
起動に成功したら、アクセスできるか確認してみましょう。HTTP でデータベースと通信できますから、curl を使うことができます (curl コマンドが入っていない場合は telnet を使うか、apt-get install curl でインストールしてください)。標準出力に JSON 形式の文字列が表示されることを確認してください。
$ curl http://localhost:5984/
{"couchdb":"Welcome","version":"0.8.0-incubating"}
Web Utility (Futon) の確認
Web ブラウザを使用して、http://localhost:5984/_utils
にアクセスすると、Futon と呼ばれる CouchDB の Web 管理ユーティリティが表示されます。Futon を使って、データベースの作成やドキュメントの編集、あるいはクエリ (CouchDB ではデザインドキュメントと呼ばれる特殊なドキュメントです) の登録なども可能です (図 2)。
まとめと次回予告
今回は、Apache CouchDB の特徴について言及し、その簡単なインストール方法を説明しました。次回は、CouchDB のプログラムからの利用方法を学ぶために、Ruby on Rails (と Ruby の Net::HTTP ライブラリ)を使用して簡単な wiki アプリケーションを作成します。