[AWS] 東京リージョンから米国リージョンへ無停止でROMAを移設してみた

AWSの東京リージョンにあるROMAのクラスターを米国スタンダードリージョンに移設した話

# 条件
## AWS EC2
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/606a7071-ca45-3791-ed72-a23dae030de6.png' width='200px' />  

<table>
	<tbody>
		<tr>
			<td>Model</td>
			<td colspan="2">m3.large</td>
		</tr>
		<tr>
			<td>Memory</td>
			<td colspan="2">7.5GB</td>
		</tr>
		<tr>
			<td>Storage</td>
			<td colspan="2">32GB</td>
		</tr>
		<tr>
			<td>OS</td>
			<td colspan="2">CentOS 6.5</td>
		</tr>
		<tr>
			<td rowspan="2">Asia pacific(Tokyo) region</td>
			<td>ROMA server</td>
			<td>3 server</td>
		</tr>
		<tr>
			<td>Gladiator server</td>
			<td>1 server</td>
		</tr>
		<tr>
			<td>US standard region</td>
			<td>ROMA server</td>
			<td>3 server</td>
		</tr>
	</tbody>
</table>

## ROMA
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/1fdf2b86-322c-f87e-7fc7-9117124ad619.png' width='100px' />  

<table>
	<tbody>
		<tr>
			<td>ROMA version</td>
			<td>v1.2.0</td>
		</tr>
		<tr>
			<td>Ruby version</td>
			<td>v2.1.6</td>
		</tr>
		<tr>
			<td>Storage Type</td>
			<td>Tokyo Cabinet(v1.4.48)</td>
		</tr>
		<tr>
			<td>instance/server</td>
			<td>1</td>
		</tr>
		<tr>
			<td>Redundancy</td>
			<td>2</td>
		</tr>
		<tr>
			<td>Gladiator version</td>
			<td>v1.2.0</td>
		</tr>
	</tbody>
</table>

## Test Data
![tokyocabinet-logo.png](https://qiita-image-store.s3.amazonaws.com/0/103558/038f94d1-3aad-91a4-08af-cac46bfa31ab.png)  

<table>
	<tbody>
		<tr>
			<td>Record counts</td>
			<td>6,000,000 (records)</td>
		</tr>
		<tr>
			<td>Value size</td>
			<td>1024 (bytes)</td>
		</tr>
		<tr>
			<td>Total Data size</td>
			<td>3.3(GB)</td>
		</tr>
	</tbody>
</table>

# 流れ
## 1. 東京リージョンでクラスターつくって・・・
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/2c009c23-717c-8f69-ab74-f8777a5ca982.jpeg' width='400px'/>

## 2. 米国リージョンからinstanceをjoinして・・・
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/a95d6901-2fc2-368e-6eb1-258e972830c7.jpeg' width='400px'/>

## 3. 国をまたいだクラスターが出来たら・・・
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/cb574af1-758c-056d-d9dd-bdfb0957ba66.jpeg' width='400px'/>

## 4. 東京リージョンの方のインスタンスを落としていく
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/0094f10d-0706-8474-5de7-cb7644b9aeaf.jpeg' width='400px'/>

## 5. 完了！
<img src='https://qiita-image-store.s3.amazonaws.com/0/103558/42d95bd4-3d2f-fec7-215c-9e4609ef468b.jpeg' width='400px'/>

# 手順
## 1. snapshotとる(万が一のために)
`$ cpdb #{port}`

## 2. 米国リージョンからインスタンス追加
`$ bin/romad   #{host}   -p   #{port}   -j   #{Japan ROMA instance}`  

<table>
<thead>
<td>Before adding US instances</td>
<td>After adding US instances!
</td>
</thead>
<tbody>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/b4e8fee5-c562-f08f-76c2-38f0f793f0e9.png' width='500px'/></td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/3ae1ce9f-72ef-88f0-6c09-051f5aa1e5de.png' width='500px'/>
</td>
</tbody>
</table>

## 3. 東京リージョンのインスタンスを外していく
単純にインスタンスを落とすと冗長度が落ちてしまうので、`release`コマンドを使用して担当しているvnodesを解放してからインスタンスを落とす

```rb
> release
> shutdown_self
```
releaseとshutdown_self(rbalse)はGUI上からも可能です  

<table>
<thead>
<td>Relese process was ongoing</td>
<td>After removing Japan instances</td>
<td>Routing History List</td>
</thead>
<tbody>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/ca8712c9-82a8-3e03-4791-7ef33e1a18cb.png' width='500px'/></td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/f642cff6-bb0e-ab03-d06b-4b7da6079a15.png' width='500px'/></td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/915861d2-dc74-22d9-5d05-168b6ba23d29.png' width='500px'/></td>
</tbody>
</table>

# 結果
## NO ERROR
- エラーログでなかった
- AWS monitoringの方でも特におかしなとこなかった

## NO DATA LOST
- short_vnodesもlost_vnodesも発生しなかった
  - (冗長度の低下もデータロストも発生しなかった)
- 常にデータの読み書きをフロントから行っていたけどそちらも問題なく行えた(スクリプトは以下を使用)
  - https://github.com/roma/roma/blob/master/lib/roma/tools/consistency_test.rb

## NO High CPU rate
- CPU rateの大部分は15%以下だった
- MAXでも23%だった

## AWS monitoring Glaph
- CPU use ratio  

<table>
<td>Japan</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/f2fddab5-5a9b-d932-017b-fb29f48bdf6d.png' width='400px' /></td>
<td>US</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/40ebfeeb-18b2-e470-bc54-c90cbd1c7d29.png' width='400px' />
</td>
</table>

- I/O Input

<table>
<td>Japan</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/a2b15bcd-d81c-40c9-5e83-620d38e2357a.png' width='400px' /></td>
<td>US</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/1f66b2b3-7d10-18cd-fc90-149e3ae409f7.png' width='400px' /></td>
</table>

- I/O Output

<table>
<td>Japan</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/985ea1b6-5ec0-4c21-4033-36e66d47d355.png' width='400px' /></td>
<td>US</td>
<td><img src='https://qiita-image-store.s3.amazonaws.com/0/103558/015ad321-12fb-1486-08fb-3e7867d32f36.png' width='400px' /></td>
</table>

# Client & Gladiator
今回はクライアントとGladiatorは移設していないので東京リージョンにあるままですが、クライアントもGladiatorもROMAクラスターのrouting情報を定期的にチェックして更新する機能を持っているので、特にアクセス先の変更や再起動等しなくてもそのまま使い続けることが出きます
![aws_overview6.jpg](https://qiita-image-store.s3.amazonaws.com/0/103558/ab40b958-7050-b69c-fb8a-64ecd8da9b16.jpeg)

# 参照URL
ROMA Blog: http://roma-kvs.org/blogs/blog-entry-14.html