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」の仕組み
[画像のクリックで拡大表示]

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

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

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

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

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

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

(まつもと ゆきひろ)

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら