スケールアウトの方法(join)

ROMAのスケールアウトの方法です
サービスが大きくなってきたり、一時的に負荷が上がると予想される時など、instance(サーバ)を追加することでメモリーに保持できるデータ量を増やしたり1instance(サーバ)あたりの負荷を減らすことが出来ます
![help.png](https://qiita-image-store.s3.amazonaws.com/0/103558/fbc60144-7bea-b197-53ec-02dcede8c6fb.png)

# 条件(初期状態)
ruby version : v2.1
ROMA version : v1.2.0
server: 2台 + 1台
storage type : TokyoCabinet

### ROMAの構築方法に関しては以下参照
 - 複数台でクラスターを構成する方法：http://qiita.com/hiroaki-iwase/items/286d768d9161f56f8b81
 - StorageにTokyoCabinetを利用する方法：http://qiita.com/hiroaki-iwase/items/366526ef9fedc3b92bcc


# スケールアウト
## 流れ
現在1instance * 2serverで運用している状態ですが、負荷が上がってきたのでもう1台ROMAサーバをクラスターへ追加することで負荷を分散し、クラスター全体のメモリー量も増加させます

## 構成
### 現在のinstance
- 192.168.33.11_10001
- 192.168.33.12_10001

### 追加するinstance
- <font color='red'><b>192.168.33.13_20001</b></font>

## コマンド
既存のクラスターにinstanceを追加するには、起動コマンドであるromadにjoinオプションをつけて実行します

```bash
$ romad ${address} -p ${port} -j ${target_instance}
```
- ${address} is the ip or hostname of new instance
- ${port} is the port number of new instance
- ${target_instance} is the one of the <font color='red'><b>current instance</b></font> within cluster
  - format is \${address}_${port}


## 手順 
### 1. 現在の構成確認
```bash:192.168.33.11にて
$ telnet 192.168.33.11 10001
> stat node
  stats.run_receive_a_vnode {}
  routing.nodes.length 2
  routing.nodes ["192.168.33.11_10001", "192.168.33.12_10001"]
  .
  .
  .
  END

> stat run_join
  stats.run_join false
```


### 2. join
```bash:192.168.33.13にて
$ romad 192.168.33.13 -p 20001 --config ./config.rb -d -j 192.168.33.11_10001
```
- ${target_instance}は192.168.33.11_10001
- `-d`と`--config`オプションも使用

### 3. 確認
```bash:192.168.33.13にて
$ telnet 192.168.33.13 20001
> stat node
  stats.run_receive_a_vnode {}
  routing.nodes.length 3  #=>2から3へ増えています
  routing.nodes ["192.168.33.11_10001", "192.168.33.12_10001", "192.168.33.13_20001"] #=>192.168.33.13_20001が追加されています
  .
  .
  .
  END

> stat run_join
  stats.run_join true # joinプロセスが起動中だということを表します

> stat primary|secondary
  routing.primary 7
  routing.secondary1 12
```
- joinプロセスが開始すると、既存のinstanceから新しく追加したinstanceへvnodeが徐々に振り分けられていきます
- 現在の担当vnodeは`stat primary|secondary`で確認することが出来ます
- `routing.primary`と`routing.secondary`の数はjoin処理が進むにつれて増えていきます
- joinプロセスが終了すると`stats.run_join`がfalseに戻ります
  - データ量やサーバスペックによってjoinプロセスにかかる時間は変わってきます

### 4. 終了確認
```bash:192.168.33.13にて
> stat run_join
  stats.run_join false

> stat primary|secondary
  routing.primary 170 #=>数は多少前後します
  routing.secondary1 161 #=>数は多少前後します
```

# GUIで確認
## join前
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/30978c7e-dd60-ee1b-7a36-2ffad60afedf.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/08e632e5-f840-fd23-ef62-32b7c437b2b7.png" width="400px">
  </td>
</table>

## join中
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/d34ba0da-3ee1-4c68-fdf8-5e13f3d11774.png)

## join後
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/37b6b672-9a75-c14c-a9af-641f091b2464.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/34d37953-e4a0-ae10-0f2b-30df7629bfc0.png" width="400px">
  </td>
</table>

# 参照URL
ROMA Operation of ROMA(Adding the new ROMA process): http://roma-kvs.org/learn/operation.html#dist-jump-link-adding-title