ROMA(Rakuten On-Memory Architecture)は、楽天が開発したキー・バリュー型データストア(key-valueストア)です。2009年夏から、楽天が「楽天トラベル」の閲覧履歴機能「最近見た宿」を対象にROMAを導入しています。さらに2009年10月には、ROMAをオープンソースソフトとして公開しました(写真1)。

写真1●ソースコード管理サービス「github」でROMAのソースコードを入手できる
写真1●ソースコード管理サービス「github」でROMAのソースコードを入手できる

 ROMAのノード間は“ピア・ツー・ピア型” でデータをやり取りすることで処理を効率化しています。アプリケーションは初期化時にkey-valueストアを構成するノードを複数指定します。指定するノードは特別なノードである必要はなく、key-valueストアに参加しているノードであればどれでも構いません。複数指定していれば、その中の1つは生きているだろうという判断です。

 アプリケーションは指定されたノードに順番にアクセスし、最初に応答したノードに自分がこれからkey-valueストアにアクセスすることを伝えます。接続されたノードは、どのハッシュ値をどのノードが担当するかという情報(ルーティング・テーブル)を伝えます。ルーティング・テーブルは、ハッシュ値と担当ノードの対応を保持しています(図1)。

図1●キーバリュー型データストア「ROMA」の仕組み
図1●キーバリュー型データストア「ROMA」の仕組み
[画像のクリックで拡大表示]

 ルーティング・テーブルを受け取ってしまえば、後のアクセスは比較的簡単です。与えられたkeyからハッシュ値を計算し、ルーティング・テーブルから担当するノードを調べて、そのノードにリクエストを送ります。アプリケーションは、データ・アクセスごとにそれぞれのkeyから計算されるハッシュ値を担当するノードに接続して通信します。

 ルーティング・テーブルは定期的に更新します。一定時間ごとにルーティング・テーブルに登録されているいずれかのノードに、最新のルーティング情報を送るようにリクエストを送ります。

 一方、ROMAシステムを構成するノードの動作はかなり複雑です。ROMAは特別な役割を果たすマスターが存在せずノード間の関係が平等なピア・ツー・ピア型なのでなおさらです。

 ノードの働きは大まかに分けると以下の通りです。

・アクセス・リクエスト対応
・情報保存
・ノード構成情報維持
・ノード構成情報提供
・参加処理
・終了処理

 ストレージは実際の情報格納を行う部分です。ROMAではストレージはプラグイン形式になっており、起動時の設定でストレージを切り替えられます。Ruby Hashに情報を格納するRHストレージやDBMストレージ、RDBのSQLite3、TokyoCabinetなどを利用できます。ROMAの運用では、TokyoCabinetが最も使われています。

(まつもと ゆきひろ)