ROMAのリファレンス
構造
ROMAの概要
ROMAは楽天のオンメモリ構造を代表する、分散キーバリューストアのためのデータシステムの一つで、Rubyで実装されています。ROMAは複数のサーバ上で複数のプロセスからなり、一つの大きなサイズのデータストアを作成します。ROMAを使って大容量のデータに素早くアクセスすることができます。
耐障害性
ROMAは純粋なP2Pアーキテクチャーを採用しています。そのため、耐障害性について抜きん出ています。
- ROMAに格納されているデータが失われることはありえないでしょう。
- ROMAは複数のマシーンからなり、ネットワーク内のデータを自動的にそれらのマシーンにリプリケートします。
- もし一つのマシーンが壊れたとしても、この壊れたマシーンに格納されていたデータは他のマシーンの中に存在します。ROMAはデータの損失を予防します。なぜなら、ROMAは他のマシーンでリプリケートされたデータを自動的に参照するからです。
動的なデータストアサイズの増加
ROMAは自動的に(MOMAを止めること無しに)他のマシーンを追加あるいは省くことができます。
- ROMAのオペレータはデータストアのサイズ増加のために現在のROMAの中に新しいマシーンを追加することができます。
- ROMAへの新しいマシーンのパーティションは簡単に行うことができます。
Memcached 互換プロトコル
ROMA オペレータまたはアプリケーション開発者はmemcached互換のプロトコルを使ってROMAと通信を行うことができます。
- ROMA オペレータはROMAクラスタとtelnetを使って通信を行い、ROMAクラスタの状態をチェックすることができます。
- ROMA アプリケーションエンジニアは現在使っているmemcachedクライアントを使ってROMAからデータを取得あるいは配置することができます。
memcachedクライアントとROMAクライアント
下の図はユーザがクライアントを使ってROMAにアクセスする通信メソッドです。T
- Memcached クライアント
memcachedクライアントがあるキーの値を取得したい時、- クライアントはROMAを構成するノードと呼ばれる任意のプロセスにアクセスすることができます。
- coordinatorと呼ばれるノードは実際に値を持つノードの任意の要求によってアクセスされます。
- 値を持つノードはデータを取得し、そのデータをクライアントに返します。
- ROMA クライアント
- ROMA クライアントはあらかじめROMAを構成するノードのリストを取得します。
- ROMA クライアントは実際に値を持つノードにアクセスします。
- 値を持つノードはデータを取得し、そのデータをクライアントに返します。
- memcachedクライアント使う場合
-
一つ以上のホップがしなければならないため、より長く掛かるでしょう。
期待するデータを取得するためにクライアントが任意のノードに要求することを意味します。 - memcachedクライアントは耐障害性について考慮して実装されていません。必要であれば、アプリケーション開発者がこの機能を実装する必要があります。
ROMAクライアントの場合は、トラブルが起こるとROMAクライアントはこのトラブルを知ることができます。つまり、アプリケーション開発者はROMAのトラブルについて考慮する必要がありません。
プラグイン構造
- ROMAは機能の拡張のために、プラグイン構造を持っています。プラグインを準備することでソースコードを変更することなしにROMAを拡張することができます。
- ROMAはストレージオプションを変更することができます。
- ROMAはストレージシステムをRubyから他へ変更することができます。
- アプリケーションによってパフォーマンスや信頼性の要求が雄異なるため、
目的のアプリケーションに適合するストレージシステムを選択および変更することをお勧めします。
- 例えば、もし信頼性ではなくアクセススピードに重きを置く場合には、ROMAストレージとしてRubyハッシュを選択すべきです。
一方で、信頼性と大量の格納に重きを置く場合、ROMAストレージとして通常のDBMSを設定した方が良いでしょう。 - これらのストレージオプションはconfig.rbによって設定することができます。
ROMA の構造
純粋な P2P
ROMA は複数のサーバの中で動作するROMAプロセスからできています。それぞれのプロセスは純粋なP2Pモデルのネットワークを使って協調して動作します。P2Pの恩恵は、属するプロセスが自発的にネットワークを覆いを構築することです。"自発的"とはネットワーク内の複数のプロセスが新しいプロセスの参加または退出を理解および管理できることを意味します。ROMAはこのネットワーク上にハッシュテーブルを構築します。
P2Pモデルを使っているため、ROMAは単一のサーバあるいは中枢となるインデックスサーバを必要としません。従って、一つのプロセスまたはマシーンがクラッシュしたとしても、ROMAは壊れたサーバをネットワークから切り離し、データを引き継ぎます。. そして、ROMAはクライアントが一つのサーバに群がることを防ぎます。
首尾一貫したハッシュと仮想ノード
ROMA は複数のサーバのROMAプロセスを理論上は一次元のリングハッシュ空間に配置します。従って、ROMAはROMAプロセスの参加あるいは退会を簡単に行うことができます。
ROMAプロセスは"仮想ノード"と呼ばれる複数のデータ領域を持ちます。一つのROMAプロセスは細分化されたデータ領域を持つため、ROMAはROMAプロセスを管理することができます。更に、ROMAはこれらのデータの偏りを減らすことができます。
データのリプリケーション
耐障害性を高めるために、ROMAは複数のサーバにデータのレプリカを設定します。これにより、もし一つのサーバが停止しても、サービスはデータの消失によるシャットダウンを避けることができます。
ROMAはあるタイミングで一つのサーバが故障したことを理解でき、このサーバを切り離すことができます。そして、ROMAはこのサーバに格納されているデータへのクライアントのアクセスを自動的に引き継ぎます。
結果的な一貫性 (レプリカ 同期)
ROMAがデータのレプリカ間でデータの一貫性を保証することはとても難しいです。分散システムでは、厳密な意味でデータの一貫性を保証することは不可能です。ROMAはデータのレプリカの中でのデータの一貫性を定期的に保とうとします。