ApacheGeodeのクラスタを構築する

### はじめに
[前回の投稿](https://qiita.com/mkatsube0605/items/67dfe84c4a2862a79200)にて、簡単なGeodeの構築をおこないました。
今回は、Geodeでのクラスタを構築します。公式にクラスタ構築の[チュートリアル](https://geode.apache.org/docs/guide/16/configuring/cluster_config/persisting_configurations.html)があるのですが、１サーバないでクラスタを組むという事をやっていたり、色々余計な説明もあるので、実際にサーバを分散させた状態で構築する場合を想定し、最低限の設定で構築する手順を記載していきます。
### 構築のイメージ
サーバーは４台使用したレプリケーション環境を構築します。locatorが２台、serverが２台、これにより、１台落ちたとしても、サービスを継続可能なクラスタとなります。（性能要件を満たせるかは別問題ですが）
<img width="556" alt="スクリーンショット 2018-06-11 13.50.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/248712/9c08239b-4189-b994-eb50-c50f342763be.png">
### Locatorの起動
locatorを起動します。単独起動の時とは違い、クラスタを構成するlocatorのホスト名とportを起動時に指定します。

```
# サーバー01
gfsh>start locator --name=locator1 --locators=xxx01.yahoo.co.jp[10334],xxx02.yahoo.co.jp[10334]
Starting a Geode Locator in /xxxx/geode/locator1...

# サーバー02
gfsh>start locator --name=locator2 --locators=xxx01.yahoo.co.jp[10334],xxx02.yahoo.co.jp[10334]
Starting a Geode Locator in /xxxx/geode/locator...
```
この時、nameはクラスタ内で一意である必要があります。台数の多いクラスタを構築する場合は、サーバ名を指定すると運用はやりやすいと思います。
### Serverの起動
同様にserverを起動していきます。locator起動と同様にlocatorのホスト名とportを指定します。locatorは起動済みである必要があります。

```
# サーバー03
gfsh>start server --name=server1 --locators=xxx01.yahoo.co.jp[10334],xxx02.yahoo.co.jp[10334]
Starting a Geode Server in /xxxx/geode/server1...

# サーバー04
gfsh>start server --name=server2 --locators=xxx01.yahoo.co.jp[10334],xxx02.yahoo.co.jp[10334]
Starting a Geode Server in /xxxx/geode/server2...
```
スケールアウトの際は、serverに関しては、locatorを指定するだけで、クラスタに追加することができます。
また、クライアント側は、serverが追加されたとしても、locatorのみ知っておけばよいため影響を受けません。
### クラスタの確認
サーバー01に戻り、listコマンドでクラスタが構築されたか確認しましょう。

```
# サーバー01
gfsh>list members
  Name   | Id
-------- | ----------------------------------------------------------------
locator2 | xxx.xxx.xxx.xx2(locator2:22489:locator)<ec><v5>:1024
server1  | xxx.xxx.xxx.xx3(server1:17404)<v6>:1024
server2  | xxx.xxx.xxx.xx4(server2:5771)<v7>:1024
locator1 | xxx.xxx.xxx.xx1(locator:12002:locator)<ec><v0>:1024 [Coordinator]
```
### Regionの作成とget,put
regionの作成はlocatorから実行します。

```
# サーバー01
gfsh>create region --name=region1 --type=REPLICATE

gfsh>list region
List of regions
---------------
region1
```
これでクラスタ内にregionが作成されました。
データを入れてみます。

```
# サーバー01
gfsh>put --region=region1 --key=key2 --value=value2
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Old Value   : <NULL>


gfsh>get  --region=region1 --key=key2
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Value       : value2
```
### サーバダウンを試す
では、試しにサーバが落ちてもクラスタが維持できるか見てみましょう。

```
gfsh>stop server --name=server2
```
serverが１台抜けた状態で、クラスタは維持されています。先程の値も取得できることが分かります。

```
gfsh>list members
  Name   | Id
-------- | ----------------------------------------------------------------
locator2 | xxx.xxx.xxx.xx2(locator2:22489:locator)<ec><v5>:1024
server1  | xxx.xxx.xxx.xx3(server1:17404)<v6>:1024
locator1 | xxx.xxx.xxx.xx1(locator1:12002:locator)<ec><v0>:1024 [Coordinator]

gfsh>get  --region=region1 --key=key2
Result      : true
Key Class   : java.lang.String
Key         : key2
Value Class : java.lang.String
Value       : value2
```
### まとめ
最小限のクラスタ構築ができました。
今回は、コマンドラインでクラスタを構築しましたが、実際の開発現場では、規模にもよりますが、デプロイを自動化していたり、オートスケール環境を実装したいケースがあると思います。locatorsや、regionの設定をファイルで配ることも可能です。実際の運用では、メモリ関連の設定や、expire関連、多数のRegionなど多数の設定があるため、コマンドラインで運用するのは非効率になってきます。
次は、データを管理する上で切っても切り離せない、[Regionについて解説](https://qiita.com/mkatsube0605/items/98c40ac6bdd1115250eb)していきます。

### 環境情報
Java1.8
Apache Geode1.6
ヤフー社内のクラウドを使用、OSはLinux