ROMAとは

# ROMAとは
<font color="red"><b>ROMA</b></font>(<font color="red"><b>R</b></font>uby/<font color="red"><b>R</b></font>akuten <font color="red"><b>O</b></font>n-<font color="red"><b>M</b></font>emory <font color="red"><b>A</b></font>rchitecture)とは、RIT(楽天技術研究所)がまつもとゆきひろ氏(matz)と共同開発したRuby製分散型KVS(NOSQL)であり、現在はOSSとして公開されている。
https://github.com/roma/roma
![logo.png](https://qiita-image-store.s3.amazonaws.com/0/103558/7e5d6c0e-b228-2bf6-f57e-434a688562c3.png)



# 特徴
## Pure P2P architecture
- 通信方式にPure P2Pを採用しており、いわゆるmaster/slaveに分かれていないので耐障害性に優れる
- アクセスが集中する時など、任意のタイミングでスケールアウトすることが容易である  
![p2p.png](https://qiita-image-store.s3.amazonaws.com/0/103558/956d03a6-4b08-8638-33a6-141c8fae03aa.png)

## consistent Hashing and Virtual Nodes
- コンシステントハッシュ法とvirtual nodesを用いてデータ分散を行っている  
![consistencth.png](https://qiita-image-store.s3.amazonaws.com/0/103558/704c063c-ccdc-a425-b9f6-bfe84f8a1aad.png)

## Data replication
- 冗長度は通常2で、任意で変更可能
- 複数サーバで構成していて、かつ1サーバ内に複数nodeが立ち上がっている際には他サーバへのデータ振り分けを優先する
- 万一クラスター内のサーバが1台落ちたとしても、データの読み書きを問題なく行うことが出来る

## Auto recovering system
- 障害時に生き残ったサーバ群でデータの再複製を自動で行い冗長性を保つ機能を持つ
![AUTO_RECOVERY.png](https://qiita-image-store.s3.amazonaws.com/0/103558/b363487c-bf8f-e597-9b75-3729a69a9141.png)

## cluster replication system(hot standby)
- 上記のrecovering systemとは別にclusterのreplicationを用意してhot stanby状態で待機させておくことが可能
- 障害時にAPIのアクセス先を切り替えるだけで復旧が可能になる  
![cluster_replication.png](https://qiita-image-store.s3.amazonaws.com/0/103558/7d4a631b-2e17-abd6-66c1-ff60b4e3e22b.png)

## plug-in Architecture
- コマンドや各種機能をplugin化することで本体のコアの処理と切り分けているため、仮にいらない機能があれば外したり、欲しい機能がればRubyのソースを少し書いてプラグインとして読み込むことで簡単に機能を追加することが可能である

## memcached compatible protocol
- 導入や移行のコストを減らすためにmemcachedプロトコルとの互換性を持つ

# multi storage
storageを要件にあわせて選択することが可能
物理ファイルに保存しておくことも、memcachedのようにメモリのみを選択することも可能
![storage.png](https://qiita-image-store.s3.amazonaws.com/0/103558/69a63e50-0a8e-8637-525f-fc8183ceed24.png)

# データタイプ
ROMAは分類的にはP2P型のKVSとなります
<table class="confluenceTable"><tbody><tr><th rowspan="2" class="confluenceTh">&nbsp;</th><th rowspan="2" class="confluenceTh">マスタ型</th><th rowspan="2" class="confluenceTh">P2P型</th><th colspan="2" class="confluenceTh">イネーブラ型</th></tr><tr><th colspan="1" class="confluenceTh">オンメモリタイプ</th><th colspan="1" class="confluenceTh">オンディスクタイプ</th></tr><tr><th class="confluenceTh">KVS型</th><td class="confluenceTd">Hibari</td><td class="confluenceTd">Dynamo<br>Voldemort<br>Riak<br><font color='red'><b>ROMA</b></font></td><td class="confluenceTd"><p>Memcashed<br>Redis<br><span style="font-size: 14.0px;line-height: 1.4285715;">Scalaris&nbsp;</span></p></td><td class="confluenceTd">TokyoCabinet/<br>Tyrant&nbsp;</td></tr><tr><th class="confluenceTh">カラム型</th><td class="confluenceTd">Bigtable<br>HBase<br>HyperTable</td><td class="confluenceTd">Cassandra</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td></tr><tr><th class="confluenceTh">グラフ型</th><td class="confluenceTd">Neo4j</td><td class="confluenceTd">InfiniteGraph</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td></tr><tr><th class="confluenceTh">ドキュメント型</th><td class="confluenceTd">MongoDB<br>CouchDB&nbsp;</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td><td class="highlight-grey confluenceTd" data-highlight-colour="grey">&nbsp;</td></tr></tbody></table>

# その他の関連Tool
mainのUnitとは別に各種クライアントやGUI toolを持つ
![gla1.png](https://qiita-image-store.s3.amazonaws.com/0/103558/7e9fd044-bae6-abc1-2e36-064f823fb9b3.png)

# 関連URL
HP : http://roma-kvs.org/
Github : https://github.com/roma